diff --git a/session/.gitignore b/app/.gitignore similarity index 100% rename from session/.gitignore rename to app/.gitignore diff --git a/session/build.gradle b/app/build.gradle similarity index 100% rename from session/build.gradle rename to app/build.gradle diff --git a/session/google-services.json b/app/google-services.json similarity index 100% rename from session/google-services.json rename to app/google-services.json diff --git a/session/ic_launcher-web.png b/app/ic_launcher-web.png similarity index 100% rename from session/ic_launcher-web.png rename to app/ic_launcher-web.png diff --git a/session/lint-baseline.xml b/app/lint-baseline.xml similarity index 100% rename from session/lint-baseline.xml rename to app/lint-baseline.xml diff --git a/session/lint.xml b/app/lint.xml similarity index 100% rename from session/lint.xml rename to app/lint.xml diff --git a/session/proguard/proguard-appcompat-v7.pro b/app/proguard/proguard-appcompat-v7.pro similarity index 100% rename from session/proguard/proguard-appcompat-v7.pro rename to app/proguard/proguard-appcompat-v7.pro diff --git a/session/proguard/proguard-automation.pro b/app/proguard/proguard-automation.pro similarity index 100% rename from session/proguard/proguard-automation.pro rename to app/proguard/proguard-automation.pro diff --git a/session/proguard/proguard-dagger.pro b/app/proguard/proguard-dagger.pro similarity index 100% rename from session/proguard/proguard-dagger.pro rename to app/proguard/proguard-dagger.pro diff --git a/session/proguard/proguard-ez-vcard.pro b/app/proguard/proguard-ez-vcard.pro similarity index 100% rename from session/proguard/proguard-ez-vcard.pro rename to app/proguard/proguard-ez-vcard.pro diff --git a/session/proguard/proguard-glide.pro b/app/proguard/proguard-glide.pro similarity index 100% rename from session/proguard/proguard-glide.pro rename to app/proguard/proguard-glide.pro diff --git a/session/proguard/proguard-jackson.pro b/app/proguard/proguard-jackson.pro similarity index 100% rename from session/proguard/proguard-jackson.pro rename to app/proguard/proguard-jackson.pro diff --git a/session/proguard/proguard-jna.pro b/app/proguard/proguard-jna.pro similarity index 100% rename from session/proguard/proguard-jna.pro rename to app/proguard/proguard-jna.pro diff --git a/session/proguard/proguard-klinker.pro b/app/proguard/proguard-klinker.pro similarity index 100% rename from session/proguard/proguard-klinker.pro rename to app/proguard/proguard-klinker.pro diff --git a/session/proguard/proguard-okhttp.pro b/app/proguard/proguard-okhttp.pro similarity index 100% rename from session/proguard/proguard-okhttp.pro rename to app/proguard/proguard-okhttp.pro diff --git a/session/proguard/proguard-retrofit.pro b/app/proguard/proguard-retrofit.pro similarity index 100% rename from session/proguard/proguard-retrofit.pro rename to app/proguard/proguard-retrofit.pro diff --git a/session/proguard/proguard-retrolambda.pro b/app/proguard/proguard-retrolambda.pro similarity index 100% rename from session/proguard/proguard-retrolambda.pro rename to app/proguard/proguard-retrolambda.pro diff --git a/session/proguard/proguard-rounded-image-view.pro b/app/proguard/proguard-rounded-image-view.pro similarity index 100% rename from session/proguard/proguard-rounded-image-view.pro rename to app/proguard/proguard-rounded-image-view.pro diff --git a/session/proguard/proguard-shortcutbadger.pro b/app/proguard/proguard-shortcutbadger.pro similarity index 100% rename from session/proguard/proguard-shortcutbadger.pro rename to app/proguard/proguard-shortcutbadger.pro diff --git a/session/proguard/proguard-sqlite.pro b/app/proguard/proguard-sqlite.pro similarity index 100% rename from session/proguard/proguard-sqlite.pro rename to app/proguard/proguard-sqlite.pro diff --git a/session/proguard/proguard-square-okhttp.pro b/app/proguard/proguard-square-okhttp.pro similarity index 100% rename from session/proguard/proguard-square-okhttp.pro rename to app/proguard/proguard-square-okhttp.pro diff --git a/session/proguard/proguard-square-okio.pro b/app/proguard/proguard-square-okio.pro similarity index 100% rename from session/proguard/proguard-square-okio.pro rename to app/proguard/proguard-square-okio.pro diff --git a/session/proguard/proguard-webrtc.pro b/app/proguard/proguard-webrtc.pro similarity index 100% rename from session/proguard/proguard-webrtc.pro rename to app/proguard/proguard-webrtc.pro diff --git a/session/proguard/proguard.pro b/app/proguard/proguard.pro similarity index 100% rename from session/proguard/proguard.pro rename to app/proguard/proguard.pro diff --git a/session/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml similarity index 100% rename from session/src/main/AndroidManifest.xml rename to app/src/main/AndroidManifest.xml diff --git a/session/src/main/assets/csv/geolite2_country_blocks_ipv4.csv b/app/src/main/assets/csv/geolite2_country_blocks_ipv4.csv similarity index 100% rename from session/src/main/assets/csv/geolite2_country_blocks_ipv4.csv rename to app/src/main/assets/csv/geolite2_country_blocks_ipv4.csv diff --git a/session/src/main/assets/csv/geolite2_country_locations_english.csv b/app/src/main/assets/csv/geolite2_country_locations_english.csv similarity index 100% rename from session/src/main/assets/csv/geolite2_country_locations_english.csv rename to app/src/main/assets/csv/geolite2_country_locations_english.csv diff --git a/session/src/main/assets/databases/apns.db b/app/src/main/assets/databases/apns.db similarity index 100% rename from session/src/main/assets/databases/apns.db rename to app/src/main/assets/databases/apns.db diff --git a/session/src/main/assets/emoji/Activity.png b/app/src/main/assets/emoji/Activity.png similarity index 100% rename from session/src/main/assets/emoji/Activity.png rename to app/src/main/assets/emoji/Activity.png diff --git a/session/src/main/assets/emoji/Flags.png b/app/src/main/assets/emoji/Flags.png similarity index 100% rename from session/src/main/assets/emoji/Flags.png rename to app/src/main/assets/emoji/Flags.png diff --git a/session/src/main/assets/emoji/Foods.png b/app/src/main/assets/emoji/Foods.png similarity index 100% rename from session/src/main/assets/emoji/Foods.png rename to app/src/main/assets/emoji/Foods.png diff --git a/session/src/main/assets/emoji/Nature.png b/app/src/main/assets/emoji/Nature.png similarity index 100% rename from session/src/main/assets/emoji/Nature.png rename to app/src/main/assets/emoji/Nature.png diff --git a/session/src/main/assets/emoji/Objects.png b/app/src/main/assets/emoji/Objects.png similarity index 100% rename from session/src/main/assets/emoji/Objects.png rename to app/src/main/assets/emoji/Objects.png diff --git a/session/src/main/assets/emoji/People_0.png b/app/src/main/assets/emoji/People_0.png similarity index 100% rename from session/src/main/assets/emoji/People_0.png rename to app/src/main/assets/emoji/People_0.png diff --git a/session/src/main/assets/emoji/People_1.png b/app/src/main/assets/emoji/People_1.png similarity index 100% rename from session/src/main/assets/emoji/People_1.png rename to app/src/main/assets/emoji/People_1.png diff --git a/session/src/main/assets/emoji/People_2.png b/app/src/main/assets/emoji/People_2.png similarity index 100% rename from session/src/main/assets/emoji/People_2.png rename to app/src/main/assets/emoji/People_2.png diff --git a/session/src/main/assets/emoji/People_3.png b/app/src/main/assets/emoji/People_3.png similarity index 100% rename from session/src/main/assets/emoji/People_3.png rename to app/src/main/assets/emoji/People_3.png diff --git a/session/src/main/assets/emoji/Places.png b/app/src/main/assets/emoji/Places.png similarity index 100% rename from session/src/main/assets/emoji/Places.png rename to app/src/main/assets/emoji/Places.png diff --git a/session/src/main/assets/emoji/Symbols.png b/app/src/main/assets/emoji/Symbols.png similarity index 100% rename from session/src/main/assets/emoji/Symbols.png rename to app/src/main/assets/emoji/Symbols.png diff --git a/session/src/main/assets/fonts/Roboto-Light.ttf b/app/src/main/assets/fonts/Roboto-Light.ttf similarity index 100% rename from session/src/main/assets/fonts/Roboto-Light.ttf rename to app/src/main/assets/fonts/Roboto-Light.ttf diff --git a/session/src/main/assets/mnemonic/english.txt b/app/src/main/assets/mnemonic/english.txt similarity index 100% rename from session/src/main/assets/mnemonic/english.txt rename to app/src/main/assets/mnemonic/english.txt diff --git a/session/src/main/assets/mnemonic/japanese.txt b/app/src/main/assets/mnemonic/japanese.txt similarity index 100% rename from session/src/main/assets/mnemonic/japanese.txt rename to app/src/main/assets/mnemonic/japanese.txt diff --git a/session/src/main/assets/mnemonic/portuguese.txt b/app/src/main/assets/mnemonic/portuguese.txt similarity index 100% rename from session/src/main/assets/mnemonic/portuguese.txt rename to app/src/main/assets/mnemonic/portuguese.txt diff --git a/session/src/main/assets/mnemonic/spanish.txt b/app/src/main/assets/mnemonic/spanish.txt similarity index 100% rename from session/src/main/assets/mnemonic/spanish.txt rename to app/src/main/assets/mnemonic/spanish.txt diff --git a/session/src/main/assets/stickers/animals/anteater.png b/app/src/main/assets/stickers/animals/anteater.png similarity index 100% rename from session/src/main/assets/stickers/animals/anteater.png rename to app/src/main/assets/stickers/animals/anteater.png diff --git a/session/src/main/assets/stickers/animals/bat.png b/app/src/main/assets/stickers/animals/bat.png similarity index 100% rename from session/src/main/assets/stickers/animals/bat.png rename to app/src/main/assets/stickers/animals/bat.png diff --git a/session/src/main/assets/stickers/animals/beetle.png b/app/src/main/assets/stickers/animals/beetle.png similarity index 100% rename from session/src/main/assets/stickers/animals/beetle.png rename to app/src/main/assets/stickers/animals/beetle.png diff --git a/session/src/main/assets/stickers/animals/bulldog.png b/app/src/main/assets/stickers/animals/bulldog.png similarity index 100% rename from session/src/main/assets/stickers/animals/bulldog.png rename to app/src/main/assets/stickers/animals/bulldog.png diff --git a/session/src/main/assets/stickers/animals/butterfly.png b/app/src/main/assets/stickers/animals/butterfly.png similarity index 100% rename from session/src/main/assets/stickers/animals/butterfly.png rename to app/src/main/assets/stickers/animals/butterfly.png diff --git a/session/src/main/assets/stickers/animals/camel.png b/app/src/main/assets/stickers/animals/camel.png similarity index 100% rename from session/src/main/assets/stickers/animals/camel.png rename to app/src/main/assets/stickers/animals/camel.png diff --git a/session/src/main/assets/stickers/animals/cat.png b/app/src/main/assets/stickers/animals/cat.png similarity index 100% rename from session/src/main/assets/stickers/animals/cat.png rename to app/src/main/assets/stickers/animals/cat.png diff --git a/session/src/main/assets/stickers/animals/chameleon.png b/app/src/main/assets/stickers/animals/chameleon.png similarity index 100% rename from session/src/main/assets/stickers/animals/chameleon.png rename to app/src/main/assets/stickers/animals/chameleon.png diff --git a/session/src/main/assets/stickers/animals/clown-fish.png b/app/src/main/assets/stickers/animals/clown-fish.png similarity index 100% rename from session/src/main/assets/stickers/animals/clown-fish.png rename to app/src/main/assets/stickers/animals/clown-fish.png diff --git a/session/src/main/assets/stickers/animals/cobra.png b/app/src/main/assets/stickers/animals/cobra.png similarity index 100% rename from session/src/main/assets/stickers/animals/cobra.png rename to app/src/main/assets/stickers/animals/cobra.png diff --git a/session/src/main/assets/stickers/animals/cow.png b/app/src/main/assets/stickers/animals/cow.png similarity index 100% rename from session/src/main/assets/stickers/animals/cow.png rename to app/src/main/assets/stickers/animals/cow.png diff --git a/session/src/main/assets/stickers/animals/crab.png b/app/src/main/assets/stickers/animals/crab.png similarity index 100% rename from session/src/main/assets/stickers/animals/crab.png rename to app/src/main/assets/stickers/animals/crab.png diff --git a/session/src/main/assets/stickers/animals/crocodile.png b/app/src/main/assets/stickers/animals/crocodile.png similarity index 100% rename from session/src/main/assets/stickers/animals/crocodile.png rename to app/src/main/assets/stickers/animals/crocodile.png diff --git a/session/src/main/assets/stickers/animals/duck.png b/app/src/main/assets/stickers/animals/duck.png similarity index 100% rename from session/src/main/assets/stickers/animals/duck.png rename to app/src/main/assets/stickers/animals/duck.png diff --git a/session/src/main/assets/stickers/animals/elephant.png b/app/src/main/assets/stickers/animals/elephant.png similarity index 100% rename from session/src/main/assets/stickers/animals/elephant.png rename to app/src/main/assets/stickers/animals/elephant.png diff --git a/session/src/main/assets/stickers/animals/frog.png b/app/src/main/assets/stickers/animals/frog.png similarity index 100% rename from session/src/main/assets/stickers/animals/frog.png rename to app/src/main/assets/stickers/animals/frog.png diff --git a/session/src/main/assets/stickers/animals/giraffe.png b/app/src/main/assets/stickers/animals/giraffe.png similarity index 100% rename from session/src/main/assets/stickers/animals/giraffe.png rename to app/src/main/assets/stickers/animals/giraffe.png diff --git a/session/src/main/assets/stickers/animals/hen.png b/app/src/main/assets/stickers/animals/hen.png similarity index 100% rename from session/src/main/assets/stickers/animals/hen.png rename to app/src/main/assets/stickers/animals/hen.png diff --git a/session/src/main/assets/stickers/animals/hippopotamus.png b/app/src/main/assets/stickers/animals/hippopotamus.png similarity index 100% rename from session/src/main/assets/stickers/animals/hippopotamus.png rename to app/src/main/assets/stickers/animals/hippopotamus.png diff --git a/session/src/main/assets/stickers/animals/kangaroo.png b/app/src/main/assets/stickers/animals/kangaroo.png similarity index 100% rename from session/src/main/assets/stickers/animals/kangaroo.png rename to app/src/main/assets/stickers/animals/kangaroo.png diff --git a/session/src/main/assets/stickers/animals/lion.png b/app/src/main/assets/stickers/animals/lion.png similarity index 100% rename from session/src/main/assets/stickers/animals/lion.png rename to app/src/main/assets/stickers/animals/lion.png diff --git a/session/src/main/assets/stickers/animals/llama.png b/app/src/main/assets/stickers/animals/llama.png similarity index 100% rename from session/src/main/assets/stickers/animals/llama.png rename to app/src/main/assets/stickers/animals/llama.png diff --git a/session/src/main/assets/stickers/animals/macaw.png b/app/src/main/assets/stickers/animals/macaw.png similarity index 100% rename from session/src/main/assets/stickers/animals/macaw.png rename to app/src/main/assets/stickers/animals/macaw.png diff --git a/session/src/main/assets/stickers/animals/monkey.png b/app/src/main/assets/stickers/animals/monkey.png similarity index 100% rename from session/src/main/assets/stickers/animals/monkey.png rename to app/src/main/assets/stickers/animals/monkey.png diff --git a/session/src/main/assets/stickers/animals/moose.png b/app/src/main/assets/stickers/animals/moose.png similarity index 100% rename from session/src/main/assets/stickers/animals/moose.png rename to app/src/main/assets/stickers/animals/moose.png diff --git a/session/src/main/assets/stickers/animals/mouse.png b/app/src/main/assets/stickers/animals/mouse.png similarity index 100% rename from session/src/main/assets/stickers/animals/mouse.png rename to app/src/main/assets/stickers/animals/mouse.png diff --git a/session/src/main/assets/stickers/animals/octopus.png b/app/src/main/assets/stickers/animals/octopus.png similarity index 100% rename from session/src/main/assets/stickers/animals/octopus.png rename to app/src/main/assets/stickers/animals/octopus.png diff --git a/session/src/main/assets/stickers/animals/ostrich.png b/app/src/main/assets/stickers/animals/ostrich.png similarity index 100% rename from session/src/main/assets/stickers/animals/ostrich.png rename to app/src/main/assets/stickers/animals/ostrich.png diff --git a/session/src/main/assets/stickers/animals/owl.png b/app/src/main/assets/stickers/animals/owl.png similarity index 100% rename from session/src/main/assets/stickers/animals/owl.png rename to app/src/main/assets/stickers/animals/owl.png diff --git a/session/src/main/assets/stickers/animals/panda.png b/app/src/main/assets/stickers/animals/panda.png similarity index 100% rename from session/src/main/assets/stickers/animals/panda.png rename to app/src/main/assets/stickers/animals/panda.png diff --git a/session/src/main/assets/stickers/animals/pelican.png b/app/src/main/assets/stickers/animals/pelican.png similarity index 100% rename from session/src/main/assets/stickers/animals/pelican.png rename to app/src/main/assets/stickers/animals/pelican.png diff --git a/session/src/main/assets/stickers/animals/penguin.png b/app/src/main/assets/stickers/animals/penguin.png similarity index 100% rename from session/src/main/assets/stickers/animals/penguin.png rename to app/src/main/assets/stickers/animals/penguin.png diff --git a/session/src/main/assets/stickers/animals/pig.png b/app/src/main/assets/stickers/animals/pig.png similarity index 100% rename from session/src/main/assets/stickers/animals/pig.png rename to app/src/main/assets/stickers/animals/pig.png diff --git a/session/src/main/assets/stickers/animals/rabbit.png b/app/src/main/assets/stickers/animals/rabbit.png similarity index 100% rename from session/src/main/assets/stickers/animals/rabbit.png rename to app/src/main/assets/stickers/animals/rabbit.png diff --git a/session/src/main/assets/stickers/animals/racoon.png b/app/src/main/assets/stickers/animals/racoon.png similarity index 100% rename from session/src/main/assets/stickers/animals/racoon.png rename to app/src/main/assets/stickers/animals/racoon.png diff --git a/session/src/main/assets/stickers/animals/ray.png b/app/src/main/assets/stickers/animals/ray.png similarity index 100% rename from session/src/main/assets/stickers/animals/ray.png rename to app/src/main/assets/stickers/animals/ray.png diff --git a/session/src/main/assets/stickers/animals/rhinoceros.png b/app/src/main/assets/stickers/animals/rhinoceros.png similarity index 100% rename from session/src/main/assets/stickers/animals/rhinoceros.png rename to app/src/main/assets/stickers/animals/rhinoceros.png diff --git a/session/src/main/assets/stickers/animals/sea-cow.png b/app/src/main/assets/stickers/animals/sea-cow.png similarity index 100% rename from session/src/main/assets/stickers/animals/sea-cow.png rename to app/src/main/assets/stickers/animals/sea-cow.png diff --git a/session/src/main/assets/stickers/animals/shark.png b/app/src/main/assets/stickers/animals/shark.png similarity index 100% rename from session/src/main/assets/stickers/animals/shark.png rename to app/src/main/assets/stickers/animals/shark.png diff --git a/session/src/main/assets/stickers/animals/sheep.png b/app/src/main/assets/stickers/animals/sheep.png similarity index 100% rename from session/src/main/assets/stickers/animals/sheep.png rename to app/src/main/assets/stickers/animals/sheep.png diff --git a/session/src/main/assets/stickers/animals/siberian-husky.png b/app/src/main/assets/stickers/animals/siberian-husky.png similarity index 100% rename from session/src/main/assets/stickers/animals/siberian-husky.png rename to app/src/main/assets/stickers/animals/siberian-husky.png diff --git a/session/src/main/assets/stickers/animals/sloth.png b/app/src/main/assets/stickers/animals/sloth.png similarity index 100% rename from session/src/main/assets/stickers/animals/sloth.png rename to app/src/main/assets/stickers/animals/sloth.png diff --git a/session/src/main/assets/stickers/animals/snake.png b/app/src/main/assets/stickers/animals/snake.png similarity index 100% rename from session/src/main/assets/stickers/animals/snake.png rename to app/src/main/assets/stickers/animals/snake.png diff --git a/session/src/main/assets/stickers/animals/spider.png b/app/src/main/assets/stickers/animals/spider.png similarity index 100% rename from session/src/main/assets/stickers/animals/spider.png rename to app/src/main/assets/stickers/animals/spider.png diff --git a/session/src/main/assets/stickers/animals/squirrel.png b/app/src/main/assets/stickers/animals/squirrel.png similarity index 100% rename from session/src/main/assets/stickers/animals/squirrel.png rename to app/src/main/assets/stickers/animals/squirrel.png diff --git a/session/src/main/assets/stickers/animals/swan.png b/app/src/main/assets/stickers/animals/swan.png similarity index 100% rename from session/src/main/assets/stickers/animals/swan.png rename to app/src/main/assets/stickers/animals/swan.png diff --git a/session/src/main/assets/stickers/animals/tiger.png b/app/src/main/assets/stickers/animals/tiger.png similarity index 100% rename from session/src/main/assets/stickers/animals/tiger.png rename to app/src/main/assets/stickers/animals/tiger.png diff --git a/session/src/main/assets/stickers/animals/toucan.png b/app/src/main/assets/stickers/animals/toucan.png similarity index 100% rename from session/src/main/assets/stickers/animals/toucan.png rename to app/src/main/assets/stickers/animals/toucan.png diff --git a/session/src/main/assets/stickers/animals/turtle.png b/app/src/main/assets/stickers/animals/turtle.png similarity index 100% rename from session/src/main/assets/stickers/animals/turtle.png rename to app/src/main/assets/stickers/animals/turtle.png diff --git a/session/src/main/assets/stickers/animals/whale.png b/app/src/main/assets/stickers/animals/whale.png similarity index 100% rename from session/src/main/assets/stickers/animals/whale.png rename to app/src/main/assets/stickers/animals/whale.png diff --git a/session/src/main/assets/stickers/clothes/backpack.png b/app/src/main/assets/stickers/clothes/backpack.png similarity index 100% rename from session/src/main/assets/stickers/clothes/backpack.png rename to app/src/main/assets/stickers/clothes/backpack.png diff --git a/session/src/main/assets/stickers/clothes/bathrobe.png b/app/src/main/assets/stickers/clothes/bathrobe.png similarity index 100% rename from session/src/main/assets/stickers/clothes/bathrobe.png rename to app/src/main/assets/stickers/clothes/bathrobe.png diff --git a/session/src/main/assets/stickers/clothes/belt.png b/app/src/main/assets/stickers/clothes/belt.png similarity index 100% rename from session/src/main/assets/stickers/clothes/belt.png rename to app/src/main/assets/stickers/clothes/belt.png diff --git a/session/src/main/assets/stickers/clothes/boot.png b/app/src/main/assets/stickers/clothes/boot.png similarity index 100% rename from session/src/main/assets/stickers/clothes/boot.png rename to app/src/main/assets/stickers/clothes/boot.png diff --git a/session/src/main/assets/stickers/clothes/bow-tie.png b/app/src/main/assets/stickers/clothes/bow-tie.png similarity index 100% rename from session/src/main/assets/stickers/clothes/bow-tie.png rename to app/src/main/assets/stickers/clothes/bow-tie.png diff --git a/session/src/main/assets/stickers/clothes/bowler-hat.png b/app/src/main/assets/stickers/clothes/bowler-hat.png similarity index 100% rename from session/src/main/assets/stickers/clothes/bowler-hat.png rename to app/src/main/assets/stickers/clothes/bowler-hat.png diff --git a/session/src/main/assets/stickers/clothes/boxers.png b/app/src/main/assets/stickers/clothes/boxers.png similarity index 100% rename from session/src/main/assets/stickers/clothes/boxers.png rename to app/src/main/assets/stickers/clothes/boxers.png diff --git a/session/src/main/assets/stickers/clothes/bra.png b/app/src/main/assets/stickers/clothes/bra.png similarity index 100% rename from session/src/main/assets/stickers/clothes/bra.png rename to app/src/main/assets/stickers/clothes/bra.png diff --git a/session/src/main/assets/stickers/clothes/cap.png b/app/src/main/assets/stickers/clothes/cap.png similarity index 100% rename from session/src/main/assets/stickers/clothes/cap.png rename to app/src/main/assets/stickers/clothes/cap.png diff --git a/session/src/main/assets/stickers/clothes/dress-1.png b/app/src/main/assets/stickers/clothes/dress-1.png similarity index 100% rename from session/src/main/assets/stickers/clothes/dress-1.png rename to app/src/main/assets/stickers/clothes/dress-1.png diff --git a/session/src/main/assets/stickers/clothes/dress-2.png b/app/src/main/assets/stickers/clothes/dress-2.png similarity index 100% rename from session/src/main/assets/stickers/clothes/dress-2.png rename to app/src/main/assets/stickers/clothes/dress-2.png diff --git a/session/src/main/assets/stickers/clothes/dress-3.png b/app/src/main/assets/stickers/clothes/dress-3.png similarity index 100% rename from session/src/main/assets/stickers/clothes/dress-3.png rename to app/src/main/assets/stickers/clothes/dress-3.png diff --git a/session/src/main/assets/stickers/clothes/dress.png b/app/src/main/assets/stickers/clothes/dress.png similarity index 100% rename from session/src/main/assets/stickers/clothes/dress.png rename to app/src/main/assets/stickers/clothes/dress.png diff --git a/session/src/main/assets/stickers/clothes/glasses.png b/app/src/main/assets/stickers/clothes/glasses.png similarity index 100% rename from session/src/main/assets/stickers/clothes/glasses.png rename to app/src/main/assets/stickers/clothes/glasses.png diff --git a/session/src/main/assets/stickers/clothes/hat.png b/app/src/main/assets/stickers/clothes/hat.png similarity index 100% rename from session/src/main/assets/stickers/clothes/hat.png rename to app/src/main/assets/stickers/clothes/hat.png diff --git a/session/src/main/assets/stickers/clothes/high-heel.png b/app/src/main/assets/stickers/clothes/high-heel.png similarity index 100% rename from session/src/main/assets/stickers/clothes/high-heel.png rename to app/src/main/assets/stickers/clothes/high-heel.png diff --git a/session/src/main/assets/stickers/clothes/jacket-1.png b/app/src/main/assets/stickers/clothes/jacket-1.png similarity index 100% rename from session/src/main/assets/stickers/clothes/jacket-1.png rename to app/src/main/assets/stickers/clothes/jacket-1.png diff --git a/session/src/main/assets/stickers/clothes/jacket-2.png b/app/src/main/assets/stickers/clothes/jacket-2.png similarity index 100% rename from session/src/main/assets/stickers/clothes/jacket-2.png rename to app/src/main/assets/stickers/clothes/jacket-2.png diff --git a/session/src/main/assets/stickers/clothes/jacket-3.png b/app/src/main/assets/stickers/clothes/jacket-3.png similarity index 100% rename from session/src/main/assets/stickers/clothes/jacket-3.png rename to app/src/main/assets/stickers/clothes/jacket-3.png diff --git a/session/src/main/assets/stickers/clothes/jacket-4.png b/app/src/main/assets/stickers/clothes/jacket-4.png similarity index 100% rename from session/src/main/assets/stickers/clothes/jacket-4.png rename to app/src/main/assets/stickers/clothes/jacket-4.png diff --git a/session/src/main/assets/stickers/clothes/jacket.png b/app/src/main/assets/stickers/clothes/jacket.png similarity index 100% rename from session/src/main/assets/stickers/clothes/jacket.png rename to app/src/main/assets/stickers/clothes/jacket.png diff --git a/session/src/main/assets/stickers/clothes/jeans.png b/app/src/main/assets/stickers/clothes/jeans.png similarity index 100% rename from session/src/main/assets/stickers/clothes/jeans.png rename to app/src/main/assets/stickers/clothes/jeans.png diff --git a/session/src/main/assets/stickers/clothes/lingerie.png b/app/src/main/assets/stickers/clothes/lingerie.png similarity index 100% rename from session/src/main/assets/stickers/clothes/lingerie.png rename to app/src/main/assets/stickers/clothes/lingerie.png diff --git a/session/src/main/assets/stickers/clothes/overall.png b/app/src/main/assets/stickers/clothes/overall.png similarity index 100% rename from session/src/main/assets/stickers/clothes/overall.png rename to app/src/main/assets/stickers/clothes/overall.png diff --git a/session/src/main/assets/stickers/clothes/polo.png b/app/src/main/assets/stickers/clothes/polo.png similarity index 100% rename from session/src/main/assets/stickers/clothes/polo.png rename to app/src/main/assets/stickers/clothes/polo.png diff --git a/session/src/main/assets/stickers/clothes/pullover.png b/app/src/main/assets/stickers/clothes/pullover.png similarity index 100% rename from session/src/main/assets/stickers/clothes/pullover.png rename to app/src/main/assets/stickers/clothes/pullover.png diff --git a/session/src/main/assets/stickers/clothes/purse-1.png b/app/src/main/assets/stickers/clothes/purse-1.png similarity index 100% rename from session/src/main/assets/stickers/clothes/purse-1.png rename to app/src/main/assets/stickers/clothes/purse-1.png diff --git a/session/src/main/assets/stickers/clothes/purse.png b/app/src/main/assets/stickers/clothes/purse.png similarity index 100% rename from session/src/main/assets/stickers/clothes/purse.png rename to app/src/main/assets/stickers/clothes/purse.png diff --git a/session/src/main/assets/stickers/clothes/scarf.png b/app/src/main/assets/stickers/clothes/scarf.png similarity index 100% rename from session/src/main/assets/stickers/clothes/scarf.png rename to app/src/main/assets/stickers/clothes/scarf.png diff --git a/session/src/main/assets/stickers/clothes/shirt-1.png b/app/src/main/assets/stickers/clothes/shirt-1.png similarity index 100% rename from session/src/main/assets/stickers/clothes/shirt-1.png rename to app/src/main/assets/stickers/clothes/shirt-1.png diff --git a/session/src/main/assets/stickers/clothes/shirt-2.png b/app/src/main/assets/stickers/clothes/shirt-2.png similarity index 100% rename from session/src/main/assets/stickers/clothes/shirt-2.png rename to app/src/main/assets/stickers/clothes/shirt-2.png diff --git a/session/src/main/assets/stickers/clothes/shirt.png b/app/src/main/assets/stickers/clothes/shirt.png similarity index 100% rename from session/src/main/assets/stickers/clothes/shirt.png rename to app/src/main/assets/stickers/clothes/shirt.png diff --git a/session/src/main/assets/stickers/clothes/shoe.png b/app/src/main/assets/stickers/clothes/shoe.png similarity index 100% rename from session/src/main/assets/stickers/clothes/shoe.png rename to app/src/main/assets/stickers/clothes/shoe.png diff --git a/session/src/main/assets/stickers/clothes/shorts.png b/app/src/main/assets/stickers/clothes/shorts.png similarity index 100% rename from session/src/main/assets/stickers/clothes/shorts.png rename to app/src/main/assets/stickers/clothes/shorts.png diff --git a/session/src/main/assets/stickers/clothes/skirt.png b/app/src/main/assets/stickers/clothes/skirt.png similarity index 100% rename from session/src/main/assets/stickers/clothes/skirt.png rename to app/src/main/assets/stickers/clothes/skirt.png diff --git a/session/src/main/assets/stickers/clothes/sleeveless.png b/app/src/main/assets/stickers/clothes/sleeveless.png similarity index 100% rename from session/src/main/assets/stickers/clothes/sleeveless.png rename to app/src/main/assets/stickers/clothes/sleeveless.png diff --git a/session/src/main/assets/stickers/clothes/slippers.png b/app/src/main/assets/stickers/clothes/slippers.png similarity index 100% rename from session/src/main/assets/stickers/clothes/slippers.png rename to app/src/main/assets/stickers/clothes/slippers.png diff --git a/session/src/main/assets/stickers/clothes/sneakers-1.png b/app/src/main/assets/stickers/clothes/sneakers-1.png similarity index 100% rename from session/src/main/assets/stickers/clothes/sneakers-1.png rename to app/src/main/assets/stickers/clothes/sneakers-1.png diff --git a/session/src/main/assets/stickers/clothes/sneakers.png b/app/src/main/assets/stickers/clothes/sneakers.png similarity index 100% rename from session/src/main/assets/stickers/clothes/sneakers.png rename to app/src/main/assets/stickers/clothes/sneakers.png diff --git a/session/src/main/assets/stickers/clothes/socks.png b/app/src/main/assets/stickers/clothes/socks.png similarity index 100% rename from session/src/main/assets/stickers/clothes/socks.png rename to app/src/main/assets/stickers/clothes/socks.png diff --git a/session/src/main/assets/stickers/clothes/suitcase.png b/app/src/main/assets/stickers/clothes/suitcase.png similarity index 100% rename from session/src/main/assets/stickers/clothes/suitcase.png rename to app/src/main/assets/stickers/clothes/suitcase.png diff --git a/session/src/main/assets/stickers/clothes/sweatshirt.png b/app/src/main/assets/stickers/clothes/sweatshirt.png similarity index 100% rename from session/src/main/assets/stickers/clothes/sweatshirt.png rename to app/src/main/assets/stickers/clothes/sweatshirt.png diff --git a/session/src/main/assets/stickers/clothes/swimsuit-1.png b/app/src/main/assets/stickers/clothes/swimsuit-1.png similarity index 100% rename from session/src/main/assets/stickers/clothes/swimsuit-1.png rename to app/src/main/assets/stickers/clothes/swimsuit-1.png diff --git a/session/src/main/assets/stickers/clothes/swimsuit.png b/app/src/main/assets/stickers/clothes/swimsuit.png similarity index 100% rename from session/src/main/assets/stickers/clothes/swimsuit.png rename to app/src/main/assets/stickers/clothes/swimsuit.png diff --git a/session/src/main/assets/stickers/clothes/tie.png b/app/src/main/assets/stickers/clothes/tie.png similarity index 100% rename from session/src/main/assets/stickers/clothes/tie.png rename to app/src/main/assets/stickers/clothes/tie.png diff --git a/session/src/main/assets/stickers/clothes/trench-coat.png b/app/src/main/assets/stickers/clothes/trench-coat.png similarity index 100% rename from session/src/main/assets/stickers/clothes/trench-coat.png rename to app/src/main/assets/stickers/clothes/trench-coat.png diff --git a/session/src/main/assets/stickers/clothes/trousers.png b/app/src/main/assets/stickers/clothes/trousers.png similarity index 100% rename from session/src/main/assets/stickers/clothes/trousers.png rename to app/src/main/assets/stickers/clothes/trousers.png diff --git a/session/src/main/assets/stickers/clothes/underpants.png b/app/src/main/assets/stickers/clothes/underpants.png similarity index 100% rename from session/src/main/assets/stickers/clothes/underpants.png rename to app/src/main/assets/stickers/clothes/underpants.png diff --git a/session/src/main/assets/stickers/clothes/vest.png b/app/src/main/assets/stickers/clothes/vest.png similarity index 100% rename from session/src/main/assets/stickers/clothes/vest.png rename to app/src/main/assets/stickers/clothes/vest.png diff --git a/session/src/main/assets/stickers/clothes/winter-hat.png b/app/src/main/assets/stickers/clothes/winter-hat.png similarity index 100% rename from session/src/main/assets/stickers/clothes/winter-hat.png rename to app/src/main/assets/stickers/clothes/winter-hat.png diff --git a/session/src/main/assets/stickers/emoticons/angry-1.png b/app/src/main/assets/stickers/emoticons/angry-1.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/angry-1.png rename to app/src/main/assets/stickers/emoticons/angry-1.png diff --git a/session/src/main/assets/stickers/emoticons/angry.png b/app/src/main/assets/stickers/emoticons/angry.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/angry.png rename to app/src/main/assets/stickers/emoticons/angry.png diff --git a/session/src/main/assets/stickers/emoticons/bored-1.png b/app/src/main/assets/stickers/emoticons/bored-1.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/bored-1.png rename to app/src/main/assets/stickers/emoticons/bored-1.png diff --git a/session/src/main/assets/stickers/emoticons/bored-2.png b/app/src/main/assets/stickers/emoticons/bored-2.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/bored-2.png rename to app/src/main/assets/stickers/emoticons/bored-2.png diff --git a/session/src/main/assets/stickers/emoticons/bored.png b/app/src/main/assets/stickers/emoticons/bored.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/bored.png rename to app/src/main/assets/stickers/emoticons/bored.png diff --git a/session/src/main/assets/stickers/emoticons/confused-1.png b/app/src/main/assets/stickers/emoticons/confused-1.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/confused-1.png rename to app/src/main/assets/stickers/emoticons/confused-1.png diff --git a/session/src/main/assets/stickers/emoticons/confused.png b/app/src/main/assets/stickers/emoticons/confused.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/confused.png rename to app/src/main/assets/stickers/emoticons/confused.png diff --git a/session/src/main/assets/stickers/emoticons/crying-1.png b/app/src/main/assets/stickers/emoticons/crying-1.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/crying-1.png rename to app/src/main/assets/stickers/emoticons/crying-1.png diff --git a/session/src/main/assets/stickers/emoticons/crying.png b/app/src/main/assets/stickers/emoticons/crying.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/crying.png rename to app/src/main/assets/stickers/emoticons/crying.png diff --git a/session/src/main/assets/stickers/emoticons/embarrassed.png b/app/src/main/assets/stickers/emoticons/embarrassed.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/embarrassed.png rename to app/src/main/assets/stickers/emoticons/embarrassed.png diff --git a/session/src/main/assets/stickers/emoticons/emoticons.png b/app/src/main/assets/stickers/emoticons/emoticons.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/emoticons.png rename to app/src/main/assets/stickers/emoticons/emoticons.png diff --git a/session/src/main/assets/stickers/emoticons/happy-1.png b/app/src/main/assets/stickers/emoticons/happy-1.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/happy-1.png rename to app/src/main/assets/stickers/emoticons/happy-1.png diff --git a/session/src/main/assets/stickers/emoticons/happy-2.png b/app/src/main/assets/stickers/emoticons/happy-2.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/happy-2.png rename to app/src/main/assets/stickers/emoticons/happy-2.png diff --git a/session/src/main/assets/stickers/emoticons/happy-3.png b/app/src/main/assets/stickers/emoticons/happy-3.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/happy-3.png rename to app/src/main/assets/stickers/emoticons/happy-3.png diff --git a/session/src/main/assets/stickers/emoticons/happy-4.png b/app/src/main/assets/stickers/emoticons/happy-4.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/happy-4.png rename to app/src/main/assets/stickers/emoticons/happy-4.png diff --git a/session/src/main/assets/stickers/emoticons/happy.png b/app/src/main/assets/stickers/emoticons/happy.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/happy.png rename to app/src/main/assets/stickers/emoticons/happy.png diff --git a/session/src/main/assets/stickers/emoticons/ill.png b/app/src/main/assets/stickers/emoticons/ill.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/ill.png rename to app/src/main/assets/stickers/emoticons/ill.png diff --git a/session/src/main/assets/stickers/emoticons/in-love.png b/app/src/main/assets/stickers/emoticons/in-love.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/in-love.png rename to app/src/main/assets/stickers/emoticons/in-love.png diff --git a/session/src/main/assets/stickers/emoticons/kissing.png b/app/src/main/assets/stickers/emoticons/kissing.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/kissing.png rename to app/src/main/assets/stickers/emoticons/kissing.png diff --git a/session/src/main/assets/stickers/emoticons/mad.png b/app/src/main/assets/stickers/emoticons/mad.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/mad.png rename to app/src/main/assets/stickers/emoticons/mad.png diff --git a/session/src/main/assets/stickers/emoticons/nerd.png b/app/src/main/assets/stickers/emoticons/nerd.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/nerd.png rename to app/src/main/assets/stickers/emoticons/nerd.png diff --git a/session/src/main/assets/stickers/emoticons/ninja.png b/app/src/main/assets/stickers/emoticons/ninja.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/ninja.png rename to app/src/main/assets/stickers/emoticons/ninja.png diff --git a/session/src/main/assets/stickers/emoticons/quiet.png b/app/src/main/assets/stickers/emoticons/quiet.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/quiet.png rename to app/src/main/assets/stickers/emoticons/quiet.png diff --git a/session/src/main/assets/stickers/emoticons/sad.png b/app/src/main/assets/stickers/emoticons/sad.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/sad.png rename to app/src/main/assets/stickers/emoticons/sad.png diff --git a/session/src/main/assets/stickers/emoticons/secret.png b/app/src/main/assets/stickers/emoticons/secret.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/secret.png rename to app/src/main/assets/stickers/emoticons/secret.png diff --git a/session/src/main/assets/stickers/emoticons/smart.png b/app/src/main/assets/stickers/emoticons/smart.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/smart.png rename to app/src/main/assets/stickers/emoticons/smart.png diff --git a/session/src/main/assets/stickers/emoticons/smile.png b/app/src/main/assets/stickers/emoticons/smile.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/smile.png rename to app/src/main/assets/stickers/emoticons/smile.png diff --git a/session/src/main/assets/stickers/emoticons/smiling.png b/app/src/main/assets/stickers/emoticons/smiling.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/smiling.png rename to app/src/main/assets/stickers/emoticons/smiling.png diff --git a/session/src/main/assets/stickers/emoticons/surprised-1.png b/app/src/main/assets/stickers/emoticons/surprised-1.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/surprised-1.png rename to app/src/main/assets/stickers/emoticons/surprised-1.png diff --git a/session/src/main/assets/stickers/emoticons/surprised.png b/app/src/main/assets/stickers/emoticons/surprised.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/surprised.png rename to app/src/main/assets/stickers/emoticons/surprised.png diff --git a/session/src/main/assets/stickers/emoticons/suspicious-1.png b/app/src/main/assets/stickers/emoticons/suspicious-1.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/suspicious-1.png rename to app/src/main/assets/stickers/emoticons/suspicious-1.png diff --git a/session/src/main/assets/stickers/emoticons/suspicious.png b/app/src/main/assets/stickers/emoticons/suspicious.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/suspicious.png rename to app/src/main/assets/stickers/emoticons/suspicious.png diff --git a/session/src/main/assets/stickers/emoticons/tongue-out-1.png b/app/src/main/assets/stickers/emoticons/tongue-out-1.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/tongue-out-1.png rename to app/src/main/assets/stickers/emoticons/tongue-out-1.png diff --git a/session/src/main/assets/stickers/emoticons/tongue-out.png b/app/src/main/assets/stickers/emoticons/tongue-out.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/tongue-out.png rename to app/src/main/assets/stickers/emoticons/tongue-out.png diff --git a/session/src/main/assets/stickers/emoticons/unhappy.png b/app/src/main/assets/stickers/emoticons/unhappy.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/unhappy.png rename to app/src/main/assets/stickers/emoticons/unhappy.png diff --git a/session/src/main/assets/stickers/emoticons/wink.png b/app/src/main/assets/stickers/emoticons/wink.png similarity index 100% rename from session/src/main/assets/stickers/emoticons/wink.png rename to app/src/main/assets/stickers/emoticons/wink.png diff --git a/session/src/main/assets/stickers/food/apple.png b/app/src/main/assets/stickers/food/apple.png similarity index 100% rename from session/src/main/assets/stickers/food/apple.png rename to app/src/main/assets/stickers/food/apple.png diff --git a/session/src/main/assets/stickers/food/artichoke.png b/app/src/main/assets/stickers/food/artichoke.png similarity index 100% rename from session/src/main/assets/stickers/food/artichoke.png rename to app/src/main/assets/stickers/food/artichoke.png diff --git a/session/src/main/assets/stickers/food/aubergine.png b/app/src/main/assets/stickers/food/aubergine.png similarity index 100% rename from session/src/main/assets/stickers/food/aubergine.png rename to app/src/main/assets/stickers/food/aubergine.png diff --git a/session/src/main/assets/stickers/food/avocado.png b/app/src/main/assets/stickers/food/avocado.png similarity index 100% rename from session/src/main/assets/stickers/food/avocado.png rename to app/src/main/assets/stickers/food/avocado.png diff --git a/session/src/main/assets/stickers/food/bacon.png b/app/src/main/assets/stickers/food/bacon.png similarity index 100% rename from session/src/main/assets/stickers/food/bacon.png rename to app/src/main/assets/stickers/food/bacon.png diff --git a/session/src/main/assets/stickers/food/banana.png b/app/src/main/assets/stickers/food/banana.png similarity index 100% rename from session/src/main/assets/stickers/food/banana.png rename to app/src/main/assets/stickers/food/banana.png diff --git a/session/src/main/assets/stickers/food/beans.png b/app/src/main/assets/stickers/food/beans.png similarity index 100% rename from session/src/main/assets/stickers/food/beans.png rename to app/src/main/assets/stickers/food/beans.png diff --git a/session/src/main/assets/stickers/food/bell-pepper.png b/app/src/main/assets/stickers/food/bell-pepper.png similarity index 100% rename from session/src/main/assets/stickers/food/bell-pepper.png rename to app/src/main/assets/stickers/food/bell-pepper.png diff --git a/session/src/main/assets/stickers/food/birthday-cake.png b/app/src/main/assets/stickers/food/birthday-cake.png similarity index 100% rename from session/src/main/assets/stickers/food/birthday-cake.png rename to app/src/main/assets/stickers/food/birthday-cake.png diff --git a/session/src/main/assets/stickers/food/biscuit.png b/app/src/main/assets/stickers/food/biscuit.png similarity index 100% rename from session/src/main/assets/stickers/food/biscuit.png rename to app/src/main/assets/stickers/food/biscuit.png diff --git a/session/src/main/assets/stickers/food/boiled-egg.png b/app/src/main/assets/stickers/food/boiled-egg.png similarity index 100% rename from session/src/main/assets/stickers/food/boiled-egg.png rename to app/src/main/assets/stickers/food/boiled-egg.png diff --git a/session/src/main/assets/stickers/food/bread.png b/app/src/main/assets/stickers/food/bread.png similarity index 100% rename from session/src/main/assets/stickers/food/bread.png rename to app/src/main/assets/stickers/food/bread.png diff --git a/session/src/main/assets/stickers/food/broccoli.png b/app/src/main/assets/stickers/food/broccoli.png similarity index 100% rename from session/src/main/assets/stickers/food/broccoli.png rename to app/src/main/assets/stickers/food/broccoli.png diff --git a/session/src/main/assets/stickers/food/brochette.png b/app/src/main/assets/stickers/food/brochette.png similarity index 100% rename from session/src/main/assets/stickers/food/brochette.png rename to app/src/main/assets/stickers/food/brochette.png diff --git a/session/src/main/assets/stickers/food/burger-1.png b/app/src/main/assets/stickers/food/burger-1.png similarity index 100% rename from session/src/main/assets/stickers/food/burger-1.png rename to app/src/main/assets/stickers/food/burger-1.png diff --git a/session/src/main/assets/stickers/food/burger.png b/app/src/main/assets/stickers/food/burger.png similarity index 100% rename from session/src/main/assets/stickers/food/burger.png rename to app/src/main/assets/stickers/food/burger.png diff --git a/session/src/main/assets/stickers/food/burrito.png b/app/src/main/assets/stickers/food/burrito.png similarity index 100% rename from session/src/main/assets/stickers/food/burrito.png rename to app/src/main/assets/stickers/food/burrito.png diff --git a/session/src/main/assets/stickers/food/cake.png b/app/src/main/assets/stickers/food/cake.png similarity index 100% rename from session/src/main/assets/stickers/food/cake.png rename to app/src/main/assets/stickers/food/cake.png diff --git a/session/src/main/assets/stickers/food/candy-cane.png b/app/src/main/assets/stickers/food/candy-cane.png similarity index 100% rename from session/src/main/assets/stickers/food/candy-cane.png rename to app/src/main/assets/stickers/food/candy-cane.png diff --git a/session/src/main/assets/stickers/food/candy.png b/app/src/main/assets/stickers/food/candy.png similarity index 100% rename from session/src/main/assets/stickers/food/candy.png rename to app/src/main/assets/stickers/food/candy.png diff --git a/session/src/main/assets/stickers/food/carrot.png b/app/src/main/assets/stickers/food/carrot.png similarity index 100% rename from session/src/main/assets/stickers/food/carrot.png rename to app/src/main/assets/stickers/food/carrot.png diff --git a/session/src/main/assets/stickers/food/cheese.png b/app/src/main/assets/stickers/food/cheese.png similarity index 100% rename from session/src/main/assets/stickers/food/cheese.png rename to app/src/main/assets/stickers/food/cheese.png diff --git a/session/src/main/assets/stickers/food/cherry.png b/app/src/main/assets/stickers/food/cherry.png similarity index 100% rename from session/src/main/assets/stickers/food/cherry.png rename to app/src/main/assets/stickers/food/cherry.png diff --git a/session/src/main/assets/stickers/food/chicken-leg.png b/app/src/main/assets/stickers/food/chicken-leg.png similarity index 100% rename from session/src/main/assets/stickers/food/chicken-leg.png rename to app/src/main/assets/stickers/food/chicken-leg.png diff --git a/session/src/main/assets/stickers/food/chili-pepper.png b/app/src/main/assets/stickers/food/chili-pepper.png similarity index 100% rename from session/src/main/assets/stickers/food/chili-pepper.png rename to app/src/main/assets/stickers/food/chili-pepper.png diff --git a/session/src/main/assets/stickers/food/chocolate.png b/app/src/main/assets/stickers/food/chocolate.png similarity index 100% rename from session/src/main/assets/stickers/food/chocolate.png rename to app/src/main/assets/stickers/food/chocolate.png diff --git a/session/src/main/assets/stickers/food/chorizo.png b/app/src/main/assets/stickers/food/chorizo.png similarity index 100% rename from session/src/main/assets/stickers/food/chorizo.png rename to app/src/main/assets/stickers/food/chorizo.png diff --git a/session/src/main/assets/stickers/food/corn.png b/app/src/main/assets/stickers/food/corn.png similarity index 100% rename from session/src/main/assets/stickers/food/corn.png rename to app/src/main/assets/stickers/food/corn.png diff --git a/session/src/main/assets/stickers/food/cotton-candy.png b/app/src/main/assets/stickers/food/cotton-candy.png similarity index 100% rename from session/src/main/assets/stickers/food/cotton-candy.png rename to app/src/main/assets/stickers/food/cotton-candy.png diff --git a/session/src/main/assets/stickers/food/crab.png b/app/src/main/assets/stickers/food/crab.png similarity index 100% rename from session/src/main/assets/stickers/food/crab.png rename to app/src/main/assets/stickers/food/crab.png diff --git a/session/src/main/assets/stickers/food/croissant.png b/app/src/main/assets/stickers/food/croissant.png similarity index 100% rename from session/src/main/assets/stickers/food/croissant.png rename to app/src/main/assets/stickers/food/croissant.png diff --git a/session/src/main/assets/stickers/food/cupcake-1.png b/app/src/main/assets/stickers/food/cupcake-1.png similarity index 100% rename from session/src/main/assets/stickers/food/cupcake-1.png rename to app/src/main/assets/stickers/food/cupcake-1.png diff --git a/session/src/main/assets/stickers/food/cupcake.png b/app/src/main/assets/stickers/food/cupcake.png similarity index 100% rename from session/src/main/assets/stickers/food/cupcake.png rename to app/src/main/assets/stickers/food/cupcake.png diff --git a/session/src/main/assets/stickers/food/doner-kebab.png b/app/src/main/assets/stickers/food/doner-kebab.png similarity index 100% rename from session/src/main/assets/stickers/food/doner-kebab.png rename to app/src/main/assets/stickers/food/doner-kebab.png diff --git a/session/src/main/assets/stickers/food/donut.png b/app/src/main/assets/stickers/food/donut.png similarity index 100% rename from session/src/main/assets/stickers/food/donut.png rename to app/src/main/assets/stickers/food/donut.png diff --git a/session/src/main/assets/stickers/food/drink.png b/app/src/main/assets/stickers/food/drink.png similarity index 100% rename from session/src/main/assets/stickers/food/drink.png rename to app/src/main/assets/stickers/food/drink.png diff --git a/session/src/main/assets/stickers/food/fish.png b/app/src/main/assets/stickers/food/fish.png similarity index 100% rename from session/src/main/assets/stickers/food/fish.png rename to app/src/main/assets/stickers/food/fish.png diff --git a/session/src/main/assets/stickers/food/french-fries.png b/app/src/main/assets/stickers/food/french-fries.png similarity index 100% rename from session/src/main/assets/stickers/food/french-fries.png rename to app/src/main/assets/stickers/food/french-fries.png diff --git a/session/src/main/assets/stickers/food/fried-egg.png b/app/src/main/assets/stickers/food/fried-egg.png similarity index 100% rename from session/src/main/assets/stickers/food/fried-egg.png rename to app/src/main/assets/stickers/food/fried-egg.png diff --git a/session/src/main/assets/stickers/food/garlic.png b/app/src/main/assets/stickers/food/garlic.png similarity index 100% rename from session/src/main/assets/stickers/food/garlic.png rename to app/src/main/assets/stickers/food/garlic.png diff --git a/session/src/main/assets/stickers/food/gingerbread-man.png b/app/src/main/assets/stickers/food/gingerbread-man.png similarity index 100% rename from session/src/main/assets/stickers/food/gingerbread-man.png rename to app/src/main/assets/stickers/food/gingerbread-man.png diff --git a/session/src/main/assets/stickers/food/grapes.png b/app/src/main/assets/stickers/food/grapes.png similarity index 100% rename from session/src/main/assets/stickers/food/grapes.png rename to app/src/main/assets/stickers/food/grapes.png diff --git a/session/src/main/assets/stickers/food/honey.png b/app/src/main/assets/stickers/food/honey.png similarity index 100% rename from session/src/main/assets/stickers/food/honey.png rename to app/src/main/assets/stickers/food/honey.png diff --git a/session/src/main/assets/stickers/food/hot-dog.png b/app/src/main/assets/stickers/food/hot-dog.png similarity index 100% rename from session/src/main/assets/stickers/food/hot-dog.png rename to app/src/main/assets/stickers/food/hot-dog.png diff --git a/session/src/main/assets/stickers/food/ice-cream.png b/app/src/main/assets/stickers/food/ice-cream.png similarity index 100% rename from session/src/main/assets/stickers/food/ice-cream.png rename to app/src/main/assets/stickers/food/ice-cream.png diff --git a/session/src/main/assets/stickers/food/jam.png b/app/src/main/assets/stickers/food/jam.png similarity index 100% rename from session/src/main/assets/stickers/food/jam.png rename to app/src/main/assets/stickers/food/jam.png diff --git a/session/src/main/assets/stickers/food/jelly.png b/app/src/main/assets/stickers/food/jelly.png similarity index 100% rename from session/src/main/assets/stickers/food/jelly.png rename to app/src/main/assets/stickers/food/jelly.png diff --git a/session/src/main/assets/stickers/food/ketchup.png b/app/src/main/assets/stickers/food/ketchup.png similarity index 100% rename from session/src/main/assets/stickers/food/ketchup.png rename to app/src/main/assets/stickers/food/ketchup.png diff --git a/session/src/main/assets/stickers/food/kiwi.png b/app/src/main/assets/stickers/food/kiwi.png similarity index 100% rename from session/src/main/assets/stickers/food/kiwi.png rename to app/src/main/assets/stickers/food/kiwi.png diff --git a/session/src/main/assets/stickers/food/lemon.png b/app/src/main/assets/stickers/food/lemon.png similarity index 100% rename from session/src/main/assets/stickers/food/lemon.png rename to app/src/main/assets/stickers/food/lemon.png diff --git a/session/src/main/assets/stickers/food/lettuce.png b/app/src/main/assets/stickers/food/lettuce.png similarity index 100% rename from session/src/main/assets/stickers/food/lettuce.png rename to app/src/main/assets/stickers/food/lettuce.png diff --git a/session/src/main/assets/stickers/food/lobster.png b/app/src/main/assets/stickers/food/lobster.png similarity index 100% rename from session/src/main/assets/stickers/food/lobster.png rename to app/src/main/assets/stickers/food/lobster.png diff --git a/session/src/main/assets/stickers/food/lollipop-1.png b/app/src/main/assets/stickers/food/lollipop-1.png similarity index 100% rename from session/src/main/assets/stickers/food/lollipop-1.png rename to app/src/main/assets/stickers/food/lollipop-1.png diff --git a/session/src/main/assets/stickers/food/lollipop.png b/app/src/main/assets/stickers/food/lollipop.png similarity index 100% rename from session/src/main/assets/stickers/food/lollipop.png rename to app/src/main/assets/stickers/food/lollipop.png diff --git a/session/src/main/assets/stickers/food/macarons.png b/app/src/main/assets/stickers/food/macarons.png similarity index 100% rename from session/src/main/assets/stickers/food/macarons.png rename to app/src/main/assets/stickers/food/macarons.png diff --git a/session/src/main/assets/stickers/food/muffin.png b/app/src/main/assets/stickers/food/muffin.png similarity index 100% rename from session/src/main/assets/stickers/food/muffin.png rename to app/src/main/assets/stickers/food/muffin.png diff --git a/session/src/main/assets/stickers/food/mushroom.png b/app/src/main/assets/stickers/food/mushroom.png similarity index 100% rename from session/src/main/assets/stickers/food/mushroom.png rename to app/src/main/assets/stickers/food/mushroom.png diff --git a/session/src/main/assets/stickers/food/mussel.png b/app/src/main/assets/stickers/food/mussel.png similarity index 100% rename from session/src/main/assets/stickers/food/mussel.png rename to app/src/main/assets/stickers/food/mussel.png diff --git a/session/src/main/assets/stickers/food/noodles.png b/app/src/main/assets/stickers/food/noodles.png similarity index 100% rename from session/src/main/assets/stickers/food/noodles.png rename to app/src/main/assets/stickers/food/noodles.png diff --git a/session/src/main/assets/stickers/food/olive-oil.png b/app/src/main/assets/stickers/food/olive-oil.png similarity index 100% rename from session/src/main/assets/stickers/food/olive-oil.png rename to app/src/main/assets/stickers/food/olive-oil.png diff --git a/session/src/main/assets/stickers/food/olives.png b/app/src/main/assets/stickers/food/olives.png similarity index 100% rename from session/src/main/assets/stickers/food/olives.png rename to app/src/main/assets/stickers/food/olives.png diff --git a/session/src/main/assets/stickers/food/onion-rings.png b/app/src/main/assets/stickers/food/onion-rings.png similarity index 100% rename from session/src/main/assets/stickers/food/onion-rings.png rename to app/src/main/assets/stickers/food/onion-rings.png diff --git a/session/src/main/assets/stickers/food/onion.png b/app/src/main/assets/stickers/food/onion.png similarity index 100% rename from session/src/main/assets/stickers/food/onion.png rename to app/src/main/assets/stickers/food/onion.png diff --git a/session/src/main/assets/stickers/food/orange.png b/app/src/main/assets/stickers/food/orange.png similarity index 100% rename from session/src/main/assets/stickers/food/orange.png rename to app/src/main/assets/stickers/food/orange.png diff --git a/session/src/main/assets/stickers/food/pancakes.png b/app/src/main/assets/stickers/food/pancakes.png similarity index 100% rename from session/src/main/assets/stickers/food/pancakes.png rename to app/src/main/assets/stickers/food/pancakes.png diff --git a/session/src/main/assets/stickers/food/pasta.png b/app/src/main/assets/stickers/food/pasta.png similarity index 100% rename from session/src/main/assets/stickers/food/pasta.png rename to app/src/main/assets/stickers/food/pasta.png diff --git a/session/src/main/assets/stickers/food/peach.png b/app/src/main/assets/stickers/food/peach.png similarity index 100% rename from session/src/main/assets/stickers/food/peach.png rename to app/src/main/assets/stickers/food/peach.png diff --git a/session/src/main/assets/stickers/food/pear.png b/app/src/main/assets/stickers/food/pear.png similarity index 100% rename from session/src/main/assets/stickers/food/pear.png rename to app/src/main/assets/stickers/food/pear.png diff --git a/session/src/main/assets/stickers/food/pepper.png b/app/src/main/assets/stickers/food/pepper.png similarity index 100% rename from session/src/main/assets/stickers/food/pepper.png rename to app/src/main/assets/stickers/food/pepper.png diff --git a/session/src/main/assets/stickers/food/pie.png b/app/src/main/assets/stickers/food/pie.png similarity index 100% rename from session/src/main/assets/stickers/food/pie.png rename to app/src/main/assets/stickers/food/pie.png diff --git a/session/src/main/assets/stickers/food/pineapple.png b/app/src/main/assets/stickers/food/pineapple.png similarity index 100% rename from session/src/main/assets/stickers/food/pineapple.png rename to app/src/main/assets/stickers/food/pineapple.png diff --git a/session/src/main/assets/stickers/food/pizza.png b/app/src/main/assets/stickers/food/pizza.png similarity index 100% rename from session/src/main/assets/stickers/food/pizza.png rename to app/src/main/assets/stickers/food/pizza.png diff --git a/session/src/main/assets/stickers/food/popcorn.png b/app/src/main/assets/stickers/food/popcorn.png similarity index 100% rename from session/src/main/assets/stickers/food/popcorn.png rename to app/src/main/assets/stickers/food/popcorn.png diff --git a/session/src/main/assets/stickers/food/prawn.png b/app/src/main/assets/stickers/food/prawn.png similarity index 100% rename from session/src/main/assets/stickers/food/prawn.png rename to app/src/main/assets/stickers/food/prawn.png diff --git a/session/src/main/assets/stickers/food/pretzel.png b/app/src/main/assets/stickers/food/pretzel.png similarity index 100% rename from session/src/main/assets/stickers/food/pretzel.png rename to app/src/main/assets/stickers/food/pretzel.png diff --git a/session/src/main/assets/stickers/food/pumpkin.png b/app/src/main/assets/stickers/food/pumpkin.png similarity index 100% rename from session/src/main/assets/stickers/food/pumpkin.png rename to app/src/main/assets/stickers/food/pumpkin.png diff --git a/session/src/main/assets/stickers/food/radish.png b/app/src/main/assets/stickers/food/radish.png similarity index 100% rename from session/src/main/assets/stickers/food/radish.png rename to app/src/main/assets/stickers/food/radish.png diff --git a/session/src/main/assets/stickers/food/raspberry.png b/app/src/main/assets/stickers/food/raspberry.png similarity index 100% rename from session/src/main/assets/stickers/food/raspberry.png rename to app/src/main/assets/stickers/food/raspberry.png diff --git a/session/src/main/assets/stickers/food/rice.png b/app/src/main/assets/stickers/food/rice.png similarity index 100% rename from session/src/main/assets/stickers/food/rice.png rename to app/src/main/assets/stickers/food/rice.png diff --git a/session/src/main/assets/stickers/food/roast-chicken.png b/app/src/main/assets/stickers/food/roast-chicken.png similarity index 100% rename from session/src/main/assets/stickers/food/roast-chicken.png rename to app/src/main/assets/stickers/food/roast-chicken.png diff --git a/session/src/main/assets/stickers/food/salad.png b/app/src/main/assets/stickers/food/salad.png similarity index 100% rename from session/src/main/assets/stickers/food/salad.png rename to app/src/main/assets/stickers/food/salad.png diff --git a/session/src/main/assets/stickers/food/salt.png b/app/src/main/assets/stickers/food/salt.png similarity index 100% rename from session/src/main/assets/stickers/food/salt.png rename to app/src/main/assets/stickers/food/salt.png diff --git a/session/src/main/assets/stickers/food/sandwich-1.png b/app/src/main/assets/stickers/food/sandwich-1.png similarity index 100% rename from session/src/main/assets/stickers/food/sandwich-1.png rename to app/src/main/assets/stickers/food/sandwich-1.png diff --git a/session/src/main/assets/stickers/food/sandwich.png b/app/src/main/assets/stickers/food/sandwich.png similarity index 100% rename from session/src/main/assets/stickers/food/sandwich.png rename to app/src/main/assets/stickers/food/sandwich.png diff --git a/session/src/main/assets/stickers/food/sardine.png b/app/src/main/assets/stickers/food/sardine.png similarity index 100% rename from session/src/main/assets/stickers/food/sardine.png rename to app/src/main/assets/stickers/food/sardine.png diff --git a/session/src/main/assets/stickers/food/soup.png b/app/src/main/assets/stickers/food/soup.png similarity index 100% rename from session/src/main/assets/stickers/food/soup.png rename to app/src/main/assets/stickers/food/soup.png diff --git a/session/src/main/assets/stickers/food/soya.png b/app/src/main/assets/stickers/food/soya.png similarity index 100% rename from session/src/main/assets/stickers/food/soya.png rename to app/src/main/assets/stickers/food/soya.png diff --git a/session/src/main/assets/stickers/food/steak.png b/app/src/main/assets/stickers/food/steak.png similarity index 100% rename from session/src/main/assets/stickers/food/steak.png rename to app/src/main/assets/stickers/food/steak.png diff --git a/session/src/main/assets/stickers/food/strawberry.png b/app/src/main/assets/stickers/food/strawberry.png similarity index 100% rename from session/src/main/assets/stickers/food/strawberry.png rename to app/src/main/assets/stickers/food/strawberry.png diff --git a/session/src/main/assets/stickers/food/sushi.png b/app/src/main/assets/stickers/food/sushi.png similarity index 100% rename from session/src/main/assets/stickers/food/sushi.png rename to app/src/main/assets/stickers/food/sushi.png diff --git a/session/src/main/assets/stickers/food/taco.png b/app/src/main/assets/stickers/food/taco.png similarity index 100% rename from session/src/main/assets/stickers/food/taco.png rename to app/src/main/assets/stickers/food/taco.png diff --git a/session/src/main/assets/stickers/food/toaster.png b/app/src/main/assets/stickers/food/toaster.png similarity index 100% rename from session/src/main/assets/stickers/food/toaster.png rename to app/src/main/assets/stickers/food/toaster.png diff --git a/session/src/main/assets/stickers/food/tomato.png b/app/src/main/assets/stickers/food/tomato.png similarity index 100% rename from session/src/main/assets/stickers/food/tomato.png rename to app/src/main/assets/stickers/food/tomato.png diff --git a/session/src/main/assets/stickers/food/tuna.png b/app/src/main/assets/stickers/food/tuna.png similarity index 100% rename from session/src/main/assets/stickers/food/tuna.png rename to app/src/main/assets/stickers/food/tuna.png diff --git a/session/src/main/assets/stickers/food/vinegar.png b/app/src/main/assets/stickers/food/vinegar.png similarity index 100% rename from session/src/main/assets/stickers/food/vinegar.png rename to app/src/main/assets/stickers/food/vinegar.png diff --git a/session/src/main/assets/stickers/food/watermelon.png b/app/src/main/assets/stickers/food/watermelon.png similarity index 100% rename from session/src/main/assets/stickers/food/watermelon.png rename to app/src/main/assets/stickers/food/watermelon.png diff --git a/session/src/main/assets/stickers/food/yogurt.png b/app/src/main/assets/stickers/food/yogurt.png similarity index 100% rename from session/src/main/assets/stickers/food/yogurt.png rename to app/src/main/assets/stickers/food/yogurt.png diff --git a/session/src/main/assets/stickers/weather/cloud.png b/app/src/main/assets/stickers/weather/cloud.png similarity index 100% rename from session/src/main/assets/stickers/weather/cloud.png rename to app/src/main/assets/stickers/weather/cloud.png diff --git a/session/src/main/assets/stickers/weather/cloudy-1.png b/app/src/main/assets/stickers/weather/cloudy-1.png similarity index 100% rename from session/src/main/assets/stickers/weather/cloudy-1.png rename to app/src/main/assets/stickers/weather/cloudy-1.png diff --git a/session/src/main/assets/stickers/weather/cloudy-night.png b/app/src/main/assets/stickers/weather/cloudy-night.png similarity index 100% rename from session/src/main/assets/stickers/weather/cloudy-night.png rename to app/src/main/assets/stickers/weather/cloudy-night.png diff --git a/session/src/main/assets/stickers/weather/cloudy.png b/app/src/main/assets/stickers/weather/cloudy.png similarity index 100% rename from session/src/main/assets/stickers/weather/cloudy.png rename to app/src/main/assets/stickers/weather/cloudy.png diff --git a/session/src/main/assets/stickers/weather/eclipse.png b/app/src/main/assets/stickers/weather/eclipse.png similarity index 100% rename from session/src/main/assets/stickers/weather/eclipse.png rename to app/src/main/assets/stickers/weather/eclipse.png diff --git a/session/src/main/assets/stickers/weather/full-moon.png b/app/src/main/assets/stickers/weather/full-moon.png similarity index 100% rename from session/src/main/assets/stickers/weather/full-moon.png rename to app/src/main/assets/stickers/weather/full-moon.png diff --git a/session/src/main/assets/stickers/weather/hail.png b/app/src/main/assets/stickers/weather/hail.png similarity index 100% rename from session/src/main/assets/stickers/weather/hail.png rename to app/src/main/assets/stickers/weather/hail.png diff --git a/session/src/main/assets/stickers/weather/lightning.png b/app/src/main/assets/stickers/weather/lightning.png similarity index 100% rename from session/src/main/assets/stickers/weather/lightning.png rename to app/src/main/assets/stickers/weather/lightning.png diff --git a/session/src/main/assets/stickers/weather/moon-phases-1.png b/app/src/main/assets/stickers/weather/moon-phases-1.png similarity index 100% rename from session/src/main/assets/stickers/weather/moon-phases-1.png rename to app/src/main/assets/stickers/weather/moon-phases-1.png diff --git a/session/src/main/assets/stickers/weather/moon-phases-2.png b/app/src/main/assets/stickers/weather/moon-phases-2.png similarity index 100% rename from session/src/main/assets/stickers/weather/moon-phases-2.png rename to app/src/main/assets/stickers/weather/moon-phases-2.png diff --git a/session/src/main/assets/stickers/weather/moon-phases-3.png b/app/src/main/assets/stickers/weather/moon-phases-3.png similarity index 100% rename from session/src/main/assets/stickers/weather/moon-phases-3.png rename to app/src/main/assets/stickers/weather/moon-phases-3.png diff --git a/session/src/main/assets/stickers/weather/moon-phases-4.png b/app/src/main/assets/stickers/weather/moon-phases-4.png similarity index 100% rename from session/src/main/assets/stickers/weather/moon-phases-4.png rename to app/src/main/assets/stickers/weather/moon-phases-4.png diff --git a/session/src/main/assets/stickers/weather/moon-phases-5.png b/app/src/main/assets/stickers/weather/moon-phases-5.png similarity index 100% rename from session/src/main/assets/stickers/weather/moon-phases-5.png rename to app/src/main/assets/stickers/weather/moon-phases-5.png diff --git a/session/src/main/assets/stickers/weather/moon-phases.png b/app/src/main/assets/stickers/weather/moon-phases.png similarity index 100% rename from session/src/main/assets/stickers/weather/moon-phases.png rename to app/src/main/assets/stickers/weather/moon-phases.png diff --git a/session/src/main/assets/stickers/weather/planet-earth.png b/app/src/main/assets/stickers/weather/planet-earth.png similarity index 100% rename from session/src/main/assets/stickers/weather/planet-earth.png rename to app/src/main/assets/stickers/weather/planet-earth.png diff --git a/session/src/main/assets/stickers/weather/rain-1.png b/app/src/main/assets/stickers/weather/rain-1.png similarity index 100% rename from session/src/main/assets/stickers/weather/rain-1.png rename to app/src/main/assets/stickers/weather/rain-1.png diff --git a/session/src/main/assets/stickers/weather/rain.png b/app/src/main/assets/stickers/weather/rain.png similarity index 100% rename from session/src/main/assets/stickers/weather/rain.png rename to app/src/main/assets/stickers/weather/rain.png diff --git a/session/src/main/assets/stickers/weather/raindrop.png b/app/src/main/assets/stickers/weather/raindrop.png similarity index 100% rename from session/src/main/assets/stickers/weather/raindrop.png rename to app/src/main/assets/stickers/weather/raindrop.png diff --git a/session/src/main/assets/stickers/weather/rainy-1.png b/app/src/main/assets/stickers/weather/rainy-1.png similarity index 100% rename from session/src/main/assets/stickers/weather/rainy-1.png rename to app/src/main/assets/stickers/weather/rainy-1.png diff --git a/session/src/main/assets/stickers/weather/rainy.png b/app/src/main/assets/stickers/weather/rainy.png similarity index 100% rename from session/src/main/assets/stickers/weather/rainy.png rename to app/src/main/assets/stickers/weather/rainy.png diff --git a/session/src/main/assets/stickers/weather/snowflake.png b/app/src/main/assets/stickers/weather/snowflake.png similarity index 100% rename from session/src/main/assets/stickers/weather/snowflake.png rename to app/src/main/assets/stickers/weather/snowflake.png diff --git a/session/src/main/assets/stickers/weather/storm.png b/app/src/main/assets/stickers/weather/storm.png similarity index 100% rename from session/src/main/assets/stickers/weather/storm.png rename to app/src/main/assets/stickers/weather/storm.png diff --git a/session/src/main/assets/stickers/weather/sun.png b/app/src/main/assets/stickers/weather/sun.png similarity index 100% rename from session/src/main/assets/stickers/weather/sun.png rename to app/src/main/assets/stickers/weather/sun.png diff --git a/session/src/main/assets/stickers/weather/temperature-1.png b/app/src/main/assets/stickers/weather/temperature-1.png similarity index 100% rename from session/src/main/assets/stickers/weather/temperature-1.png rename to app/src/main/assets/stickers/weather/temperature-1.png diff --git a/session/src/main/assets/stickers/weather/temperature.png b/app/src/main/assets/stickers/weather/temperature.png similarity index 100% rename from session/src/main/assets/stickers/weather/temperature.png rename to app/src/main/assets/stickers/weather/temperature.png diff --git a/session/src/main/assets/stickers/weather/thermometer-1.png b/app/src/main/assets/stickers/weather/thermometer-1.png similarity index 100% rename from session/src/main/assets/stickers/weather/thermometer-1.png rename to app/src/main/assets/stickers/weather/thermometer-1.png diff --git a/session/src/main/assets/stickers/weather/thermometer-2.png b/app/src/main/assets/stickers/weather/thermometer-2.png similarity index 100% rename from session/src/main/assets/stickers/weather/thermometer-2.png rename to app/src/main/assets/stickers/weather/thermometer-2.png diff --git a/session/src/main/assets/stickers/weather/thermometer.png b/app/src/main/assets/stickers/weather/thermometer.png similarity index 100% rename from session/src/main/assets/stickers/weather/thermometer.png rename to app/src/main/assets/stickers/weather/thermometer.png diff --git a/session/src/main/assets/stickers/weather/tornado.png b/app/src/main/assets/stickers/weather/tornado.png similarity index 100% rename from session/src/main/assets/stickers/weather/tornado.png rename to app/src/main/assets/stickers/weather/tornado.png diff --git a/session/src/main/assets/stickers/weather/wind.png b/app/src/main/assets/stickers/weather/wind.png similarity index 100% rename from session/src/main/assets/stickers/weather/wind.png rename to app/src/main/assets/stickers/weather/wind.png diff --git a/session/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java rename to app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java b/app/src/main/java/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/BaseActionBarActivity.java b/app/src/main/java/org/thoughtcrime/securesms/BaseActionBarActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/BaseActionBarActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/BaseActionBarActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/BaseActivity.java b/app/src/main/java/org/thoughtcrime/securesms/BaseActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/BaseActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/BaseActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/BasicIntroFragment.java b/app/src/main/java/org/thoughtcrime/securesms/BasicIntroFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/BasicIntroFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/BasicIntroFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/BindableConversationItem.java b/app/src/main/java/org/thoughtcrime/securesms/BindableConversationItem.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/BindableConversationItem.java rename to app/src/main/java/org/thoughtcrime/securesms/BindableConversationItem.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/BindableConversationListItem.java b/app/src/main/java/org/thoughtcrime/securesms/BindableConversationListItem.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/BindableConversationListItem.java rename to app/src/main/java/org/thoughtcrime/securesms/BindableConversationListItem.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/BlockedContactsActivity.java b/app/src/main/java/org/thoughtcrime/securesms/BlockedContactsActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/BlockedContactsActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/BlockedContactsActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/ClearProfileAvatarActivity.java b/app/src/main/java/org/thoughtcrime/securesms/ClearProfileAvatarActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/ClearProfileAvatarActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/ClearProfileAvatarActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/ConfirmIdentityDialog.java b/app/src/main/java/org/thoughtcrime/securesms/ConfirmIdentityDialog.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/ConfirmIdentityDialog.java rename to app/src/main/java/org/thoughtcrime/securesms/ConfirmIdentityDialog.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/ContactSelectionActivity.java b/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/ContactSelectionActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/ContactSelectionActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java b/app/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/ConversationListAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/ConversationListAdapter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/ConversationListAdapter.java rename to app/src/main/java/org/thoughtcrime/securesms/ConversationListAdapter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/ConversationListArchiveActivity.java b/app/src/main/java/org/thoughtcrime/securesms/ConversationListArchiveActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/ConversationListArchiveActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/ConversationListArchiveActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/ConversationListFragment.java b/app/src/main/java/org/thoughtcrime/securesms/ConversationListFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/ConversationListFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/ConversationListFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/ConversationListItem.java b/app/src/main/java/org/thoughtcrime/securesms/ConversationListItem.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/ConversationListItem.java rename to app/src/main/java/org/thoughtcrime/securesms/ConversationListItem.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/ConversationListItemAction.java b/app/src/main/java/org/thoughtcrime/securesms/ConversationListItemAction.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/ConversationListItemAction.java rename to app/src/main/java/org/thoughtcrime/securesms/ConversationListItemAction.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/ConversationListItemInboxZero.java b/app/src/main/java/org/thoughtcrime/securesms/ConversationListItemInboxZero.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/ConversationListItemInboxZero.java rename to app/src/main/java/org/thoughtcrime/securesms/ConversationListItemInboxZero.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/CountrySelectionActivity.java b/app/src/main/java/org/thoughtcrime/securesms/CountrySelectionActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/CountrySelectionActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/CountrySelectionActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/CountrySelectionFragment.java b/app/src/main/java/org/thoughtcrime/securesms/CountrySelectionFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/CountrySelectionFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/CountrySelectionFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/CreateProfileActivity.java b/app/src/main/java/org/thoughtcrime/securesms/CreateProfileActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/CreateProfileActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/CreateProfileActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/DatabaseMigrationActivity.java b/app/src/main/java/org/thoughtcrime/securesms/DatabaseMigrationActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/DatabaseMigrationActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/DatabaseMigrationActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/DatabaseUpgradeActivity.java b/app/src/main/java/org/thoughtcrime/securesms/DatabaseUpgradeActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/DatabaseUpgradeActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/DatabaseUpgradeActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/DeviceActivity.java b/app/src/main/java/org/thoughtcrime/securesms/DeviceActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/DeviceActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/DeviceActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/DeviceAddFragment.java b/app/src/main/java/org/thoughtcrime/securesms/DeviceAddFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/DeviceAddFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/DeviceAddFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/DeviceLinkFragment.java b/app/src/main/java/org/thoughtcrime/securesms/DeviceLinkFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/DeviceLinkFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/DeviceLinkFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/DeviceListFragment.java b/app/src/main/java/org/thoughtcrime/securesms/DeviceListFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/DeviceListFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/DeviceListFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/DeviceListItem.java b/app/src/main/java/org/thoughtcrime/securesms/DeviceListItem.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/DeviceListItem.java rename to app/src/main/java/org/thoughtcrime/securesms/DeviceListItem.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/DeviceProvisioningActivity.java b/app/src/main/java/org/thoughtcrime/securesms/DeviceProvisioningActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/DeviceProvisioningActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/DeviceProvisioningActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/DummyActivity.java b/app/src/main/java/org/thoughtcrime/securesms/DummyActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/DummyActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/DummyActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/ExperienceUpgradeActivity.java b/app/src/main/java/org/thoughtcrime/securesms/ExperienceUpgradeActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/ExperienceUpgradeActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/ExperienceUpgradeActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/ExpirationDialog.java b/app/src/main/java/org/thoughtcrime/securesms/ExpirationDialog.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/ExpirationDialog.java rename to app/src/main/java/org/thoughtcrime/securesms/ExpirationDialog.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/GroupCreateActivity.java b/app/src/main/java/org/thoughtcrime/securesms/GroupCreateActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/GroupCreateActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/GroupCreateActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/GroupMembersDialog.java b/app/src/main/java/org/thoughtcrime/securesms/GroupMembersDialog.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/GroupMembersDialog.java rename to app/src/main/java/org/thoughtcrime/securesms/GroupMembersDialog.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/IntroPagerAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/IntroPagerAdapter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/IntroPagerAdapter.java rename to app/src/main/java/org/thoughtcrime/securesms/IntroPagerAdapter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/InviteActivity.java b/app/src/main/java/org/thoughtcrime/securesms/InviteActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/InviteActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/InviteActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/LinkPreviewsIntroFragment.java b/app/src/main/java/org/thoughtcrime/securesms/LinkPreviewsIntroFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/LinkPreviewsIntroFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/LinkPreviewsIntroFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/LogSubmitActivity.java b/app/src/main/java/org/thoughtcrime/securesms/LogSubmitActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/LogSubmitActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/LogSubmitActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/MasterSecretListener.java b/app/src/main/java/org/thoughtcrime/securesms/MasterSecretListener.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/MasterSecretListener.java rename to app/src/main/java/org/thoughtcrime/securesms/MasterSecretListener.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/MediaDocumentsAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/MediaDocumentsAdapter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/MediaDocumentsAdapter.java rename to app/src/main/java/org/thoughtcrime/securesms/MediaDocumentsAdapter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/MediaGalleryAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/MediaGalleryAdapter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/MediaGalleryAdapter.java rename to app/src/main/java/org/thoughtcrime/securesms/MediaGalleryAdapter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/MediaOverviewActivity.java b/app/src/main/java/org/thoughtcrime/securesms/MediaOverviewActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/MediaOverviewActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/MediaOverviewActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/MediaPreviewActivity.java b/app/src/main/java/org/thoughtcrime/securesms/MediaPreviewActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/MediaPreviewActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/MediaPreviewActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/MessageDetailsActivity.java b/app/src/main/java/org/thoughtcrime/securesms/MessageDetailsActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/MessageDetailsActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/MessageDetailsActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/MessageDetailsRecipientAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/MessageDetailsRecipientAdapter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/MessageDetailsRecipientAdapter.java rename to app/src/main/java/org/thoughtcrime/securesms/MessageDetailsRecipientAdapter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/MessageRecipientListItem.java b/app/src/main/java/org/thoughtcrime/securesms/MessageRecipientListItem.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/MessageRecipientListItem.java rename to app/src/main/java/org/thoughtcrime/securesms/MessageRecipientListItem.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/MuteDialog.java b/app/src/main/java/org/thoughtcrime/securesms/MuteDialog.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/MuteDialog.java rename to app/src/main/java/org/thoughtcrime/securesms/MuteDialog.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java b/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/PassphraseActivity.java b/app/src/main/java/org/thoughtcrime/securesms/PassphraseActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/PassphraseActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/PassphraseActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/PassphraseChangeActivity.java b/app/src/main/java/org/thoughtcrime/securesms/PassphraseChangeActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/PassphraseChangeActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/PassphraseChangeActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/PassphraseCreateActivity.java b/app/src/main/java/org/thoughtcrime/securesms/PassphraseCreateActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/PassphraseCreateActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/PassphraseCreateActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/PassphrasePromptActivity.java b/app/src/main/java/org/thoughtcrime/securesms/PassphrasePromptActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/PassphrasePromptActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/PassphrasePromptActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/PassphraseRequiredActionBarActivity.java b/app/src/main/java/org/thoughtcrime/securesms/PassphraseRequiredActionBarActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/PassphraseRequiredActionBarActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/PassphraseRequiredActionBarActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/PromptMmsActivity.java b/app/src/main/java/org/thoughtcrime/securesms/PromptMmsActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/PromptMmsActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/PromptMmsActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/PushContactSelectionActivity.java b/app/src/main/java/org/thoughtcrime/securesms/PushContactSelectionActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/PushContactSelectionActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/PushContactSelectionActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/ReadReceiptsIntroFragment.java b/app/src/main/java/org/thoughtcrime/securesms/ReadReceiptsIntroFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/ReadReceiptsIntroFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/ReadReceiptsIntroFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/RecipientPreferenceActivity.java b/app/src/main/java/org/thoughtcrime/securesms/RecipientPreferenceActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/RecipientPreferenceActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/RecipientPreferenceActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/RegistrationActivity.java b/app/src/main/java/org/thoughtcrime/securesms/RegistrationActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/RegistrationActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/RegistrationActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/ShareActivity.java b/app/src/main/java/org/thoughtcrime/securesms/ShareActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/ShareActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/ShareActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/ShortcutLauncherActivity.java b/app/src/main/java/org/thoughtcrime/securesms/ShortcutLauncherActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/ShortcutLauncherActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/ShortcutLauncherActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/SmsSendtoActivity.java b/app/src/main/java/org/thoughtcrime/securesms/SmsSendtoActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/SmsSendtoActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/SmsSendtoActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/TextSecureExpiredException.java b/app/src/main/java/org/thoughtcrime/securesms/TextSecureExpiredException.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/TextSecureExpiredException.java rename to app/src/main/java/org/thoughtcrime/securesms/TextSecureExpiredException.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/TransportOption.java b/app/src/main/java/org/thoughtcrime/securesms/TransportOption.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/TransportOption.java rename to app/src/main/java/org/thoughtcrime/securesms/TransportOption.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/TransportOptions.java b/app/src/main/java/org/thoughtcrime/securesms/TransportOptions.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/TransportOptions.java rename to app/src/main/java/org/thoughtcrime/securesms/TransportOptions.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/TransportOptionsAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/TransportOptionsAdapter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/TransportOptionsAdapter.java rename to app/src/main/java/org/thoughtcrime/securesms/TransportOptionsAdapter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/TransportOptionsPopup.java b/app/src/main/java/org/thoughtcrime/securesms/TransportOptionsPopup.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/TransportOptionsPopup.java rename to app/src/main/java/org/thoughtcrime/securesms/TransportOptionsPopup.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/TypingIndicatorIntroFragment.java b/app/src/main/java/org/thoughtcrime/securesms/TypingIndicatorIntroFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/TypingIndicatorIntroFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/TypingIndicatorIntroFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/Unbindable.java b/app/src/main/java/org/thoughtcrime/securesms/Unbindable.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/Unbindable.java rename to app/src/main/java/org/thoughtcrime/securesms/Unbindable.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/VerifyIdentityActivity.java b/app/src/main/java/org/thoughtcrime/securesms/VerifyIdentityActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/VerifyIdentityActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/VerifyIdentityActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java b/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/animation/AnimationCompleteListener.java b/app/src/main/java/org/thoughtcrime/securesms/animation/AnimationCompleteListener.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/animation/AnimationCompleteListener.java rename to app/src/main/java/org/thoughtcrime/securesms/animation/AnimationCompleteListener.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/attachments/Attachment.java b/app/src/main/java/org/thoughtcrime/securesms/attachments/Attachment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/attachments/Attachment.java rename to app/src/main/java/org/thoughtcrime/securesms/attachments/Attachment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/attachments/AttachmentId.java b/app/src/main/java/org/thoughtcrime/securesms/attachments/AttachmentId.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/attachments/AttachmentId.java rename to app/src/main/java/org/thoughtcrime/securesms/attachments/AttachmentId.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/attachments/AttachmentServer.java b/app/src/main/java/org/thoughtcrime/securesms/attachments/AttachmentServer.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/attachments/AttachmentServer.java rename to app/src/main/java/org/thoughtcrime/securesms/attachments/AttachmentServer.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachment.java b/app/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachment.java rename to app/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachmentAudioExtras.kt b/app/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachmentAudioExtras.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachmentAudioExtras.kt rename to app/src/main/java/org/thoughtcrime/securesms/attachments/DatabaseAttachmentAudioExtras.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/attachments/MmsNotificationAttachment.java b/app/src/main/java/org/thoughtcrime/securesms/attachments/MmsNotificationAttachment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/attachments/MmsNotificationAttachment.java rename to app/src/main/java/org/thoughtcrime/securesms/attachments/MmsNotificationAttachment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/attachments/PointerAttachment.java b/app/src/main/java/org/thoughtcrime/securesms/attachments/PointerAttachment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/attachments/PointerAttachment.java rename to app/src/main/java/org/thoughtcrime/securesms/attachments/PointerAttachment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/attachments/UriAttachment.java b/app/src/main/java/org/thoughtcrime/securesms/attachments/UriAttachment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/attachments/UriAttachment.java rename to app/src/main/java/org/thoughtcrime/securesms/attachments/UriAttachment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/audio/AudioCodec.java b/app/src/main/java/org/thoughtcrime/securesms/audio/AudioCodec.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/audio/AudioCodec.java rename to app/src/main/java/org/thoughtcrime/securesms/audio/AudioCodec.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/audio/AudioRecorder.java b/app/src/main/java/org/thoughtcrime/securesms/audio/AudioRecorder.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/audio/AudioRecorder.java rename to app/src/main/java/org/thoughtcrime/securesms/audio/AudioRecorder.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/audio/AudioSlidePlayer.java b/app/src/main/java/org/thoughtcrime/securesms/audio/AudioSlidePlayer.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/audio/AudioSlidePlayer.java rename to app/src/main/java/org/thoughtcrime/securesms/audio/AudioSlidePlayer.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/avatar/AvatarSelection.java b/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarSelection.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/avatar/AvatarSelection.java rename to app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarSelection.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/backup/BackupDialog.java b/app/src/main/java/org/thoughtcrime/securesms/backup/BackupDialog.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/backup/BackupDialog.java rename to app/src/main/java/org/thoughtcrime/securesms/backup/BackupDialog.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/backup/BackupEvent.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/BackupEvent.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/backup/BackupEvent.kt rename to app/src/main/java/org/thoughtcrime/securesms/backup/BackupEvent.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/backup/BackupPassphrase.java b/app/src/main/java/org/thoughtcrime/securesms/backup/BackupPassphrase.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/backup/BackupPassphrase.java rename to app/src/main/java/org/thoughtcrime/securesms/backup/BackupPassphrase.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/backup/BackupProtos.java b/app/src/main/java/org/thoughtcrime/securesms/backup/BackupProtos.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/backup/BackupProtos.java rename to app/src/main/java/org/thoughtcrime/securesms/backup/BackupProtos.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/backup/FullBackupExporter.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupExporter.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/backup/FullBackupExporter.kt rename to app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupExporter.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/backup/FullBackupImporter.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupImporter.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/backup/FullBackupImporter.kt rename to app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupImporter.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/color/MaterialColor.java b/app/src/main/java/org/thoughtcrime/securesms/color/MaterialColor.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/color/MaterialColor.java rename to app/src/main/java/org/thoughtcrime/securesms/color/MaterialColor.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/color/MaterialColors.java b/app/src/main/java/org/thoughtcrime/securesms/color/MaterialColors.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/color/MaterialColors.java rename to app/src/main/java/org/thoughtcrime/securesms/color/MaterialColors.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/AccessibleToggleButton.java b/app/src/main/java/org/thoughtcrime/securesms/components/AccessibleToggleButton.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/AccessibleToggleButton.java rename to app/src/main/java/org/thoughtcrime/securesms/components/AccessibleToggleButton.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/AlbumThumbnailView.java b/app/src/main/java/org/thoughtcrime/securesms/components/AlbumThumbnailView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/AlbumThumbnailView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/AlbumThumbnailView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/AlertView.java b/app/src/main/java/org/thoughtcrime/securesms/components/AlertView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/AlertView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/AlertView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/AnimatingToggle.java b/app/src/main/java/org/thoughtcrime/securesms/components/AnimatingToggle.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/AnimatingToggle.java rename to app/src/main/java/org/thoughtcrime/securesms/components/AnimatingToggle.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/AttachmentTypeSelector.java b/app/src/main/java/org/thoughtcrime/securesms/components/AttachmentTypeSelector.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/AttachmentTypeSelector.java rename to app/src/main/java/org/thoughtcrime/securesms/components/AttachmentTypeSelector.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/AvatarImageView.java b/app/src/main/java/org/thoughtcrime/securesms/components/AvatarImageView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/AvatarImageView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/AvatarImageView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/BubbleDrawableBuilder.java b/app/src/main/java/org/thoughtcrime/securesms/components/BubbleDrawableBuilder.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/BubbleDrawableBuilder.java rename to app/src/main/java/org/thoughtcrime/securesms/components/BubbleDrawableBuilder.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/CircleColorImageView.java b/app/src/main/java/org/thoughtcrime/securesms/components/CircleColorImageView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/CircleColorImageView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/CircleColorImageView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java b/app/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java rename to app/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/ContactFilterToolbar.java b/app/src/main/java/org/thoughtcrime/securesms/components/ContactFilterToolbar.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/ContactFilterToolbar.java rename to app/src/main/java/org/thoughtcrime/securesms/components/ContactFilterToolbar.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/ControllableTabLayout.java b/app/src/main/java/org/thoughtcrime/securesms/components/ControllableTabLayout.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/ControllableTabLayout.java rename to app/src/main/java/org/thoughtcrime/securesms/components/ControllableTabLayout.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/ControllableViewPager.java b/app/src/main/java/org/thoughtcrime/securesms/components/ControllableViewPager.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/ControllableViewPager.java rename to app/src/main/java/org/thoughtcrime/securesms/components/ControllableViewPager.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java b/app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java rename to app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/ConversationItemThumbnail.java b/app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemThumbnail.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/ConversationItemThumbnail.java rename to app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemThumbnail.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/ConversationSearchBottomBar.java b/app/src/main/java/org/thoughtcrime/securesms/components/ConversationSearchBottomBar.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/ConversationSearchBottomBar.java rename to app/src/main/java/org/thoughtcrime/securesms/components/ConversationSearchBottomBar.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/ConversationTypingView.java b/app/src/main/java/org/thoughtcrime/securesms/components/ConversationTypingView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/ConversationTypingView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/ConversationTypingView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/CornerMask.java b/app/src/main/java/org/thoughtcrime/securesms/components/CornerMask.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/CornerMask.java rename to app/src/main/java/org/thoughtcrime/securesms/components/CornerMask.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/CustomDefaultPreference.java b/app/src/main/java/org/thoughtcrime/securesms/components/CustomDefaultPreference.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/CustomDefaultPreference.java rename to app/src/main/java/org/thoughtcrime/securesms/components/CustomDefaultPreference.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/DeliveryStatusView.java b/app/src/main/java/org/thoughtcrime/securesms/components/DeliveryStatusView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/DeliveryStatusView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/DeliveryStatusView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/DocumentView.java b/app/src/main/java/org/thoughtcrime/securesms/components/DocumentView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/DocumentView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/DocumentView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/ExpirationTimerView.java b/app/src/main/java/org/thoughtcrime/securesms/components/ExpirationTimerView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/ExpirationTimerView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/ExpirationTimerView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/FromTextView.java b/app/src/main/java/org/thoughtcrime/securesms/components/FromTextView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/FromTextView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/FromTextView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/GlideBitmapListeningTarget.java b/app/src/main/java/org/thoughtcrime/securesms/components/GlideBitmapListeningTarget.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/GlideBitmapListeningTarget.java rename to app/src/main/java/org/thoughtcrime/securesms/components/GlideBitmapListeningTarget.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/GlideDrawableListeningTarget.java b/app/src/main/java/org/thoughtcrime/securesms/components/GlideDrawableListeningTarget.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/GlideDrawableListeningTarget.java rename to app/src/main/java/org/thoughtcrime/securesms/components/GlideDrawableListeningTarget.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/HidingLinearLayout.java b/app/src/main/java/org/thoughtcrime/securesms/components/HidingLinearLayout.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/HidingLinearLayout.java rename to app/src/main/java/org/thoughtcrime/securesms/components/HidingLinearLayout.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/HourglassView.java b/app/src/main/java/org/thoughtcrime/securesms/components/HourglassView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/HourglassView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/HourglassView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/ImageDivet.java b/app/src/main/java/org/thoughtcrime/securesms/components/ImageDivet.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/ImageDivet.java rename to app/src/main/java/org/thoughtcrime/securesms/components/ImageDivet.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/InputAwareLayout.java b/app/src/main/java/org/thoughtcrime/securesms/components/InputAwareLayout.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/InputAwareLayout.java rename to app/src/main/java/org/thoughtcrime/securesms/components/InputAwareLayout.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java b/app/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java rename to app/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/KeyboardAwareLinearLayout.java b/app/src/main/java/org/thoughtcrime/securesms/components/KeyboardAwareLinearLayout.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/KeyboardAwareLinearLayout.java rename to app/src/main/java/org/thoughtcrime/securesms/components/KeyboardAwareLinearLayout.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/LabeledEditText.java b/app/src/main/java/org/thoughtcrime/securesms/components/LabeledEditText.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/LabeledEditText.java rename to app/src/main/java/org/thoughtcrime/securesms/components/LabeledEditText.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/LinkPreviewView.java b/app/src/main/java/org/thoughtcrime/securesms/components/LinkPreviewView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/LinkPreviewView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/LinkPreviewView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/MaxHeightScrollView.java b/app/src/main/java/org/thoughtcrime/securesms/components/MaxHeightScrollView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/MaxHeightScrollView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/MaxHeightScrollView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/MediaView.java b/app/src/main/java/org/thoughtcrime/securesms/components/MediaView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/MediaView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/MediaView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/MicrophoneRecorderView.java b/app/src/main/java/org/thoughtcrime/securesms/components/MicrophoneRecorderView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/MicrophoneRecorderView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/MicrophoneRecorderView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/OutlinedThumbnailView.java b/app/src/main/java/org/thoughtcrime/securesms/components/OutlinedThumbnailView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/OutlinedThumbnailView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/OutlinedThumbnailView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/Outliner.java b/app/src/main/java/org/thoughtcrime/securesms/components/Outliner.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/Outliner.java rename to app/src/main/java/org/thoughtcrime/securesms/components/Outliner.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/PushRecipientsPanel.java b/app/src/main/java/org/thoughtcrime/securesms/components/PushRecipientsPanel.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/PushRecipientsPanel.java rename to app/src/main/java/org/thoughtcrime/securesms/components/PushRecipientsPanel.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/QuoteView.java b/app/src/main/java/org/thoughtcrime/securesms/components/QuoteView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/QuoteView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/QuoteView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/RatingManager.java b/app/src/main/java/org/thoughtcrime/securesms/components/RatingManager.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/RatingManager.java rename to app/src/main/java/org/thoughtcrime/securesms/components/RatingManager.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/RecentPhotoViewRail.java b/app/src/main/java/org/thoughtcrime/securesms/components/RecentPhotoViewRail.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/RecentPhotoViewRail.java rename to app/src/main/java/org/thoughtcrime/securesms/components/RecentPhotoViewRail.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/RecyclerViewFastScroller.java b/app/src/main/java/org/thoughtcrime/securesms/components/RecyclerViewFastScroller.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/RecyclerViewFastScroller.java rename to app/src/main/java/org/thoughtcrime/securesms/components/RecyclerViewFastScroller.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/RemovableEditableMediaView.java b/app/src/main/java/org/thoughtcrime/securesms/components/RemovableEditableMediaView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/RemovableEditableMediaView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/RemovableEditableMediaView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/RepeatableImageKey.java b/app/src/main/java/org/thoughtcrime/securesms/components/RepeatableImageKey.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/RepeatableImageKey.java rename to app/src/main/java/org/thoughtcrime/securesms/components/RepeatableImageKey.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/SearchToolbar.java b/app/src/main/java/org/thoughtcrime/securesms/components/SearchToolbar.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/SearchToolbar.java rename to app/src/main/java/org/thoughtcrime/securesms/components/SearchToolbar.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/SendButton.java b/app/src/main/java/org/thoughtcrime/securesms/components/SendButton.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/SendButton.java rename to app/src/main/java/org/thoughtcrime/securesms/components/SendButton.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/ShapeScrim.java b/app/src/main/java/org/thoughtcrime/securesms/components/ShapeScrim.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/ShapeScrim.java rename to app/src/main/java/org/thoughtcrime/securesms/components/ShapeScrim.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/SharedContactView.java b/app/src/main/java/org/thoughtcrime/securesms/components/SharedContactView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/SharedContactView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/SharedContactView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/SquareFrameLayout.java b/app/src/main/java/org/thoughtcrime/securesms/components/SquareFrameLayout.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/SquareFrameLayout.java rename to app/src/main/java/org/thoughtcrime/securesms/components/SquareFrameLayout.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/SquareImageView.java b/app/src/main/java/org/thoughtcrime/securesms/components/SquareImageView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/SquareImageView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/SquareImageView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/SquareLinearLayout.java b/app/src/main/java/org/thoughtcrime/securesms/components/SquareLinearLayout.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/SquareLinearLayout.java rename to app/src/main/java/org/thoughtcrime/securesms/components/SquareLinearLayout.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/StickerView.java b/app/src/main/java/org/thoughtcrime/securesms/components/StickerView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/StickerView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/StickerView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/SwitchPreferenceCompat.java b/app/src/main/java/org/thoughtcrime/securesms/components/SwitchPreferenceCompat.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/SwitchPreferenceCompat.java rename to app/src/main/java/org/thoughtcrime/securesms/components/SwitchPreferenceCompat.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/ThreadPhotoRailView.java b/app/src/main/java/org/thoughtcrime/securesms/components/ThreadPhotoRailView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/ThreadPhotoRailView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/ThreadPhotoRailView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/ThumbnailView.java b/app/src/main/java/org/thoughtcrime/securesms/components/ThumbnailView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/ThumbnailView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/ThumbnailView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/TooltipPopup.java b/app/src/main/java/org/thoughtcrime/securesms/components/TooltipPopup.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/TooltipPopup.java rename to app/src/main/java/org/thoughtcrime/securesms/components/TooltipPopup.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/TransferControlView.java b/app/src/main/java/org/thoughtcrime/securesms/components/TransferControlView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/TransferControlView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/TransferControlView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/TypingIndicatorView.java b/app/src/main/java/org/thoughtcrime/securesms/components/TypingIndicatorView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/TypingIndicatorView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/TypingIndicatorView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/TypingStatusRepository.java b/app/src/main/java/org/thoughtcrime/securesms/components/TypingStatusRepository.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/TypingStatusRepository.java rename to app/src/main/java/org/thoughtcrime/securesms/components/TypingStatusRepository.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/TypingStatusSender.java b/app/src/main/java/org/thoughtcrime/securesms/components/TypingStatusSender.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/TypingStatusSender.java rename to app/src/main/java/org/thoughtcrime/securesms/components/TypingStatusSender.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/ZoomingImageView.java b/app/src/main/java/org/thoughtcrime/securesms/components/ZoomingImageView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/ZoomingImageView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/ZoomingImageView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/camera/CameraSurfaceView.java b/app/src/main/java/org/thoughtcrime/securesms/components/camera/CameraSurfaceView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/camera/CameraSurfaceView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/camera/CameraSurfaceView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/camera/CameraUtils.java b/app/src/main/java/org/thoughtcrime/securesms/components/camera/CameraUtils.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/camera/CameraUtils.java rename to app/src/main/java/org/thoughtcrime/securesms/components/camera/CameraUtils.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/camera/CameraView.java b/app/src/main/java/org/thoughtcrime/securesms/components/camera/CameraView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/camera/CameraView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/camera/CameraView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/emoji/AnimatingImageSpan.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/AnimatingImageSpan.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/emoji/AnimatingImageSpan.java rename to app/src/main/java/org/thoughtcrime/securesms/components/emoji/AnimatingImageSpan.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/emoji/AsciiEmojiView.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/AsciiEmojiView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/emoji/AsciiEmojiView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/emoji/AsciiEmojiView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/emoji/CompositeEmojiPageModel.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/CompositeEmojiPageModel.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/emoji/CompositeEmojiPageModel.java rename to app/src/main/java/org/thoughtcrime/securesms/components/emoji/CompositeEmojiPageModel.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/emoji/Emoji.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/Emoji.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/emoji/Emoji.java rename to app/src/main/java/org/thoughtcrime/securesms/components/emoji/Emoji.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiEditText.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiEditText.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiEditText.java rename to app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiEditText.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiFilter.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiFilter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiFilter.java rename to app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiFilter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiKeyboardProvider.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiKeyboardProvider.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiKeyboardProvider.java rename to app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiKeyboardProvider.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPageModel.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPageModel.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPageModel.java rename to app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPageModel.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPageView.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPageView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPageView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPageView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPageViewGridAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPageViewGridAdapter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPageViewGridAdapter.java rename to app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPageViewGridAdapter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPages.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPages.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPages.java rename to app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPages.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiProvider.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiProvider.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiProvider.java rename to app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiProvider.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiSpan.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiSpan.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiSpan.java rename to app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiSpan.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiStrings.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiStrings.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiStrings.java rename to app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiStrings.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiTextView.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiTextView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiTextView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiTextView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiToggle.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiToggle.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiToggle.java rename to app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiToggle.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiVariationSelectorPopup.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiVariationSelectorPopup.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiVariationSelectorPopup.java rename to app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiVariationSelectorPopup.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/emoji/MediaKeyboard.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/MediaKeyboard.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/emoji/MediaKeyboard.java rename to app/src/main/java/org/thoughtcrime/securesms/components/emoji/MediaKeyboard.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/emoji/MediaKeyboardBottomTabAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/MediaKeyboardBottomTabAdapter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/emoji/MediaKeyboardBottomTabAdapter.java rename to app/src/main/java/org/thoughtcrime/securesms/components/emoji/MediaKeyboardBottomTabAdapter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/emoji/MediaKeyboardProvider.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/MediaKeyboardProvider.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/emoji/MediaKeyboardProvider.java rename to app/src/main/java/org/thoughtcrime/securesms/components/emoji/MediaKeyboardProvider.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/emoji/RecentEmojiPageModel.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/RecentEmojiPageModel.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/emoji/RecentEmojiPageModel.java rename to app/src/main/java/org/thoughtcrime/securesms/components/emoji/RecentEmojiPageModel.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/emoji/StaticEmojiPageModel.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/StaticEmojiPageModel.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/emoji/StaticEmojiPageModel.java rename to app/src/main/java/org/thoughtcrime/securesms/components/emoji/StaticEmojiPageModel.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/EmojiDrawInfo.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/EmojiDrawInfo.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/EmojiDrawInfo.java rename to app/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/EmojiDrawInfo.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/EmojiPageBitmap.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/EmojiPageBitmap.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/EmojiPageBitmap.java rename to app/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/EmojiPageBitmap.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/EmojiParser.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/EmojiParser.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/EmojiParser.java rename to app/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/EmojiParser.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/EmojiTree.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/EmojiTree.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/EmojiTree.java rename to app/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/EmojiTree.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/Fitzpatrick.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/Fitzpatrick.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/Fitzpatrick.java rename to app/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/Fitzpatrick.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/identity/UntrustedSendDialog.java b/app/src/main/java/org/thoughtcrime/securesms/components/identity/UntrustedSendDialog.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/identity/UntrustedSendDialog.java rename to app/src/main/java/org/thoughtcrime/securesms/components/identity/UntrustedSendDialog.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/identity/UnverifiedBannerView.java b/app/src/main/java/org/thoughtcrime/securesms/components/identity/UnverifiedBannerView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/identity/UnverifiedBannerView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/identity/UnverifiedBannerView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/identity/UnverifiedSendDialog.java b/app/src/main/java/org/thoughtcrime/securesms/components/identity/UnverifiedSendDialog.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/identity/UnverifiedSendDialog.java rename to app/src/main/java/org/thoughtcrime/securesms/components/identity/UnverifiedSendDialog.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/location/SignalMapView.java b/app/src/main/java/org/thoughtcrime/securesms/components/location/SignalMapView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/location/SignalMapView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/location/SignalMapView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/location/SignalPlace.java b/app/src/main/java/org/thoughtcrime/securesms/components/location/SignalPlace.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/location/SignalPlace.java rename to app/src/main/java/org/thoughtcrime/securesms/components/location/SignalPlace.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/recyclerview/DeleteItemAnimator.java b/app/src/main/java/org/thoughtcrime/securesms/components/recyclerview/DeleteItemAnimator.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/recyclerview/DeleteItemAnimator.java rename to app/src/main/java/org/thoughtcrime/securesms/components/recyclerview/DeleteItemAnimator.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/recyclerview/SmoothScrollingLinearLayoutManager.java b/app/src/main/java/org/thoughtcrime/securesms/components/recyclerview/SmoothScrollingLinearLayoutManager.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/recyclerview/SmoothScrollingLinearLayoutManager.java rename to app/src/main/java/org/thoughtcrime/securesms/components/recyclerview/SmoothScrollingLinearLayoutManager.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/registration/CallMeCountDownView.java b/app/src/main/java/org/thoughtcrime/securesms/components/registration/CallMeCountDownView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/registration/CallMeCountDownView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/registration/CallMeCountDownView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/registration/PulsingFloatingActionButton.java b/app/src/main/java/org/thoughtcrime/securesms/components/registration/PulsingFloatingActionButton.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/registration/PulsingFloatingActionButton.java rename to app/src/main/java/org/thoughtcrime/securesms/components/registration/PulsingFloatingActionButton.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/registration/VerificationCodeView.java b/app/src/main/java/org/thoughtcrime/securesms/components/registration/VerificationCodeView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/registration/VerificationCodeView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/registration/VerificationCodeView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/registration/VerificationPinKeyboard.java b/app/src/main/java/org/thoughtcrime/securesms/components/registration/VerificationPinKeyboard.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/registration/VerificationPinKeyboard.java rename to app/src/main/java/org/thoughtcrime/securesms/components/registration/VerificationPinKeyboard.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/reminder/DefaultSmsReminder.java b/app/src/main/java/org/thoughtcrime/securesms/components/reminder/DefaultSmsReminder.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/reminder/DefaultSmsReminder.java rename to app/src/main/java/org/thoughtcrime/securesms/components/reminder/DefaultSmsReminder.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/reminder/DozeReminder.java b/app/src/main/java/org/thoughtcrime/securesms/components/reminder/DozeReminder.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/reminder/DozeReminder.java rename to app/src/main/java/org/thoughtcrime/securesms/components/reminder/DozeReminder.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/reminder/ExpiredBuildReminder.java b/app/src/main/java/org/thoughtcrime/securesms/components/reminder/ExpiredBuildReminder.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/reminder/ExpiredBuildReminder.java rename to app/src/main/java/org/thoughtcrime/securesms/components/reminder/ExpiredBuildReminder.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/reminder/InviteReminder.java b/app/src/main/java/org/thoughtcrime/securesms/components/reminder/InviteReminder.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/reminder/InviteReminder.java rename to app/src/main/java/org/thoughtcrime/securesms/components/reminder/InviteReminder.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/reminder/OutdatedBuildReminder.java b/app/src/main/java/org/thoughtcrime/securesms/components/reminder/OutdatedBuildReminder.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/reminder/OutdatedBuildReminder.java rename to app/src/main/java/org/thoughtcrime/securesms/components/reminder/OutdatedBuildReminder.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/reminder/PushRegistrationReminder.java b/app/src/main/java/org/thoughtcrime/securesms/components/reminder/PushRegistrationReminder.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/reminder/PushRegistrationReminder.java rename to app/src/main/java/org/thoughtcrime/securesms/components/reminder/PushRegistrationReminder.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/reminder/Reminder.java b/app/src/main/java/org/thoughtcrime/securesms/components/reminder/Reminder.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/reminder/Reminder.java rename to app/src/main/java/org/thoughtcrime/securesms/components/reminder/Reminder.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/reminder/ReminderView.java b/app/src/main/java/org/thoughtcrime/securesms/components/reminder/ReminderView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/reminder/ReminderView.java rename to app/src/main/java/org/thoughtcrime/securesms/components/reminder/ReminderView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/reminder/ServiceOutageReminder.java b/app/src/main/java/org/thoughtcrime/securesms/components/reminder/ServiceOutageReminder.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/reminder/ServiceOutageReminder.java rename to app/src/main/java/org/thoughtcrime/securesms/components/reminder/ServiceOutageReminder.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/reminder/ShareReminder.java b/app/src/main/java/org/thoughtcrime/securesms/components/reminder/ShareReminder.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/reminder/ShareReminder.java rename to app/src/main/java/org/thoughtcrime/securesms/components/reminder/ShareReminder.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/reminder/SystemSmsImportReminder.java b/app/src/main/java/org/thoughtcrime/securesms/components/reminder/SystemSmsImportReminder.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/reminder/SystemSmsImportReminder.java rename to app/src/main/java/org/thoughtcrime/securesms/components/reminder/SystemSmsImportReminder.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/reminder/UnauthorizedReminder.java b/app/src/main/java/org/thoughtcrime/securesms/components/reminder/UnauthorizedReminder.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/reminder/UnauthorizedReminder.java rename to app/src/main/java/org/thoughtcrime/securesms/components/reminder/UnauthorizedReminder.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/subsampling/AttachmentBitmapDecoder.java b/app/src/main/java/org/thoughtcrime/securesms/components/subsampling/AttachmentBitmapDecoder.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/subsampling/AttachmentBitmapDecoder.java rename to app/src/main/java/org/thoughtcrime/securesms/components/subsampling/AttachmentBitmapDecoder.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/subsampling/AttachmentRegionDecoder.java b/app/src/main/java/org/thoughtcrime/securesms/components/subsampling/AttachmentRegionDecoder.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/subsampling/AttachmentRegionDecoder.java rename to app/src/main/java/org/thoughtcrime/securesms/components/subsampling/AttachmentRegionDecoder.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/viewpager/ExtendedOnPageChangedListener.java b/app/src/main/java/org/thoughtcrime/securesms/components/viewpager/ExtendedOnPageChangedListener.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/viewpager/ExtendedOnPageChangedListener.java rename to app/src/main/java/org/thoughtcrime/securesms/components/viewpager/ExtendedOnPageChangedListener.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/viewpager/HackyViewPager.java b/app/src/main/java/org/thoughtcrime/securesms/components/viewpager/HackyViewPager.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/viewpager/HackyViewPager.java rename to app/src/main/java/org/thoughtcrime/securesms/components/viewpager/HackyViewPager.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/webrtc/PercentFrameLayout.java b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/PercentFrameLayout.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/webrtc/PercentFrameLayout.java rename to app/src/main/java/org/thoughtcrime/securesms/components/webrtc/PercentFrameLayout.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcAnswerDeclineButton.java b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcAnswerDeclineButton.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcAnswerDeclineButton.java rename to app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcAnswerDeclineButton.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallControls.java b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallControls.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallControls.java rename to app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallControls.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallScreen.java b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallScreen.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallScreen.java rename to app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallScreen.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contacts/ArrayListCursor.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/ArrayListCursor.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contacts/ArrayListCursor.java rename to app/src/main/java/org/thoughtcrime/securesms/contacts/ArrayListCursor.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contacts/ContactAccessor.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactAccessor.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contacts/ContactAccessor.java rename to app/src/main/java/org/thoughtcrime/securesms/contacts/ContactAccessor.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contacts/ContactIdentityManager.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactIdentityManager.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contacts/ContactIdentityManager.java rename to app/src/main/java/org/thoughtcrime/securesms/contacts/ContactIdentityManager.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contacts/ContactIdentityManagerICS.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactIdentityManagerICS.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contacts/ContactIdentityManagerICS.java rename to app/src/main/java/org/thoughtcrime/securesms/contacts/ContactIdentityManagerICS.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contacts/ContactsCursorLoader.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactsCursorLoader.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contacts/ContactsCursorLoader.java rename to app/src/main/java/org/thoughtcrime/securesms/contacts/ContactsCursorLoader.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contacts/ContactsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactsDatabase.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contacts/ContactsDatabase.java rename to app/src/main/java/org/thoughtcrime/securesms/contacts/ContactsDatabase.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contacts/NameAndNumber.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/NameAndNumber.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contacts/NameAndNumber.java rename to app/src/main/java/org/thoughtcrime/securesms/contacts/NameAndNumber.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contacts/RecipientsAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/RecipientsAdapter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contacts/RecipientsAdapter.java rename to app/src/main/java/org/thoughtcrime/securesms/contacts/RecipientsAdapter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contacts/RecipientsEditor.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/RecipientsEditor.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contacts/RecipientsEditor.java rename to app/src/main/java/org/thoughtcrime/securesms/contacts/RecipientsEditor.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contacts/avatars/ContactColors.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/avatars/ContactColors.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contacts/avatars/ContactColors.java rename to app/src/main/java/org/thoughtcrime/securesms/contacts/avatars/ContactColors.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contacts/avatars/ContactColorsLegacy.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/avatars/ContactColorsLegacy.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contacts/avatars/ContactColorsLegacy.java rename to app/src/main/java/org/thoughtcrime/securesms/contacts/avatars/ContactColorsLegacy.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contacts/avatars/ContactPhoto.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/avatars/ContactPhoto.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contacts/avatars/ContactPhoto.java rename to app/src/main/java/org/thoughtcrime/securesms/contacts/avatars/ContactPhoto.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contacts/avatars/FallbackContactPhoto.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/avatars/FallbackContactPhoto.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contacts/avatars/FallbackContactPhoto.java rename to app/src/main/java/org/thoughtcrime/securesms/contacts/avatars/FallbackContactPhoto.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contacts/avatars/GeneratedContactPhoto.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/avatars/GeneratedContactPhoto.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contacts/avatars/GeneratedContactPhoto.java rename to app/src/main/java/org/thoughtcrime/securesms/contacts/avatars/GeneratedContactPhoto.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contacts/avatars/GroupRecordContactPhoto.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/avatars/GroupRecordContactPhoto.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contacts/avatars/GroupRecordContactPhoto.java rename to app/src/main/java/org/thoughtcrime/securesms/contacts/avatars/GroupRecordContactPhoto.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contacts/avatars/ProfileContactPhoto.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/avatars/ProfileContactPhoto.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contacts/avatars/ProfileContactPhoto.java rename to app/src/main/java/org/thoughtcrime/securesms/contacts/avatars/ProfileContactPhoto.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contacts/avatars/ResourceContactPhoto.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/avatars/ResourceContactPhoto.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contacts/avatars/ResourceContactPhoto.java rename to app/src/main/java/org/thoughtcrime/securesms/contacts/avatars/ResourceContactPhoto.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contacts/avatars/SystemContactPhoto.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/avatars/SystemContactPhoto.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contacts/avatars/SystemContactPhoto.java rename to app/src/main/java/org/thoughtcrime/securesms/contacts/avatars/SystemContactPhoto.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contacts/avatars/TransparentContactPhoto.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/avatars/TransparentContactPhoto.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contacts/avatars/TransparentContactPhoto.java rename to app/src/main/java/org/thoughtcrime/securesms/contacts/avatars/TransparentContactPhoto.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contactshare/Contact.java b/app/src/main/java/org/thoughtcrime/securesms/contactshare/Contact.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contactshare/Contact.java rename to app/src/main/java/org/thoughtcrime/securesms/contactshare/Contact.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contactshare/ContactFieldAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactFieldAdapter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contactshare/ContactFieldAdapter.java rename to app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactFieldAdapter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contactshare/ContactModelMapper.java b/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactModelMapper.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contactshare/ContactModelMapper.java rename to app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactModelMapper.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contactshare/ContactNameEditActivity.java b/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactNameEditActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contactshare/ContactNameEditActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactNameEditActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contactshare/ContactNameEditViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactNameEditViewModel.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contactshare/ContactNameEditViewModel.java rename to app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactNameEditViewModel.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contactshare/ContactRepository.java b/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactRepository.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contactshare/ContactRepository.java rename to app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactRepository.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contactshare/ContactShareEditActivity.java b/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactShareEditActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contactshare/ContactShareEditActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactShareEditActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contactshare/ContactShareEditAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactShareEditAdapter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contactshare/ContactShareEditAdapter.java rename to app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactShareEditAdapter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contactshare/ContactShareEditViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactShareEditViewModel.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contactshare/ContactShareEditViewModel.java rename to app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactShareEditViewModel.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contactshare/ContactUtil.java b/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactUtil.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contactshare/ContactUtil.java rename to app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactUtil.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contactshare/Selectable.java b/app/src/main/java/org/thoughtcrime/securesms/contactshare/Selectable.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contactshare/Selectable.java rename to app/src/main/java/org/thoughtcrime/securesms/contactshare/Selectable.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contactshare/SharedContactDetailsActivity.java b/app/src/main/java/org/thoughtcrime/securesms/contactshare/SharedContactDetailsActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contactshare/SharedContactDetailsActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/contactshare/SharedContactDetailsActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/contactshare/SimpleTextWatcher.java b/app/src/main/java/org/thoughtcrime/securesms/contactshare/SimpleTextWatcher.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/contactshare/SimpleTextWatcher.java rename to app/src/main/java/org/thoughtcrime/securesms/contactshare/SimpleTextWatcher.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/conversation/ConversationAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationAdapter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/conversation/ConversationAdapter.java rename to app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationAdapter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java rename to app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/conversation/ConversationPopupActivity.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationPopupActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/conversation/ConversationPopupActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationPopupActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/conversation/ConversationSearchViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationSearchViewModel.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/conversation/ConversationSearchViewModel.java rename to app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationSearchViewModel.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/conversation/ConversationStickerSuggestionAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationStickerSuggestionAdapter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/conversation/ConversationStickerSuggestionAdapter.java rename to app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationStickerSuggestionAdapter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/conversation/ConversationStickerViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationStickerViewModel.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/conversation/ConversationStickerViewModel.java rename to app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationStickerViewModel.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/conversation/ConversationTitleView.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationTitleView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/conversation/ConversationTitleView.java rename to app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationTitleView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java rename to app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/crypto/AsymmetricMasterCipher.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/AsymmetricMasterCipher.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/crypto/AsymmetricMasterCipher.java rename to app/src/main/java/org/thoughtcrime/securesms/crypto/AsymmetricMasterCipher.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/crypto/AsymmetricMasterSecret.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/AsymmetricMasterSecret.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/crypto/AsymmetricMasterSecret.java rename to app/src/main/java/org/thoughtcrime/securesms/crypto/AsymmetricMasterSecret.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/crypto/AttachmentSecret.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/AttachmentSecret.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/crypto/AttachmentSecret.java rename to app/src/main/java/org/thoughtcrime/securesms/crypto/AttachmentSecret.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/crypto/AttachmentSecretProvider.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/AttachmentSecretProvider.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/crypto/AttachmentSecretProvider.java rename to app/src/main/java/org/thoughtcrime/securesms/crypto/AttachmentSecretProvider.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/crypto/ClassicDecryptingPartInputStream.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/ClassicDecryptingPartInputStream.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/crypto/ClassicDecryptingPartInputStream.java rename to app/src/main/java/org/thoughtcrime/securesms/crypto/ClassicDecryptingPartInputStream.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/crypto/DatabaseSecret.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/DatabaseSecret.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/crypto/DatabaseSecret.java rename to app/src/main/java/org/thoughtcrime/securesms/crypto/DatabaseSecret.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/crypto/DatabaseSecretProvider.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/DatabaseSecretProvider.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/crypto/DatabaseSecretProvider.java rename to app/src/main/java/org/thoughtcrime/securesms/crypto/DatabaseSecretProvider.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/crypto/IdentityKeyParcelable.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/IdentityKeyParcelable.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/crypto/IdentityKeyParcelable.java rename to app/src/main/java/org/thoughtcrime/securesms/crypto/IdentityKeyParcelable.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/crypto/IdentityKeyUtil.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/IdentityKeyUtil.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/crypto/IdentityKeyUtil.java rename to app/src/main/java/org/thoughtcrime/securesms/crypto/IdentityKeyUtil.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/crypto/InvalidPassphraseException.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/InvalidPassphraseException.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/crypto/InvalidPassphraseException.java rename to app/src/main/java/org/thoughtcrime/securesms/crypto/InvalidPassphraseException.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/crypto/KeyStoreHelper.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/KeyStoreHelper.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/crypto/KeyStoreHelper.java rename to app/src/main/java/org/thoughtcrime/securesms/crypto/KeyStoreHelper.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/crypto/MasterCipher.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/MasterCipher.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/crypto/MasterCipher.java rename to app/src/main/java/org/thoughtcrime/securesms/crypto/MasterCipher.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/crypto/MasterSecret.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/MasterSecret.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/crypto/MasterSecret.java rename to app/src/main/java/org/thoughtcrime/securesms/crypto/MasterSecret.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/crypto/MasterSecretUtil.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/MasterSecretUtil.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/crypto/MasterSecretUtil.java rename to app/src/main/java/org/thoughtcrime/securesms/crypto/MasterSecretUtil.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/crypto/ModernDecryptingPartInputStream.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/ModernDecryptingPartInputStream.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/crypto/ModernDecryptingPartInputStream.java rename to app/src/main/java/org/thoughtcrime/securesms/crypto/ModernDecryptingPartInputStream.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/crypto/ModernEncryptingPartOutputStream.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/ModernEncryptingPartOutputStream.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/crypto/ModernEncryptingPartOutputStream.java rename to app/src/main/java/org/thoughtcrime/securesms/crypto/ModernEncryptingPartOutputStream.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/crypto/PreKeyUtil.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/PreKeyUtil.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/crypto/PreKeyUtil.java rename to app/src/main/java/org/thoughtcrime/securesms/crypto/PreKeyUtil.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/crypto/ProfileKeyUtil.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/ProfileKeyUtil.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/crypto/ProfileKeyUtil.java rename to app/src/main/java/org/thoughtcrime/securesms/crypto/ProfileKeyUtil.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/crypto/PublicKey.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/PublicKey.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/crypto/PublicKey.java rename to app/src/main/java/org/thoughtcrime/securesms/crypto/PublicKey.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/crypto/SecurityEvent.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/SecurityEvent.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/crypto/SecurityEvent.java rename to app/src/main/java/org/thoughtcrime/securesms/crypto/SecurityEvent.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/crypto/SessionUtil.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/SessionUtil.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/crypto/SessionUtil.java rename to app/src/main/java/org/thoughtcrime/securesms/crypto/SessionUtil.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/crypto/UnidentifiedAccessUtil.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/UnidentifiedAccessUtil.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/crypto/UnidentifiedAccessUtil.java rename to app/src/main/java/org/thoughtcrime/securesms/crypto/UnidentifiedAccessUtil.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/crypto/storage/SignalProtocolStoreImpl.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/SignalProtocolStoreImpl.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/crypto/storage/SignalProtocolStoreImpl.java rename to app/src/main/java/org/thoughtcrime/securesms/crypto/storage/SignalProtocolStoreImpl.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/crypto/storage/TextSecureIdentityKeyStore.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/TextSecureIdentityKeyStore.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/crypto/storage/TextSecureIdentityKeyStore.java rename to app/src/main/java/org/thoughtcrime/securesms/crypto/storage/TextSecureIdentityKeyStore.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/crypto/storage/TextSecurePreKeyStore.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/TextSecurePreKeyStore.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/crypto/storage/TextSecurePreKeyStore.java rename to app/src/main/java/org/thoughtcrime/securesms/crypto/storage/TextSecurePreKeyStore.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/crypto/storage/TextSecureSessionStore.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/TextSecureSessionStore.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/crypto/storage/TextSecureSessionStore.java rename to app/src/main/java/org/thoughtcrime/securesms/crypto/storage/TextSecureSessionStore.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/Address.java b/app/src/main/java/org/thoughtcrime/securesms/database/Address.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/Address.java rename to app/src/main/java/org/thoughtcrime/securesms/database/Address.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/ApnDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/ApnDatabase.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/ApnDatabase.java rename to app/src/main/java/org/thoughtcrime/securesms/database/ApnDatabase.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/AttachmentDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentDatabase.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/AttachmentDatabase.java rename to app/src/main/java/org/thoughtcrime/securesms/database/AttachmentDatabase.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/ContentValuesBuilder.java b/app/src/main/java/org/thoughtcrime/securesms/database/ContentValuesBuilder.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/ContentValuesBuilder.java rename to app/src/main/java/org/thoughtcrime/securesms/database/ContentValuesBuilder.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/CursorList.java b/app/src/main/java/org/thoughtcrime/securesms/database/CursorList.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/CursorList.java rename to app/src/main/java/org/thoughtcrime/securesms/database/CursorList.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/CursorRecyclerViewAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/database/CursorRecyclerViewAdapter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/CursorRecyclerViewAdapter.java rename to app/src/main/java/org/thoughtcrime/securesms/database/CursorRecyclerViewAdapter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/Database.java b/app/src/main/java/org/thoughtcrime/securesms/database/Database.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/Database.java rename to app/src/main/java/org/thoughtcrime/securesms/database/Database.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/DatabaseContentProviders.java b/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseContentProviders.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/DatabaseContentProviders.java rename to app/src/main/java/org/thoughtcrime/securesms/database/DatabaseContentProviders.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/DatabaseFactory.java b/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseFactory.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/DatabaseFactory.java rename to app/src/main/java/org/thoughtcrime/securesms/database/DatabaseFactory.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/DraftDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/DraftDatabase.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/DraftDatabase.java rename to app/src/main/java/org/thoughtcrime/securesms/database/DraftDatabase.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/EarlyReceiptCache.java b/app/src/main/java/org/thoughtcrime/securesms/database/EarlyReceiptCache.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/EarlyReceiptCache.java rename to app/src/main/java/org/thoughtcrime/securesms/database/EarlyReceiptCache.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/FastCursorRecyclerViewAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/database/FastCursorRecyclerViewAdapter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/FastCursorRecyclerViewAdapter.java rename to app/src/main/java/org/thoughtcrime/securesms/database/FastCursorRecyclerViewAdapter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java rename to app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/GroupReceiptDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/GroupReceiptDatabase.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/GroupReceiptDatabase.java rename to app/src/main/java/org/thoughtcrime/securesms/database/GroupReceiptDatabase.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/IdentityDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/IdentityDatabase.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/IdentityDatabase.java rename to app/src/main/java/org/thoughtcrime/securesms/database/IdentityDatabase.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/JobDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/JobDatabase.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/JobDatabase.java rename to app/src/main/java/org/thoughtcrime/securesms/database/JobDatabase.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/MediaDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MediaDatabase.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/MediaDatabase.java rename to app/src/main/java/org/thoughtcrime/securesms/database/MediaDatabase.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/MessagingDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MessagingDatabase.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/MessagingDatabase.java rename to app/src/main/java/org/thoughtcrime/securesms/database/MessagingDatabase.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java rename to app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/MmsSmsColumns.java b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsColumns.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/MmsSmsColumns.java rename to app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsColumns.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java rename to app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/NoExternalStorageException.java b/app/src/main/java/org/thoughtcrime/securesms/database/NoExternalStorageException.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/NoExternalStorageException.java rename to app/src/main/java/org/thoughtcrime/securesms/database/NoExternalStorageException.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/NoSuchMessageException.java b/app/src/main/java/org/thoughtcrime/securesms/database/NoSuchMessageException.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/NoSuchMessageException.java rename to app/src/main/java/org/thoughtcrime/securesms/database/NoSuchMessageException.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/NotInDirectoryException.java b/app/src/main/java/org/thoughtcrime/securesms/database/NotInDirectoryException.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/NotInDirectoryException.java rename to app/src/main/java/org/thoughtcrime/securesms/database/NotInDirectoryException.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/ObservableContent.java b/app/src/main/java/org/thoughtcrime/securesms/database/ObservableContent.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/ObservableContent.java rename to app/src/main/java/org/thoughtcrime/securesms/database/ObservableContent.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/OneTimePreKeyDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/OneTimePreKeyDatabase.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/OneTimePreKeyDatabase.java rename to app/src/main/java/org/thoughtcrime/securesms/database/OneTimePreKeyDatabase.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/PushDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/PushDatabase.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/PushDatabase.java rename to app/src/main/java/org/thoughtcrime/securesms/database/PushDatabase.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java rename to app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/SearchDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/SearchDatabase.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/SearchDatabase.java rename to app/src/main/java/org/thoughtcrime/securesms/database/SearchDatabase.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/SessionDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/SessionDatabase.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/SessionDatabase.java rename to app/src/main/java/org/thoughtcrime/securesms/database/SessionDatabase.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/SignedPreKeyDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/SignedPreKeyDatabase.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/SignedPreKeyDatabase.java rename to app/src/main/java/org/thoughtcrime/securesms/database/SignedPreKeyDatabase.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java rename to app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/SmsMigrator.java b/app/src/main/java/org/thoughtcrime/securesms/database/SmsMigrator.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/SmsMigrator.java rename to app/src/main/java/org/thoughtcrime/securesms/database/SmsMigrator.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/StickerDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/StickerDatabase.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/StickerDatabase.java rename to app/src/main/java/org/thoughtcrime/securesms/database/StickerDatabase.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java rename to app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/XmlBackup.java b/app/src/main/java/org/thoughtcrime/securesms/database/XmlBackup.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/XmlBackup.java rename to app/src/main/java/org/thoughtcrime/securesms/database/XmlBackup.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/documents/Document.java b/app/src/main/java/org/thoughtcrime/securesms/database/documents/Document.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/documents/Document.java rename to app/src/main/java/org/thoughtcrime/securesms/database/documents/Document.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/documents/IdentityKeyMismatch.java b/app/src/main/java/org/thoughtcrime/securesms/database/documents/IdentityKeyMismatch.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/documents/IdentityKeyMismatch.java rename to app/src/main/java/org/thoughtcrime/securesms/database/documents/IdentityKeyMismatch.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/documents/IdentityKeyMismatchList.java b/app/src/main/java/org/thoughtcrime/securesms/database/documents/IdentityKeyMismatchList.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/documents/IdentityKeyMismatchList.java rename to app/src/main/java/org/thoughtcrime/securesms/database/documents/IdentityKeyMismatchList.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/documents/NetworkFailure.java b/app/src/main/java/org/thoughtcrime/securesms/database/documents/NetworkFailure.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/documents/NetworkFailure.java rename to app/src/main/java/org/thoughtcrime/securesms/database/documents/NetworkFailure.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/documents/NetworkFailureList.java b/app/src/main/java/org/thoughtcrime/securesms/database/documents/NetworkFailureList.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/documents/NetworkFailureList.java rename to app/src/main/java/org/thoughtcrime/securesms/database/documents/NetworkFailureList.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/helpers/ClassicOpenHelper.java b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/ClassicOpenHelper.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/helpers/ClassicOpenHelper.java rename to app/src/main/java/org/thoughtcrime/securesms/database/helpers/ClassicOpenHelper.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/helpers/PreKeyMigrationHelper.java b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/PreKeyMigrationHelper.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/helpers/PreKeyMigrationHelper.java rename to app/src/main/java/org/thoughtcrime/securesms/database/helpers/PreKeyMigrationHelper.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/helpers/SQLCipherMigrationHelper.java b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SQLCipherMigrationHelper.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/helpers/SQLCipherMigrationHelper.java rename to app/src/main/java/org/thoughtcrime/securesms/database/helpers/SQLCipherMigrationHelper.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/helpers/SQLCipherOpenHelper.java b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SQLCipherOpenHelper.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/helpers/SQLCipherOpenHelper.java rename to app/src/main/java/org/thoughtcrime/securesms/database/helpers/SQLCipherOpenHelper.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/helpers/SessionStoreMigrationHelper.java b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SessionStoreMigrationHelper.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/helpers/SessionStoreMigrationHelper.java rename to app/src/main/java/org/thoughtcrime/securesms/database/helpers/SessionStoreMigrationHelper.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/identity/IdentityRecordList.java b/app/src/main/java/org/thoughtcrime/securesms/database/identity/IdentityRecordList.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/identity/IdentityRecordList.java rename to app/src/main/java/org/thoughtcrime/securesms/database/identity/IdentityRecordList.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/loaders/BlockedContactsLoader.java b/app/src/main/java/org/thoughtcrime/securesms/database/loaders/BlockedContactsLoader.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/loaders/BlockedContactsLoader.java rename to app/src/main/java/org/thoughtcrime/securesms/database/loaders/BlockedContactsLoader.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/loaders/BucketedThreadMediaLoader.java b/app/src/main/java/org/thoughtcrime/securesms/database/loaders/BucketedThreadMediaLoader.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/loaders/BucketedThreadMediaLoader.java rename to app/src/main/java/org/thoughtcrime/securesms/database/loaders/BucketedThreadMediaLoader.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/loaders/ConversationListLoader.java b/app/src/main/java/org/thoughtcrime/securesms/database/loaders/ConversationListLoader.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/loaders/ConversationListLoader.java rename to app/src/main/java/org/thoughtcrime/securesms/database/loaders/ConversationListLoader.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/loaders/ConversationLoader.java b/app/src/main/java/org/thoughtcrime/securesms/database/loaders/ConversationLoader.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/loaders/ConversationLoader.java rename to app/src/main/java/org/thoughtcrime/securesms/database/loaders/ConversationLoader.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/loaders/CountryListLoader.java b/app/src/main/java/org/thoughtcrime/securesms/database/loaders/CountryListLoader.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/loaders/CountryListLoader.java rename to app/src/main/java/org/thoughtcrime/securesms/database/loaders/CountryListLoader.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/loaders/DeviceListLoader.java b/app/src/main/java/org/thoughtcrime/securesms/database/loaders/DeviceListLoader.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/loaders/DeviceListLoader.java rename to app/src/main/java/org/thoughtcrime/securesms/database/loaders/DeviceListLoader.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/loaders/MessageDetailsLoader.java b/app/src/main/java/org/thoughtcrime/securesms/database/loaders/MessageDetailsLoader.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/loaders/MessageDetailsLoader.java rename to app/src/main/java/org/thoughtcrime/securesms/database/loaders/MessageDetailsLoader.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/loaders/PagingMediaLoader.java b/app/src/main/java/org/thoughtcrime/securesms/database/loaders/PagingMediaLoader.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/loaders/PagingMediaLoader.java rename to app/src/main/java/org/thoughtcrime/securesms/database/loaders/PagingMediaLoader.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/loaders/RecentPhotosLoader.java b/app/src/main/java/org/thoughtcrime/securesms/database/loaders/RecentPhotosLoader.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/loaders/RecentPhotosLoader.java rename to app/src/main/java/org/thoughtcrime/securesms/database/loaders/RecentPhotosLoader.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/loaders/ThreadMediaLoader.java b/app/src/main/java/org/thoughtcrime/securesms/database/loaders/ThreadMediaLoader.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/loaders/ThreadMediaLoader.java rename to app/src/main/java/org/thoughtcrime/securesms/database/loaders/ThreadMediaLoader.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/model/DisplayRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/DisplayRecord.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/model/DisplayRecord.java rename to app/src/main/java/org/thoughtcrime/securesms/database/model/DisplayRecord.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/model/IncomingSticker.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/IncomingSticker.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/model/IncomingSticker.java rename to app/src/main/java/org/thoughtcrime/securesms/database/model/IncomingSticker.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java rename to app/src/main/java/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java rename to app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/model/MmsMessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/MmsMessageRecord.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/model/MmsMessageRecord.java rename to app/src/main/java/org/thoughtcrime/securesms/database/model/MmsMessageRecord.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/model/NotificationMmsMessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/NotificationMmsMessageRecord.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/model/NotificationMmsMessageRecord.java rename to app/src/main/java/org/thoughtcrime/securesms/database/model/NotificationMmsMessageRecord.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/model/Quote.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/Quote.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/model/Quote.java rename to app/src/main/java/org/thoughtcrime/securesms/database/model/Quote.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java rename to app/src/main/java/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/model/Sticker.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/Sticker.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/model/Sticker.java rename to app/src/main/java/org/thoughtcrime/securesms/database/model/Sticker.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/model/StickerPackRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/StickerPackRecord.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/model/StickerPackRecord.java rename to app/src/main/java/org/thoughtcrime/securesms/database/model/StickerPackRecord.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/model/StickerRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/StickerRecord.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/model/StickerRecord.java rename to app/src/main/java/org/thoughtcrime/securesms/database/model/StickerRecord.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/database/model/ThreadRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/ThreadRecord.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/database/model/ThreadRecord.java rename to app/src/main/java/org/thoughtcrime/securesms/database/model/ThreadRecord.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/dependencies/AxolotlStorageModule.java b/app/src/main/java/org/thoughtcrime/securesms/dependencies/AxolotlStorageModule.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/dependencies/AxolotlStorageModule.java rename to app/src/main/java/org/thoughtcrime/securesms/dependencies/AxolotlStorageModule.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/dependencies/InjectableType.java b/app/src/main/java/org/thoughtcrime/securesms/dependencies/InjectableType.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/dependencies/InjectableType.java rename to app/src/main/java/org/thoughtcrime/securesms/dependencies/InjectableType.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/dependencies/SignalCommunicationModule.java b/app/src/main/java/org/thoughtcrime/securesms/dependencies/SignalCommunicationModule.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/dependencies/SignalCommunicationModule.java rename to app/src/main/java/org/thoughtcrime/securesms/dependencies/SignalCommunicationModule.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/devicelist/Device.java b/app/src/main/java/org/thoughtcrime/securesms/devicelist/Device.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/devicelist/Device.java rename to app/src/main/java/org/thoughtcrime/securesms/devicelist/Device.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/devicelist/DeviceNameProtos.java b/app/src/main/java/org/thoughtcrime/securesms/devicelist/DeviceNameProtos.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/devicelist/DeviceNameProtos.java rename to app/src/main/java/org/thoughtcrime/securesms/devicelist/DeviceNameProtos.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/events/PartProgressEvent.java b/app/src/main/java/org/thoughtcrime/securesms/events/PartProgressEvent.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/events/PartProgressEvent.java rename to app/src/main/java/org/thoughtcrime/securesms/events/PartProgressEvent.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/events/RedPhoneEvent.java b/app/src/main/java/org/thoughtcrime/securesms/events/RedPhoneEvent.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/events/RedPhoneEvent.java rename to app/src/main/java/org/thoughtcrime/securesms/events/RedPhoneEvent.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/events/ReminderUpdateEvent.java b/app/src/main/java/org/thoughtcrime/securesms/events/ReminderUpdateEvent.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/events/ReminderUpdateEvent.java rename to app/src/main/java/org/thoughtcrime/securesms/events/ReminderUpdateEvent.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/events/WebRtcViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/events/WebRtcViewModel.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/events/WebRtcViewModel.java rename to app/src/main/java/org/thoughtcrime/securesms/events/WebRtcViewModel.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/giph/model/ChunkedImageUrl.java b/app/src/main/java/org/thoughtcrime/securesms/giph/model/ChunkedImageUrl.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/giph/model/ChunkedImageUrl.java rename to app/src/main/java/org/thoughtcrime/securesms/giph/model/ChunkedImageUrl.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/giph/model/GiphyImage.java b/app/src/main/java/org/thoughtcrime/securesms/giph/model/GiphyImage.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/giph/model/GiphyImage.java rename to app/src/main/java/org/thoughtcrime/securesms/giph/model/GiphyImage.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/giph/model/GiphyResponse.java b/app/src/main/java/org/thoughtcrime/securesms/giph/model/GiphyResponse.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/giph/model/GiphyResponse.java rename to app/src/main/java/org/thoughtcrime/securesms/giph/model/GiphyResponse.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/giph/net/GiphyGifLoader.java b/app/src/main/java/org/thoughtcrime/securesms/giph/net/GiphyGifLoader.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/giph/net/GiphyGifLoader.java rename to app/src/main/java/org/thoughtcrime/securesms/giph/net/GiphyGifLoader.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/giph/net/GiphyLoader.java b/app/src/main/java/org/thoughtcrime/securesms/giph/net/GiphyLoader.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/giph/net/GiphyLoader.java rename to app/src/main/java/org/thoughtcrime/securesms/giph/net/GiphyLoader.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/giph/net/GiphyStickerLoader.java b/app/src/main/java/org/thoughtcrime/securesms/giph/net/GiphyStickerLoader.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/giph/net/GiphyStickerLoader.java rename to app/src/main/java/org/thoughtcrime/securesms/giph/net/GiphyStickerLoader.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/giph/ui/AspectRatioImageView.java b/app/src/main/java/org/thoughtcrime/securesms/giph/ui/AspectRatioImageView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/giph/ui/AspectRatioImageView.java rename to app/src/main/java/org/thoughtcrime/securesms/giph/ui/AspectRatioImageView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyActivity.java b/app/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyActivityToolbar.java b/app/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyActivityToolbar.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyActivityToolbar.java rename to app/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyActivityToolbar.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyActivityToolbarTextSecurePreferencesPersistence.java b/app/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyActivityToolbarTextSecurePreferencesPersistence.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyActivityToolbarTextSecurePreferencesPersistence.java rename to app/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyActivityToolbarTextSecurePreferencesPersistence.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyAdapter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyAdapter.java rename to app/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyAdapter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyFragment.java b/app/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyGifFragment.java b/app/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyGifFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyGifFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyGifFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyStickerFragment.java b/app/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyStickerFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyStickerFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyStickerFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/giph/util/InfiniteScrollListener.java b/app/src/main/java/org/thoughtcrime/securesms/giph/util/InfiniteScrollListener.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/giph/util/InfiniteScrollListener.java rename to app/src/main/java/org/thoughtcrime/securesms/giph/util/InfiniteScrollListener.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/giph/util/RecyclerViewPositionHelper.java b/app/src/main/java/org/thoughtcrime/securesms/giph/util/RecyclerViewPositionHelper.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/giph/util/RecyclerViewPositionHelper.java rename to app/src/main/java/org/thoughtcrime/securesms/giph/util/RecyclerViewPositionHelper.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/glide/ChunkedImageUrlFetcher.java b/app/src/main/java/org/thoughtcrime/securesms/glide/ChunkedImageUrlFetcher.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/glide/ChunkedImageUrlFetcher.java rename to app/src/main/java/org/thoughtcrime/securesms/glide/ChunkedImageUrlFetcher.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/glide/ChunkedImageUrlLoader.java b/app/src/main/java/org/thoughtcrime/securesms/glide/ChunkedImageUrlLoader.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/glide/ChunkedImageUrlLoader.java rename to app/src/main/java/org/thoughtcrime/securesms/glide/ChunkedImageUrlLoader.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/glide/ContactPhotoFetcher.java b/app/src/main/java/org/thoughtcrime/securesms/glide/ContactPhotoFetcher.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/glide/ContactPhotoFetcher.java rename to app/src/main/java/org/thoughtcrime/securesms/glide/ContactPhotoFetcher.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/glide/ContactPhotoLoader.java b/app/src/main/java/org/thoughtcrime/securesms/glide/ContactPhotoLoader.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/glide/ContactPhotoLoader.java rename to app/src/main/java/org/thoughtcrime/securesms/glide/ContactPhotoLoader.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/glide/OkHttpStreamFetcher.java b/app/src/main/java/org/thoughtcrime/securesms/glide/OkHttpStreamFetcher.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/glide/OkHttpStreamFetcher.java rename to app/src/main/java/org/thoughtcrime/securesms/glide/OkHttpStreamFetcher.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/glide/OkHttpUrlLoader.java b/app/src/main/java/org/thoughtcrime/securesms/glide/OkHttpUrlLoader.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/glide/OkHttpUrlLoader.java rename to app/src/main/java/org/thoughtcrime/securesms/glide/OkHttpUrlLoader.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/glide/PaddedHeadersInterceptor.java b/app/src/main/java/org/thoughtcrime/securesms/glide/PaddedHeadersInterceptor.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/glide/PaddedHeadersInterceptor.java rename to app/src/main/java/org/thoughtcrime/securesms/glide/PaddedHeadersInterceptor.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/glide/cache/EncryptedBitmapCacheDecoder.java b/app/src/main/java/org/thoughtcrime/securesms/glide/cache/EncryptedBitmapCacheDecoder.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/glide/cache/EncryptedBitmapCacheDecoder.java rename to app/src/main/java/org/thoughtcrime/securesms/glide/cache/EncryptedBitmapCacheDecoder.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/glide/cache/EncryptedBitmapResourceEncoder.java b/app/src/main/java/org/thoughtcrime/securesms/glide/cache/EncryptedBitmapResourceEncoder.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/glide/cache/EncryptedBitmapResourceEncoder.java rename to app/src/main/java/org/thoughtcrime/securesms/glide/cache/EncryptedBitmapResourceEncoder.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/glide/cache/EncryptedCacheEncoder.java b/app/src/main/java/org/thoughtcrime/securesms/glide/cache/EncryptedCacheEncoder.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/glide/cache/EncryptedCacheEncoder.java rename to app/src/main/java/org/thoughtcrime/securesms/glide/cache/EncryptedCacheEncoder.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/glide/cache/EncryptedCoder.java b/app/src/main/java/org/thoughtcrime/securesms/glide/cache/EncryptedCoder.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/glide/cache/EncryptedCoder.java rename to app/src/main/java/org/thoughtcrime/securesms/glide/cache/EncryptedCoder.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/glide/cache/EncryptedGifCacheDecoder.java b/app/src/main/java/org/thoughtcrime/securesms/glide/cache/EncryptedGifCacheDecoder.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/glide/cache/EncryptedGifCacheDecoder.java rename to app/src/main/java/org/thoughtcrime/securesms/glide/cache/EncryptedGifCacheDecoder.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/glide/cache/EncryptedGifDrawableResourceEncoder.java b/app/src/main/java/org/thoughtcrime/securesms/glide/cache/EncryptedGifDrawableResourceEncoder.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/glide/cache/EncryptedGifDrawableResourceEncoder.java rename to app/src/main/java/org/thoughtcrime/securesms/glide/cache/EncryptedGifDrawableResourceEncoder.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/groups/GroupManager.java b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManager.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/groups/GroupManager.java rename to app/src/main/java/org/thoughtcrime/securesms/groups/GroupManager.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/groups/GroupMessageProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupMessageProcessor.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/groups/GroupMessageProcessor.java rename to app/src/main/java/org/thoughtcrime/securesms/groups/GroupMessageProcessor.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/Bounds.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/Bounds.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/Bounds.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/Bounds.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/CanvasMatrix.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/CanvasMatrix.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/CanvasMatrix.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/CanvasMatrix.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/ColorableRenderer.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/ColorableRenderer.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/ColorableRenderer.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/ColorableRenderer.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/DrawingSession.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/DrawingSession.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/DrawingSession.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/DrawingSession.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/EditSession.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/EditSession.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/EditSession.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/EditSession.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/ElementDragEditSession.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/ElementDragEditSession.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/ElementDragEditSession.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/ElementDragEditSession.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/ElementEditSession.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/ElementEditSession.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/ElementEditSession.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/ElementEditSession.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/ElementScaleEditSession.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/ElementScaleEditSession.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/ElementScaleEditSession.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/ElementScaleEditSession.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/HiddenEditText.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/HiddenEditText.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/HiddenEditText.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/HiddenEditText.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/ImageEditorView.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/ImageEditorView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/ImageEditorView.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/ImageEditorView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/Renderer.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/Renderer.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/Renderer.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/Renderer.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/RendererContext.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/RendererContext.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/RendererContext.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/RendererContext.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/ThumbDragEditSession.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/ThumbDragEditSession.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/ThumbDragEditSession.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/ThumbDragEditSession.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/UndoRedoStackListener.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/UndoRedoStackListener.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/UndoRedoStackListener.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/UndoRedoStackListener.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/model/AlphaAnimation.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/AlphaAnimation.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/model/AlphaAnimation.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/AlphaAnimation.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/model/AnimationMatrix.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/AnimationMatrix.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/model/AnimationMatrix.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/AnimationMatrix.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/model/Bisect.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/Bisect.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/model/Bisect.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/Bisect.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/model/CropThumbRenderer.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/CropThumbRenderer.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/model/CropThumbRenderer.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/CropThumbRenderer.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/model/EditorElement.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/EditorElement.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/model/EditorElement.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/EditorElement.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/model/EditorElementHierarchy.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/EditorElementHierarchy.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/model/EditorElementHierarchy.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/EditorElementHierarchy.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/model/EditorFlags.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/EditorFlags.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/model/EditorFlags.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/EditorFlags.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/model/EditorModel.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/EditorModel.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/model/EditorModel.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/EditorModel.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/model/ElementStack.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/ElementStack.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/model/ElementStack.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/ElementStack.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/model/InBoundsMemory.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/InBoundsMemory.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/model/InBoundsMemory.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/InBoundsMemory.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/model/ParcelUtils.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/ParcelUtils.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/model/ParcelUtils.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/ParcelUtils.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/model/ThumbRenderer.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/ThumbRenderer.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/model/ThumbRenderer.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/ThumbRenderer.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/model/UndoRedoStacks.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/UndoRedoStacks.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/model/UndoRedoStacks.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/UndoRedoStacks.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/AutomaticControlPointBezierLine.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/AutomaticControlPointBezierLine.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/AutomaticControlPointBezierLine.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/AutomaticControlPointBezierLine.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/BezierDrawingRenderer.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/BezierDrawingRenderer.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/BezierDrawingRenderer.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/BezierDrawingRenderer.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/CropAreaRenderer.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/CropAreaRenderer.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/CropAreaRenderer.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/CropAreaRenderer.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/InvalidateableRenderer.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/InvalidateableRenderer.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/InvalidateableRenderer.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/InvalidateableRenderer.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/InverseFillRenderer.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/InverseFillRenderer.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/InverseFillRenderer.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/InverseFillRenderer.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/TextRenderer.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/TextRenderer.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/TextRenderer.java rename to app/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/TextRenderer.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/AlarmManagerScheduler.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/AlarmManagerScheduler.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/AlarmManagerScheduler.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/AlarmManagerScheduler.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/CompositeScheduler.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/CompositeScheduler.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/CompositeScheduler.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/CompositeScheduler.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/Constraint.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/Constraint.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/Constraint.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/Constraint.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/ConstraintInstantiator.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/ConstraintInstantiator.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/ConstraintInstantiator.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/ConstraintInstantiator.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/ConstraintObserver.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/ConstraintObserver.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/ConstraintObserver.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/ConstraintObserver.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/Data.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/Data.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/Data.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/Data.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/DependencyInjector.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/DependencyInjector.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/DependencyInjector.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/DependencyInjector.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/ExecutorFactory.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/ExecutorFactory.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/ExecutorFactory.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/ExecutorFactory.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/InAppScheduler.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/InAppScheduler.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/InAppScheduler.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/InAppScheduler.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/Job.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/Job.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/Job.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/Job.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/JobController.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobController.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/JobController.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobController.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/JobInstantiator.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobInstantiator.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/JobInstantiator.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobInstantiator.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/JobLogger.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobLogger.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/JobLogger.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobLogger.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/JobManager.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobManager.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/JobManager.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobManager.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/JobRunner.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobRunner.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/JobRunner.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobRunner.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/JobSchedulerScheduler.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobSchedulerScheduler.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/JobSchedulerScheduler.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/JobSchedulerScheduler.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/KeepAliveService.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/KeepAliveService.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/KeepAliveService.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/KeepAliveService.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/Scheduler.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/Scheduler.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/Scheduler.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/Scheduler.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraint.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraint.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraint.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraint.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/CellServiceConstraintObserver.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/DefaultExecutorFactory.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/DefaultExecutorFactory.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/DefaultExecutorFactory.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/DefaultExecutorFactory.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/JsonDataSerializer.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/JsonDataSerializer.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/JsonDataSerializer.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/JsonDataSerializer.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/NetworkConstraint.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/NetworkConstraint.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/NetworkConstraint.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/NetworkConstraint.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/NetworkConstraintObserver.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/NetworkConstraintObserver.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/NetworkConstraintObserver.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/NetworkConstraintObserver.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/NetworkOrCellServiceConstraint.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/NetworkOrCellServiceConstraint.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/NetworkOrCellServiceConstraint.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/NetworkOrCellServiceConstraint.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/SqlCipherMigrationConstraint.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/SqlCipherMigrationConstraint.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/SqlCipherMigrationConstraint.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/SqlCipherMigrationConstraint.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/SqlCipherMigrationConstraintObserver.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/SqlCipherMigrationConstraintObserver.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/SqlCipherMigrationConstraintObserver.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/impl/SqlCipherMigrationConstraintObserver.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/migration/DataMigrator.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/migration/DataMigrator.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/migration/DataMigrator.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/migration/DataMigrator.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/migration/WorkManagerFactoryMappings.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/migration/WorkManagerFactoryMappings.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/migration/WorkManagerFactoryMappings.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/migration/WorkManagerFactoryMappings.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/persistence/ConstraintSpec.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/persistence/ConstraintSpec.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/persistence/ConstraintSpec.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/persistence/ConstraintSpec.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/persistence/DependencySpec.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/persistence/DependencySpec.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/persistence/DependencySpec.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/persistence/DependencySpec.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/persistence/FullSpec.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/persistence/FullSpec.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/persistence/FullSpec.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/persistence/FullSpec.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/persistence/JobSpec.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/persistence/JobSpec.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/persistence/JobSpec.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/persistence/JobSpec.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobmanager/persistence/JobStorage.java b/app/src/main/java/org/thoughtcrime/securesms/jobmanager/persistence/JobStorage.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobmanager/persistence/JobStorage.java rename to app/src/main/java/org/thoughtcrime/securesms/jobmanager/persistence/JobStorage.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentDownloadJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentDownloadJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentDownloadJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentDownloadJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentUploadJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentUploadJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentUploadJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentUploadJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/AvatarDownloadJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/AvatarDownloadJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/AvatarDownloadJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/AvatarDownloadJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/BaseJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/BaseJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/BaseJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/BaseJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/CleanPreKeysJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/CleanPreKeysJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/CleanPreKeysJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/CleanPreKeysJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/CreateSignedPreKeyJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/CreateSignedPreKeyJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/CreateSignedPreKeyJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/CreateSignedPreKeyJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/FastJobStorage.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/FastJobStorage.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/FastJobStorage.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/FastJobStorage.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/LocalBackupJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/LocalBackupJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/LocalBackupJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/LocalBackupJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/MmsDownloadJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MmsDownloadJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/MmsDownloadJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/MmsDownloadJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/MmsReceiveJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MmsReceiveJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/MmsReceiveJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/MmsReceiveJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/MmsSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MmsSendJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/MmsSendJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/MmsSendJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceBlockedUpdateJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceBlockedUpdateJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceBlockedUpdateJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceBlockedUpdateJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceConfigurationUpdateJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceConfigurationUpdateJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceConfigurationUpdateJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceConfigurationUpdateJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceContactUpdateJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceContactUpdateJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceContactUpdateJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceContactUpdateJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceGroupUpdateJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceGroupUpdateJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceGroupUpdateJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceGroupUpdateJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceProfileKeyUpdateJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceProfileKeyUpdateJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceProfileKeyUpdateJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceProfileKeyUpdateJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceReadUpdateJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceReadUpdateJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceReadUpdateJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceReadUpdateJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceStickerPackOperationJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceStickerPackOperationJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceStickerPackOperationJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceStickerPackOperationJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceStickerPackSyncJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceStickerPackSyncJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceStickerPackSyncJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceStickerPackSyncJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceVerifiedUpdateJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceVerifiedUpdateJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceVerifiedUpdateJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceVerifiedUpdateJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/PushContentReceiveJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushContentReceiveJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/PushContentReceiveJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/PushContentReceiveJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/PushDecryptJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushDecryptJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/PushDecryptJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/PushDecryptJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupUpdateJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupUpdateJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupUpdateJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupUpdateJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/PushMediaSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushMediaSendJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/PushMediaSendJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/PushMediaSendJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/PushNotificationReceiveJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushNotificationReceiveJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/PushNotificationReceiveJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/PushNotificationReceiveJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/PushReceivedJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushReceivedJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/PushReceivedJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/PushReceivedJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/PushSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushSendJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/PushSendJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/PushSendJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/PushTextSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushTextSendJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/PushTextSendJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/PushTextSendJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/RefreshAttributesJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshAttributesJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/RefreshAttributesJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshAttributesJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/RefreshPreKeysJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshPreKeysJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/RefreshPreKeysJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshPreKeysJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/RefreshUnidentifiedDeliveryAbilityJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshUnidentifiedDeliveryAbilityJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/RefreshUnidentifiedDeliveryAbilityJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshUnidentifiedDeliveryAbilityJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/RequestGroupInfoJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RequestGroupInfoJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/RequestGroupInfoJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/RequestGroupInfoJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveProfileAvatarJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveProfileAvatarJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveProfileAvatarJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveProfileAvatarJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveProfileJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveProfileJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveProfileJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveProfileJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/RotateCertificateJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RotateCertificateJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/RotateCertificateJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/RotateCertificateJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/RotateProfileKeyJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RotateProfileKeyJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/RotateProfileKeyJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/RotateProfileKeyJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/RotateSignedPreKeyJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RotateSignedPreKeyJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/RotateSignedPreKeyJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/RotateSignedPreKeyJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/SendDeliveryReceiptJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/SendDeliveryReceiptJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/SendDeliveryReceiptJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/SendDeliveryReceiptJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/SendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/SendJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/SendJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/SendJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/SendReadReceiptJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/SendReadReceiptJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/SendReadReceiptJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/SendReadReceiptJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/ServiceOutageDetectionJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/ServiceOutageDetectionJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/ServiceOutageDetectionJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/ServiceOutageDetectionJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/SmsReceiveJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/SmsReceiveJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/SmsReceiveJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/SmsReceiveJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/SmsSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/SmsSendJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/SmsSendJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/SmsSendJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/SmsSentJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/SmsSentJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/SmsSentJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/SmsSentJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/StickerDownloadJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/StickerDownloadJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/StickerDownloadJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/StickerDownloadJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/StickerPackDownloadJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/StickerPackDownloadJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/StickerPackDownloadJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/StickerPackDownloadJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/TrimThreadJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/TrimThreadJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/TrimThreadJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/TrimThreadJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/TypingSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/TypingSendJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/TypingSendJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/TypingSendJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/jobs/UpdateApkJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/UpdateApkJob.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/jobs/UpdateApkJob.java rename to app/src/main/java/org/thoughtcrime/securesms/jobs/UpdateApkJob.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/linkpreview/Link.java b/app/src/main/java/org/thoughtcrime/securesms/linkpreview/Link.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/linkpreview/Link.java rename to app/src/main/java/org/thoughtcrime/securesms/linkpreview/Link.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/linkpreview/LinkPreview.java b/app/src/main/java/org/thoughtcrime/securesms/linkpreview/LinkPreview.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/linkpreview/LinkPreview.java rename to app/src/main/java/org/thoughtcrime/securesms/linkpreview/LinkPreview.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/linkpreview/LinkPreviewRepository.java b/app/src/main/java/org/thoughtcrime/securesms/linkpreview/LinkPreviewRepository.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/linkpreview/LinkPreviewRepository.java rename to app/src/main/java/org/thoughtcrime/securesms/linkpreview/LinkPreviewRepository.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/linkpreview/LinkPreviewUtil.java b/app/src/main/java/org/thoughtcrime/securesms/linkpreview/LinkPreviewUtil.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/linkpreview/LinkPreviewUtil.java rename to app/src/main/java/org/thoughtcrime/securesms/linkpreview/LinkPreviewUtil.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/linkpreview/LinkPreviewViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/linkpreview/LinkPreviewViewModel.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/linkpreview/LinkPreviewViewModel.java rename to app/src/main/java/org/thoughtcrime/securesms/linkpreview/LinkPreviewViewModel.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/lock/RegistrationLockDialog.java b/app/src/main/java/org/thoughtcrime/securesms/lock/RegistrationLockDialog.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/lock/RegistrationLockDialog.java rename to app/src/main/java/org/thoughtcrime/securesms/lock/RegistrationLockDialog.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/lock/RegistrationLockReminders.java b/app/src/main/java/org/thoughtcrime/securesms/lock/RegistrationLockReminders.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/lock/RegistrationLockReminders.java rename to app/src/main/java/org/thoughtcrime/securesms/lock/RegistrationLockReminders.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/logging/AndroidLogger.java b/app/src/main/java/org/thoughtcrime/securesms/logging/AndroidLogger.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/logging/AndroidLogger.java rename to app/src/main/java/org/thoughtcrime/securesms/logging/AndroidLogger.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/logging/CustomSignalProtocolLogger.java b/app/src/main/java/org/thoughtcrime/securesms/logging/CustomSignalProtocolLogger.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/logging/CustomSignalProtocolLogger.java rename to app/src/main/java/org/thoughtcrime/securesms/logging/CustomSignalProtocolLogger.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/logging/GrowingBuffer.java b/app/src/main/java/org/thoughtcrime/securesms/logging/GrowingBuffer.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/logging/GrowingBuffer.java rename to app/src/main/java/org/thoughtcrime/securesms/logging/GrowingBuffer.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/logging/Log.java b/app/src/main/java/org/thoughtcrime/securesms/logging/Log.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/logging/Log.java rename to app/src/main/java/org/thoughtcrime/securesms/logging/Log.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/logging/LogFile.java b/app/src/main/java/org/thoughtcrime/securesms/logging/LogFile.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/logging/LogFile.java rename to app/src/main/java/org/thoughtcrime/securesms/logging/LogFile.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/logging/LogSecretProvider.java b/app/src/main/java/org/thoughtcrime/securesms/logging/LogSecretProvider.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/logging/LogSecretProvider.java rename to app/src/main/java/org/thoughtcrime/securesms/logging/LogSecretProvider.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/logging/PersistentLogger.java b/app/src/main/java/org/thoughtcrime/securesms/logging/PersistentLogger.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/logging/PersistentLogger.java rename to app/src/main/java/org/thoughtcrime/securesms/logging/PersistentLogger.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/logging/UncaughtExceptionLogger.java b/app/src/main/java/org/thoughtcrime/securesms/logging/UncaughtExceptionLogger.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/logging/UncaughtExceptionLogger.java rename to app/src/main/java/org/thoughtcrime/securesms/logging/UncaughtExceptionLogger.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/logsubmit/ShareIntentListAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/logsubmit/ShareIntentListAdapter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/logsubmit/ShareIntentListAdapter.java rename to app/src/main/java/org/thoughtcrime/securesms/logsubmit/ShareIntentListAdapter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/logsubmit/SubmitLogFragment.java b/app/src/main/java/org/thoughtcrime/securesms/logsubmit/SubmitLogFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/logsubmit/SubmitLogFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/logsubmit/SubmitLogFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/logsubmit/util/Scrubber.java b/app/src/main/java/org/thoughtcrime/securesms/logsubmit/util/Scrubber.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/logsubmit/util/Scrubber.java rename to app/src/main/java/org/thoughtcrime/securesms/logsubmit/util/Scrubber.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/activities/BackupRestoreActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/BackupRestoreActivity.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/activities/BackupRestoreActivity.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/activities/BackupRestoreActivity.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/activities/ChatSettingsActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/ChatSettingsActivity.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/activities/ChatSettingsActivity.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/activities/ChatSettingsActivity.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/activities/CreateClosedGroupActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/CreateClosedGroupActivity.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/activities/CreateClosedGroupActivity.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/activities/CreateClosedGroupActivity.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/activities/CreatePrivateChatActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/CreatePrivateChatActivity.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/activities/CreatePrivateChatActivity.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/activities/CreatePrivateChatActivity.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/activities/DisplayNameActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/DisplayNameActivity.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/activities/DisplayNameActivity.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/activities/DisplayNameActivity.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/activities/EditClosedGroupActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/EditClosedGroupActivity.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/activities/EditClosedGroupActivity.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/activities/EditClosedGroupActivity.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/activities/EditClosedGroupLoader.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/EditClosedGroupLoader.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/activities/EditClosedGroupLoader.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/activities/EditClosedGroupLoader.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/activities/EditClosedGroupMembersAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/EditClosedGroupMembersAdapter.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/activities/EditClosedGroupMembersAdapter.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/activities/EditClosedGroupMembersAdapter.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeAdapter.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeAdapter.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeAdapter.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeLoader.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeLoader.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeLoader.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeLoader.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/activities/JoinPublicChatActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/JoinPublicChatActivity.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/activities/JoinPublicChatActivity.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/activities/JoinPublicChatActivity.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/activities/LandingActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/LandingActivity.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/activities/LandingActivity.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/activities/LandingActivity.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/activities/LinkDeviceActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/LinkDeviceActivity.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/activities/LinkDeviceActivity.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/activities/LinkDeviceActivity.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/activities/LinkedDevicesActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/LinkedDevicesActivity.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/activities/LinkedDevicesActivity.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/activities/LinkedDevicesActivity.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/activities/LinkedDevicesAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/LinkedDevicesAdapter.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/activities/LinkedDevicesAdapter.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/activities/LinkedDevicesAdapter.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/activities/LinkedDevicesLoader.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/LinkedDevicesLoader.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/activities/LinkedDevicesLoader.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/activities/LinkedDevicesLoader.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/activities/NotificationSettingsActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/NotificationSettingsActivity.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/activities/NotificationSettingsActivity.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/activities/NotificationSettingsActivity.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/activities/PNModeActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/PNModeActivity.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/activities/PNModeActivity.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/activities/PNModeActivity.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/activities/PathActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/PathActivity.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/activities/PathActivity.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/activities/PathActivity.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/activities/PrivacySettingsActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/PrivacySettingsActivity.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/activities/PrivacySettingsActivity.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/activities/PrivacySettingsActivity.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/activities/QRCodeActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/QRCodeActivity.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/activities/QRCodeActivity.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/activities/QRCodeActivity.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/activities/RegisterActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/RegisterActivity.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/activities/RegisterActivity.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/activities/RegisterActivity.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/activities/RestoreActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/RestoreActivity.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/activities/RestoreActivity.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/activities/RestoreActivity.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/activities/SeedActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/SeedActivity.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/activities/SeedActivity.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/activities/SeedActivity.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/activities/SelectContactsActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/SelectContactsActivity.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/activities/SelectContactsActivity.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/activities/SelectContactsActivity.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/activities/SelectContactsAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/SelectContactsAdapter.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/activities/SelectContactsAdapter.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/activities/SelectContactsAdapter.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/activities/SelectContactsLoader.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/SelectContactsLoader.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/activities/SelectContactsLoader.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/activities/SelectContactsLoader.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/activities/SettingsActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/SettingsActivity.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/activities/SettingsActivity.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/activities/SettingsActivity.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/api/BackgroundPollWorker.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/api/BackgroundPollWorker.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/api/BackgroundPollWorker.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/api/BackgroundPollWorker.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/api/ClosedGroupPoller.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/api/ClosedGroupPoller.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/api/ClosedGroupPoller.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/api/ClosedGroupPoller.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/api/LokiPushNotificationManager.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/api/LokiPushNotificationManager.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/api/LokiPushNotificationManager.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/api/LokiPushNotificationManager.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/api/PrepareAttachmentAudioExtrasJob.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/api/PrepareAttachmentAudioExtrasJob.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/api/PrepareAttachmentAudioExtrasJob.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/api/PrepareAttachmentAudioExtrasJob.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/api/PublicChatInfoUpdateWorker.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/api/PublicChatInfoUpdateWorker.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/api/PublicChatInfoUpdateWorker.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/api/PublicChatInfoUpdateWorker.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/api/PublicChatManager.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/api/PublicChatManager.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/api/PublicChatManager.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/api/PublicChatManager.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/api/PublicChatPoller.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/api/PublicChatPoller.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/api/PublicChatPoller.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/api/PublicChatPoller.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/api/PushNotificationService.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/api/PushNotificationService.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/api/PushNotificationService.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/api/PushNotificationService.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/api/ResetThreadSessionJob.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/api/ResetThreadSessionJob.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/api/ResetThreadSessionJob.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/api/ResetThreadSessionJob.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/database/BackupFileRecord.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/database/BackupFileRecord.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/database/BackupFileRecord.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/database/BackupFileRecord.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/database/LokiAPIDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/database/LokiAPIDatabase.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/database/LokiAPIDatabase.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/database/LokiAPIDatabase.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/database/LokiBackupFilesDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/database/LokiBackupFilesDatabase.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/database/LokiBackupFilesDatabase.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/database/LokiBackupFilesDatabase.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/database/LokiMessageDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/database/LokiMessageDatabase.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/database/LokiMessageDatabase.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/database/LokiMessageDatabase.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/database/LokiPreKeyBundleDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/database/LokiPreKeyBundleDatabase.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/database/LokiPreKeyBundleDatabase.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/database/LokiPreKeyBundleDatabase.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/database/LokiPreKeyRecordDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/database/LokiPreKeyRecordDatabase.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/database/LokiPreKeyRecordDatabase.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/database/LokiPreKeyRecordDatabase.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/database/LokiThreadDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/database/LokiThreadDatabase.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/database/LokiThreadDatabase.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/database/LokiThreadDatabase.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/database/LokiThreadDatabaseDelegate.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/database/LokiThreadDatabaseDelegate.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/database/LokiThreadDatabaseDelegate.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/database/LokiThreadDatabaseDelegate.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/database/LokiUserDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/database/LokiUserDatabase.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/database/LokiUserDatabase.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/database/LokiUserDatabase.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/database/SharedSenderKeysDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/database/SharedSenderKeysDatabase.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/database/SharedSenderKeysDatabase.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/database/SharedSenderKeysDatabase.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/dialogs/ChangeUiModeDialog.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/ChangeUiModeDialog.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/dialogs/ChangeUiModeDialog.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/ChangeUiModeDialog.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/dialogs/ClearAllDataDialog.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/ClearAllDataDialog.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/dialogs/ClearAllDataDialog.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/ClearAllDataDialog.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/dialogs/ClosedGroupEditingOptionsBottomSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/ClosedGroupEditingOptionsBottomSheet.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/dialogs/ClosedGroupEditingOptionsBottomSheet.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/ClosedGroupEditingOptionsBottomSheet.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/dialogs/ConversationOptionsBottomSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/ConversationOptionsBottomSheet.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/dialogs/ConversationOptionsBottomSheet.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/ConversationOptionsBottomSheet.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/dialogs/DeviceEditingOptionsBottomSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/DeviceEditingOptionsBottomSheet.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/dialogs/DeviceEditingOptionsBottomSheet.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/DeviceEditingOptionsBottomSheet.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/dialogs/EditDeviceNameDialog.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/EditDeviceNameDialog.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/dialogs/EditDeviceNameDialog.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/EditDeviceNameDialog.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/dialogs/LightThemeFeatureIntroBottomSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/LightThemeFeatureIntroBottomSheet.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/dialogs/LightThemeFeatureIntroBottomSheet.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/LightThemeFeatureIntroBottomSheet.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/dialogs/LinkDeviceMasterModeDialog.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/LinkDeviceMasterModeDialog.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/dialogs/LinkDeviceMasterModeDialog.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/LinkDeviceMasterModeDialog.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/dialogs/LinkDeviceSlaveModeDialog.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/LinkDeviceSlaveModeDialog.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/dialogs/LinkDeviceSlaveModeDialog.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/LinkDeviceSlaveModeDialog.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/dialogs/MultiDeviceRemovalBottomSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/MultiDeviceRemovalBottomSheet.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/dialogs/MultiDeviceRemovalBottomSheet.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/MultiDeviceRemovalBottomSheet.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/dialogs/OpenGroupSuggestionBottomSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/OpenGroupSuggestionBottomSheet.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/dialogs/OpenGroupSuggestionBottomSheet.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/OpenGroupSuggestionBottomSheet.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/dialogs/SeedDialog.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/SeedDialog.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/dialogs/SeedDialog.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/SeedDialog.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/dialogs/UserDetailsBottomSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/UserDetailsBottomSheet.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/dialogs/UserDetailsBottomSheet.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/UserDetailsBottomSheet.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/fragments/ContactSelectionListAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/fragments/ContactSelectionListAdapter.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/fragments/ContactSelectionListAdapter.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/fragments/ContactSelectionListAdapter.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/fragments/ContactSelectionListFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/fragments/ContactSelectionListFragment.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/fragments/ContactSelectionListFragment.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/fragments/ContactSelectionListFragment.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/fragments/ContactSelectionListLoader.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/fragments/ContactSelectionListLoader.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/fragments/ContactSelectionListLoader.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/fragments/ContactSelectionListLoader.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/fragments/ScanQRCodeFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/fragments/ScanQRCodeFragment.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/fragments/ScanQRCodeFragment.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/fragments/ScanQRCodeFragment.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/fragments/ScanQRCodePlaceholderFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/fragments/ScanQRCodePlaceholderFragment.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/fragments/ScanQRCodePlaceholderFragment.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/fragments/ScanQRCodePlaceholderFragment.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/fragments/ScanQRCodeWrapperFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/fragments/ScanQRCodeWrapperFragment.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/fragments/ScanQRCodeWrapperFragment.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/fragments/ScanQRCodeWrapperFragment.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/protocol/ClosedGroupUpdateMessageSendJob.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/ClosedGroupUpdateMessageSendJob.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/protocol/ClosedGroupUpdateMessageSendJob.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/protocol/ClosedGroupUpdateMessageSendJob.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/protocol/ClosedGroupsProtocol.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/ClosedGroupsProtocol.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/protocol/ClosedGroupsProtocol.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/protocol/ClosedGroupsProtocol.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/protocol/NullMessageSendJob.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/NullMessageSendJob.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/protocol/NullMessageSendJob.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/protocol/NullMessageSendJob.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/protocol/SessionManagementProtocol.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/SessionManagementProtocol.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/protocol/SessionManagementProtocol.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/protocol/SessionManagementProtocol.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/protocol/SessionMetaProtocol.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/SessionMetaProtocol.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/protocol/SessionMetaProtocol.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/protocol/SessionMetaProtocol.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/protocol/SessionRequestMessageSendJob.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/SessionRequestMessageSendJob.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/protocol/SessionRequestMessageSendJob.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/protocol/SessionRequestMessageSendJob.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/protocol/SessionResetImplementation.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/SessionResetImplementation.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/protocol/SessionResetImplementation.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/protocol/SessionResetImplementation.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/protocol/shelved/MultiDeviceOpenGroupUpdateJob.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/shelved/MultiDeviceOpenGroupUpdateJob.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/protocol/shelved/MultiDeviceOpenGroupUpdateJob.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/protocol/shelved/MultiDeviceOpenGroupUpdateJob.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/protocol/shelved/MultiDeviceProtocol.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/shelved/MultiDeviceProtocol.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/protocol/shelved/MultiDeviceProtocol.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/protocol/shelved/MultiDeviceProtocol.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/protocol/shelved/SyncMessagesProtocol.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/shelved/SyncMessagesProtocol.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/protocol/shelved/SyncMessagesProtocol.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/protocol/shelved/SyncMessagesProtocol.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/utilities/ActivityUtilities.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/ActivityUtilities.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/utilities/ActivityUtilities.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/utilities/ActivityUtilities.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/utilities/AvatarPlaceholderGenerator.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/AvatarPlaceholderGenerator.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/utilities/AvatarPlaceholderGenerator.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/utilities/AvatarPlaceholderGenerator.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/utilities/Broadcaster.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/Broadcaster.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/utilities/Broadcaster.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/utilities/Broadcaster.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/utilities/ContactUtilities.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/ContactUtilities.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/utilities/ContactUtilities.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/utilities/ContactUtilities.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/utilities/DatabaseUtilities.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/DatabaseUtilities.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/utilities/DatabaseUtilities.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/utilities/DatabaseUtilities.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/utilities/GeneralUtilities.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/GeneralUtilities.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/utilities/GeneralUtilities.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/utilities/GeneralUtilities.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/utilities/IP2Country.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/IP2Country.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/utilities/IP2Country.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/utilities/IP2Country.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/utilities/KeyPairUtilities.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/KeyPairUtilities.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/utilities/KeyPairUtilities.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/utilities/KeyPairUtilities.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/utilities/MentionManagerUtilities.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/MentionManagerUtilities.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/utilities/MentionManagerUtilities.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/utilities/MentionManagerUtilities.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/utilities/MentionUtilities.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/MentionUtilities.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/utilities/MentionUtilities.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/utilities/MentionUtilities.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/utilities/MnemonicUtilities.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/MnemonicUtilities.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/utilities/MnemonicUtilities.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/utilities/MnemonicUtilities.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/utilities/NotificationUtilities.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/NotificationUtilities.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/utilities/NotificationUtilities.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/utilities/NotificationUtilities.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/utilities/OpenGroupUtilities.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/OpenGroupUtilities.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/utilities/OpenGroupUtilities.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/utilities/OpenGroupUtilities.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/utilities/PointFUtilities.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/PointFUtilities.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/utilities/PointFUtilities.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/utilities/PointFUtilities.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/utilities/ProfilePictureModifiedEvent.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/ProfilePictureModifiedEvent.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/utilities/ProfilePictureModifiedEvent.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/utilities/ProfilePictureModifiedEvent.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/utilities/PromiseUtilities.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/PromiseUtilities.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/utilities/PromiseUtilities.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/utilities/PromiseUtilities.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/utilities/QRCodeUtilities.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/QRCodeUtilities.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/utilities/QRCodeUtilities.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/utilities/QRCodeUtilities.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/utilities/RecipientUtilities.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/RecipientUtilities.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/utilities/RecipientUtilities.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/utilities/RecipientUtilities.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/utilities/UiModeUtilities.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/UiModeUtilities.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/utilities/UiModeUtilities.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/utilities/UiModeUtilities.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/utilities/ViewGroupUtilities.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/ViewGroupUtilities.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/utilities/ViewGroupUtilities.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/utilities/ViewGroupUtilities.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/utilities/ViewUtilities.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/ViewUtilities.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/utilities/ViewUtilities.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/utilities/ViewUtilities.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/utilities/audio/DecodedAudio.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/audio/DecodedAudio.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/utilities/audio/DecodedAudio.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/utilities/audio/DecodedAudio.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/views/ConversationView.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/views/ConversationView.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/views/ConversationView.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/views/ConversationView.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/views/DeviceView.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/views/DeviceView.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/views/DeviceView.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/views/DeviceView.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/views/FakeChatView.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/views/FakeChatView.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/views/FakeChatView.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/views/FakeChatView.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/views/GlowView.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/views/GlowView.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/views/GlowView.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/views/GlowView.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/views/LabeledSeparatorView.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/views/LabeledSeparatorView.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/views/LabeledSeparatorView.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/views/LabeledSeparatorView.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/views/MentionCandidateSelectionView.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/views/MentionCandidateSelectionView.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/views/MentionCandidateSelectionView.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/views/MentionCandidateSelectionView.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/views/MentionCandidateView.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/views/MentionCandidateView.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/views/MentionCandidateView.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/views/MentionCandidateView.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/views/MessageAudioView.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/views/MessageAudioView.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/views/MessageAudioView.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/views/MessageAudioView.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/views/NewConversationButtonSetView.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/views/NewConversationButtonSetView.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/views/NewConversationButtonSetView.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/views/NewConversationButtonSetView.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/views/PathStatusView.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/views/PathStatusView.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/views/PathStatusView.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/views/PathStatusView.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/views/ProfilePictureView.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/views/ProfilePictureView.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/views/ProfilePictureView.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/views/ProfilePictureView.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/views/SeedReminderView.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/views/SeedReminderView.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/views/SeedReminderView.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/views/SeedReminderView.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/views/SessionRestoreBannerView.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/views/SessionRestoreBannerView.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/views/SessionRestoreBannerView.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/views/SessionRestoreBannerView.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/views/TapJacking.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/views/TapJacking.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/views/TapJacking.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/views/TapJacking.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/views/UserView.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/views/UserView.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/views/UserView.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/views/UserView.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/loki/views/WaveformSeekBar.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/views/WaveformSeekBar.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/loki/views/WaveformSeekBar.kt rename to app/src/main/java/org/thoughtcrime/securesms/loki/views/WaveformSeekBar.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessage.java b/app/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessage.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessage.java rename to app/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessage.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessageActivity.java b/app/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessageActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessageActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessageActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessageRepository.java b/app/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessageRepository.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessageRepository.java rename to app/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessageRepository.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessageViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessageViewModel.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessageViewModel.java rename to app/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessageViewModel.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewViewModel.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewViewModel.java rename to app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewViewModel.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaRailAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaRailAdapter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaRailAdapter.java rename to app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaRailAdapter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mediasend/Camera1Controller.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/Camera1Controller.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mediasend/Camera1Controller.java rename to app/src/main/java/org/thoughtcrime/securesms/mediasend/Camera1Controller.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mediasend/Camera1Fragment.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/Camera1Fragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mediasend/Camera1Fragment.java rename to app/src/main/java/org/thoughtcrime/securesms/mediasend/Camera1Fragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mediasend/FlipTransformation.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/FlipTransformation.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mediasend/FlipTransformation.java rename to app/src/main/java/org/thoughtcrime/securesms/mediasend/FlipTransformation.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mediasend/Media.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/Media.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mediasend/Media.java rename to app/src/main/java/org/thoughtcrime/securesms/mediasend/Media.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mediasend/MediaFolder.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaFolder.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mediasend/MediaFolder.java rename to app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaFolder.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mediasend/MediaPickerFolderAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaPickerFolderAdapter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mediasend/MediaPickerFolderAdapter.java rename to app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaPickerFolderAdapter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mediasend/MediaPickerFolderFragment.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaPickerFolderFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mediasend/MediaPickerFolderFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaPickerFolderFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mediasend/MediaPickerItemAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaPickerItemAdapter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mediasend/MediaPickerItemAdapter.java rename to app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaPickerItemAdapter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mediasend/MediaPickerItemFragment.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaPickerItemFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mediasend/MediaPickerItemFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaPickerItemFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mediasend/MediaRepository.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaRepository.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mediasend/MediaRepository.java rename to app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaRepository.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendActivity.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendFragment.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendFragmentPagerAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendFragmentPagerAdapter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendFragmentPagerAdapter.java rename to app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendFragmentPagerAdapter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendGifFragment.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendGifFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendGifFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendGifFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendPageFragment.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendPageFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendPageFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendPageFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendVideoFragment.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendVideoFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendVideoFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendVideoFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendViewModel.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendViewModel.java rename to app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendViewModel.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mediasend/OrderEnforcer.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/OrderEnforcer.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mediasend/OrderEnforcer.java rename to app/src/main/java/org/thoughtcrime/securesms/mediasend/OrderEnforcer.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mediasend/SimpleAnimationListener.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/SimpleAnimationListener.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mediasend/SimpleAnimationListener.java rename to app/src/main/java/org/thoughtcrime/securesms/mediasend/SimpleAnimationListener.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/ApnUnavailableException.java b/app/src/main/java/org/thoughtcrime/securesms/mms/ApnUnavailableException.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/ApnUnavailableException.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/ApnUnavailableException.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/AttachmentManager.java b/app/src/main/java/org/thoughtcrime/securesms/mms/AttachmentManager.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/AttachmentManager.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/AttachmentManager.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/AttachmentStreamLocalUriFetcher.java b/app/src/main/java/org/thoughtcrime/securesms/mms/AttachmentStreamLocalUriFetcher.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/AttachmentStreamLocalUriFetcher.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/AttachmentStreamLocalUriFetcher.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/AttachmentStreamUriLoader.java b/app/src/main/java/org/thoughtcrime/securesms/mms/AttachmentStreamUriLoader.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/AttachmentStreamUriLoader.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/AttachmentStreamUriLoader.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/AudioSlide.java b/app/src/main/java/org/thoughtcrime/securesms/mms/AudioSlide.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/AudioSlide.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/AudioSlide.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/CompatMmsConnection.java b/app/src/main/java/org/thoughtcrime/securesms/mms/CompatMmsConnection.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/CompatMmsConnection.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/CompatMmsConnection.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/ContactPhotoLocalUriFetcher.java b/app/src/main/java/org/thoughtcrime/securesms/mms/ContactPhotoLocalUriFetcher.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/ContactPhotoLocalUriFetcher.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/ContactPhotoLocalUriFetcher.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/DecryptableStreamLocalUriFetcher.java b/app/src/main/java/org/thoughtcrime/securesms/mms/DecryptableStreamLocalUriFetcher.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/DecryptableStreamLocalUriFetcher.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/DecryptableStreamLocalUriFetcher.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/DecryptableStreamUriLoader.java b/app/src/main/java/org/thoughtcrime/securesms/mms/DecryptableStreamUriLoader.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/DecryptableStreamUriLoader.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/DecryptableStreamUriLoader.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/DocumentSlide.java b/app/src/main/java/org/thoughtcrime/securesms/mms/DocumentSlide.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/DocumentSlide.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/DocumentSlide.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/GifSlide.java b/app/src/main/java/org/thoughtcrime/securesms/mms/GifSlide.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/GifSlide.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/GifSlide.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/ImageSlide.java b/app/src/main/java/org/thoughtcrime/securesms/mms/ImageSlide.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/ImageSlide.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/ImageSlide.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/IncomingLegacyMmsConnection.java b/app/src/main/java/org/thoughtcrime/securesms/mms/IncomingLegacyMmsConnection.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/IncomingLegacyMmsConnection.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/IncomingLegacyMmsConnection.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/IncomingLollipopMmsConnection.java b/app/src/main/java/org/thoughtcrime/securesms/mms/IncomingLollipopMmsConnection.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/IncomingLollipopMmsConnection.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/IncomingLollipopMmsConnection.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/IncomingMediaMessage.java b/app/src/main/java/org/thoughtcrime/securesms/mms/IncomingMediaMessage.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/IncomingMediaMessage.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/IncomingMediaMessage.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/IncomingMmsConnection.java b/app/src/main/java/org/thoughtcrime/securesms/mms/IncomingMmsConnection.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/IncomingMmsConnection.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/IncomingMmsConnection.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/LegacyMmsConnection.java b/app/src/main/java/org/thoughtcrime/securesms/mms/LegacyMmsConnection.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/LegacyMmsConnection.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/LegacyMmsConnection.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/LocationSlide.java b/app/src/main/java/org/thoughtcrime/securesms/mms/LocationSlide.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/LocationSlide.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/LocationSlide.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/LollipopMmsConnection.java b/app/src/main/java/org/thoughtcrime/securesms/mms/LollipopMmsConnection.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/LollipopMmsConnection.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/LollipopMmsConnection.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/MediaConstraints.java b/app/src/main/java/org/thoughtcrime/securesms/mms/MediaConstraints.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/MediaConstraints.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/MediaConstraints.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/MediaNotFoundException.java b/app/src/main/java/org/thoughtcrime/securesms/mms/MediaNotFoundException.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/MediaNotFoundException.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/MediaNotFoundException.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/MediaStream.java b/app/src/main/java/org/thoughtcrime/securesms/mms/MediaStream.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/MediaStream.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/MediaStream.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/MediaTooLargeException.java b/app/src/main/java/org/thoughtcrime/securesms/mms/MediaTooLargeException.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/MediaTooLargeException.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/MediaTooLargeException.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/MmsConfigManager.java b/app/src/main/java/org/thoughtcrime/securesms/mms/MmsConfigManager.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/MmsConfigManager.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/MmsConfigManager.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/MmsException.java b/app/src/main/java/org/thoughtcrime/securesms/mms/MmsException.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/MmsException.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/MmsException.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/MmsMediaConstraints.java b/app/src/main/java/org/thoughtcrime/securesms/mms/MmsMediaConstraints.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/MmsMediaConstraints.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/MmsMediaConstraints.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/MmsRadio.java b/app/src/main/java/org/thoughtcrime/securesms/mms/MmsRadio.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/MmsRadio.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/MmsRadio.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/MmsRadioException.java b/app/src/main/java/org/thoughtcrime/securesms/mms/MmsRadioException.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/MmsRadioException.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/MmsRadioException.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/MmsSendResult.java b/app/src/main/java/org/thoughtcrime/securesms/mms/MmsSendResult.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/MmsSendResult.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/MmsSendResult.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/MmsSlide.java b/app/src/main/java/org/thoughtcrime/securesms/mms/MmsSlide.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/MmsSlide.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/MmsSlide.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/OutgoingExpirationUpdateMessage.java b/app/src/main/java/org/thoughtcrime/securesms/mms/OutgoingExpirationUpdateMessage.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/OutgoingExpirationUpdateMessage.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/OutgoingExpirationUpdateMessage.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/OutgoingGroupMediaMessage.java b/app/src/main/java/org/thoughtcrime/securesms/mms/OutgoingGroupMediaMessage.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/OutgoingGroupMediaMessage.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/OutgoingGroupMediaMessage.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/OutgoingLegacyMmsConnection.java b/app/src/main/java/org/thoughtcrime/securesms/mms/OutgoingLegacyMmsConnection.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/OutgoingLegacyMmsConnection.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/OutgoingLegacyMmsConnection.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/OutgoingLollipopMmsConnection.java b/app/src/main/java/org/thoughtcrime/securesms/mms/OutgoingLollipopMmsConnection.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/OutgoingLollipopMmsConnection.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/OutgoingLollipopMmsConnection.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/OutgoingMediaMessage.java b/app/src/main/java/org/thoughtcrime/securesms/mms/OutgoingMediaMessage.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/OutgoingMediaMessage.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/OutgoingMediaMessage.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/OutgoingMmsConnection.java b/app/src/main/java/org/thoughtcrime/securesms/mms/OutgoingMmsConnection.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/OutgoingMmsConnection.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/OutgoingMmsConnection.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/OutgoingSecureMediaMessage.java b/app/src/main/java/org/thoughtcrime/securesms/mms/OutgoingSecureMediaMessage.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/OutgoingSecureMediaMessage.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/OutgoingSecureMediaMessage.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/PartAuthority.java b/app/src/main/java/org/thoughtcrime/securesms/mms/PartAuthority.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/PartAuthority.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/PartAuthority.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/PartParser.java b/app/src/main/java/org/thoughtcrime/securesms/mms/PartParser.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/PartParser.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/PartParser.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/PartUriParser.java b/app/src/main/java/org/thoughtcrime/securesms/mms/PartUriParser.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/PartUriParser.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/PartUriParser.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/PushMediaConstraints.java b/app/src/main/java/org/thoughtcrime/securesms/mms/PushMediaConstraints.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/PushMediaConstraints.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/PushMediaConstraints.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/QuoteId.java b/app/src/main/java/org/thoughtcrime/securesms/mms/QuoteId.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/QuoteId.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/QuoteId.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/QuoteModel.java b/app/src/main/java/org/thoughtcrime/securesms/mms/QuoteModel.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/QuoteModel.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/QuoteModel.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/SignalGlideModule.java b/app/src/main/java/org/thoughtcrime/securesms/mms/SignalGlideModule.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/SignalGlideModule.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/SignalGlideModule.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/Slide.java b/app/src/main/java/org/thoughtcrime/securesms/mms/Slide.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/Slide.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/Slide.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/SlideClickListener.java b/app/src/main/java/org/thoughtcrime/securesms/mms/SlideClickListener.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/SlideClickListener.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/SlideClickListener.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/SlideDeck.java b/app/src/main/java/org/thoughtcrime/securesms/mms/SlideDeck.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/SlideDeck.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/SlideDeck.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/SlidesClickedListener.java b/app/src/main/java/org/thoughtcrime/securesms/mms/SlidesClickedListener.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/SlidesClickedListener.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/SlidesClickedListener.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/StickerSlide.java b/app/src/main/java/org/thoughtcrime/securesms/mms/StickerSlide.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/StickerSlide.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/StickerSlide.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/TextSlide.java b/app/src/main/java/org/thoughtcrime/securesms/mms/TextSlide.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/TextSlide.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/TextSlide.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/TextTransport.java b/app/src/main/java/org/thoughtcrime/securesms/mms/TextTransport.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/TextTransport.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/TextTransport.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/mms/VideoSlide.java b/app/src/main/java/org/thoughtcrime/securesms/mms/VideoSlide.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/mms/VideoSlide.java rename to app/src/main/java/org/thoughtcrime/securesms/mms/VideoSlide.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/net/CallRequestController.java b/app/src/main/java/org/thoughtcrime/securesms/net/CallRequestController.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/net/CallRequestController.java rename to app/src/main/java/org/thoughtcrime/securesms/net/CallRequestController.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/net/ChunkedDataFetcher.java b/app/src/main/java/org/thoughtcrime/securesms/net/ChunkedDataFetcher.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/net/ChunkedDataFetcher.java rename to app/src/main/java/org/thoughtcrime/securesms/net/ChunkedDataFetcher.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/net/CompositeRequestController.java b/app/src/main/java/org/thoughtcrime/securesms/net/CompositeRequestController.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/net/CompositeRequestController.java rename to app/src/main/java/org/thoughtcrime/securesms/net/CompositeRequestController.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/net/ContentProxySafetyInterceptor.java b/app/src/main/java/org/thoughtcrime/securesms/net/ContentProxySafetyInterceptor.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/net/ContentProxySafetyInterceptor.java rename to app/src/main/java/org/thoughtcrime/securesms/net/ContentProxySafetyInterceptor.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/net/ContentProxySelector.java b/app/src/main/java/org/thoughtcrime/securesms/net/ContentProxySelector.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/net/ContentProxySelector.java rename to app/src/main/java/org/thoughtcrime/securesms/net/ContentProxySelector.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/net/RequestController.java b/app/src/main/java/org/thoughtcrime/securesms/net/RequestController.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/net/RequestController.java rename to app/src/main/java/org/thoughtcrime/securesms/net/RequestController.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/notifications/AbstractNotificationBuilder.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/AbstractNotificationBuilder.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/notifications/AbstractNotificationBuilder.java rename to app/src/main/java/org/thoughtcrime/securesms/notifications/AbstractNotificationBuilder.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/notifications/AndroidAutoHeardReceiver.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/AndroidAutoHeardReceiver.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/notifications/AndroidAutoHeardReceiver.java rename to app/src/main/java/org/thoughtcrime/securesms/notifications/AndroidAutoHeardReceiver.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/notifications/AndroidAutoReplyReceiver.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/AndroidAutoReplyReceiver.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/notifications/AndroidAutoReplyReceiver.java rename to app/src/main/java/org/thoughtcrime/securesms/notifications/AndroidAutoReplyReceiver.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/notifications/DefaultMessageNotifier.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/DefaultMessageNotifier.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/notifications/DefaultMessageNotifier.java rename to app/src/main/java/org/thoughtcrime/securesms/notifications/DefaultMessageNotifier.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/notifications/DeleteNotificationReceiver.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/DeleteNotificationReceiver.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/notifications/DeleteNotificationReceiver.java rename to app/src/main/java/org/thoughtcrime/securesms/notifications/DeleteNotificationReceiver.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/notifications/FailedNotificationBuilder.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/FailedNotificationBuilder.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/notifications/FailedNotificationBuilder.java rename to app/src/main/java/org/thoughtcrime/securesms/notifications/FailedNotificationBuilder.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/notifications/LocaleChangedReceiver.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/LocaleChangedReceiver.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/notifications/LocaleChangedReceiver.java rename to app/src/main/java/org/thoughtcrime/securesms/notifications/LocaleChangedReceiver.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/notifications/MarkReadReceiver.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/MarkReadReceiver.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/notifications/MarkReadReceiver.java rename to app/src/main/java/org/thoughtcrime/securesms/notifications/MarkReadReceiver.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/notifications/MessageNotifier.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/MessageNotifier.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/notifications/MessageNotifier.java rename to app/src/main/java/org/thoughtcrime/securesms/notifications/MessageNotifier.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/notifications/MultipleRecipientNotificationBuilder.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/MultipleRecipientNotificationBuilder.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/notifications/MultipleRecipientNotificationBuilder.java rename to app/src/main/java/org/thoughtcrime/securesms/notifications/MultipleRecipientNotificationBuilder.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/notifications/NotificationChannels.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/NotificationChannels.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/notifications/NotificationChannels.java rename to app/src/main/java/org/thoughtcrime/securesms/notifications/NotificationChannels.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/notifications/NotificationItem.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/NotificationItem.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/notifications/NotificationItem.java rename to app/src/main/java/org/thoughtcrime/securesms/notifications/NotificationItem.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/notifications/NotificationState.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/NotificationState.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/notifications/NotificationState.java rename to app/src/main/java/org/thoughtcrime/securesms/notifications/NotificationState.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/notifications/OptimizedMessageNotifier.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/OptimizedMessageNotifier.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/notifications/OptimizedMessageNotifier.java rename to app/src/main/java/org/thoughtcrime/securesms/notifications/OptimizedMessageNotifier.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/notifications/PendingMessageNotificationBuilder.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/PendingMessageNotificationBuilder.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/notifications/PendingMessageNotificationBuilder.java rename to app/src/main/java/org/thoughtcrime/securesms/notifications/PendingMessageNotificationBuilder.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/notifications/RemoteReplyReceiver.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/RemoteReplyReceiver.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/notifications/RemoteReplyReceiver.java rename to app/src/main/java/org/thoughtcrime/securesms/notifications/RemoteReplyReceiver.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/notifications/ReplyMethod.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/ReplyMethod.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/notifications/ReplyMethod.java rename to app/src/main/java/org/thoughtcrime/securesms/notifications/ReplyMethod.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/notifications/SingleRecipientNotificationBuilder.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/SingleRecipientNotificationBuilder.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/notifications/SingleRecipientNotificationBuilder.java rename to app/src/main/java/org/thoughtcrime/securesms/notifications/SingleRecipientNotificationBuilder.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/permissions/Permissions.java b/app/src/main/java/org/thoughtcrime/securesms/permissions/Permissions.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/permissions/Permissions.java rename to app/src/main/java/org/thoughtcrime/securesms/permissions/Permissions.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/permissions/PermissionsRequest.java b/app/src/main/java/org/thoughtcrime/securesms/permissions/PermissionsRequest.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/permissions/PermissionsRequest.java rename to app/src/main/java/org/thoughtcrime/securesms/permissions/PermissionsRequest.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/permissions/RationaleDialog.java b/app/src/main/java/org/thoughtcrime/securesms/permissions/RationaleDialog.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/permissions/RationaleDialog.java rename to app/src/main/java/org/thoughtcrime/securesms/permissions/RationaleDialog.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/preferences/AppProtectionPreferenceFragment.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/AppProtectionPreferenceFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/preferences/AppProtectionPreferenceFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/preferences/AppProtectionPreferenceFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/preferences/AppearancePreferenceFragment.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/AppearancePreferenceFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/preferences/AppearancePreferenceFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/preferences/AppearancePreferenceFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/preferences/BlockedContactListItem.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/BlockedContactListItem.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/preferences/BlockedContactListItem.java rename to app/src/main/java/org/thoughtcrime/securesms/preferences/BlockedContactListItem.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/preferences/ChatsPreferenceFragment.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/ChatsPreferenceFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/preferences/ChatsPreferenceFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/preferences/ChatsPreferenceFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/preferences/CorrectedPreferenceFragment.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/CorrectedPreferenceFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/preferences/CorrectedPreferenceFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/preferences/CorrectedPreferenceFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/preferences/ListSummaryPreferenceFragment.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/ListSummaryPreferenceFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/preferences/ListSummaryPreferenceFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/preferences/ListSummaryPreferenceFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/preferences/MmsPreferencesActivity.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/MmsPreferencesActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/preferences/MmsPreferencesActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/preferences/MmsPreferencesActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/preferences/MmsPreferencesFragment.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/MmsPreferencesFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/preferences/MmsPreferencesFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/preferences/MmsPreferencesFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/preferences/NotificationsPreferenceFragment.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/NotificationsPreferenceFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/preferences/NotificationsPreferenceFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/preferences/NotificationsPreferenceFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/preferences/SmsMmsPreferenceFragment.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/SmsMmsPreferenceFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/preferences/SmsMmsPreferenceFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/preferences/SmsMmsPreferenceFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/preferences/widgets/ColorPickerPreference.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/ColorPickerPreference.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/preferences/widgets/ColorPickerPreference.java rename to app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/ColorPickerPreference.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/preferences/widgets/ColorPickerPreferenceDialogFragmentCompat.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/ColorPickerPreferenceDialogFragmentCompat.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/preferences/widgets/ColorPickerPreferenceDialogFragmentCompat.java rename to app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/ColorPickerPreferenceDialogFragmentCompat.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/preferences/widgets/ContactPreference.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/ContactPreference.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/preferences/widgets/ContactPreference.java rename to app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/ContactPreference.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/preferences/widgets/LEDColorListPreference.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/LEDColorListPreference.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/preferences/widgets/LEDColorListPreference.java rename to app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/LEDColorListPreference.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/preferences/widgets/NotificationPrivacyPreference.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/NotificationPrivacyPreference.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/preferences/widgets/NotificationPrivacyPreference.java rename to app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/NotificationPrivacyPreference.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/preferences/widgets/ProfilePreference.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/ProfilePreference.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/preferences/widgets/ProfilePreference.java rename to app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/ProfilePreference.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/preferences/widgets/ProgressPreference.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/ProgressPreference.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/preferences/widgets/ProgressPreference.java rename to app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/ProgressPreference.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/preferences/widgets/SignalListPreference.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/SignalListPreference.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/preferences/widgets/SignalListPreference.java rename to app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/SignalListPreference.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/preferences/widgets/SignalPreference.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/SignalPreference.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/preferences/widgets/SignalPreference.java rename to app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/SignalPreference.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/profiles/AvatarHelper.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/AvatarHelper.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/profiles/AvatarHelper.java rename to app/src/main/java/org/thoughtcrime/securesms/profiles/AvatarHelper.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/profiles/GroupShareProfileView.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/GroupShareProfileView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/profiles/GroupShareProfileView.java rename to app/src/main/java/org/thoughtcrime/securesms/profiles/GroupShareProfileView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/profiles/ProfileMediaConstraints.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/ProfileMediaConstraints.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/profiles/ProfileMediaConstraints.java rename to app/src/main/java/org/thoughtcrime/securesms/profiles/ProfileMediaConstraints.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/profiles/SystemProfileUtil.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/SystemProfileUtil.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/profiles/SystemProfileUtil.java rename to app/src/main/java/org/thoughtcrime/securesms/profiles/SystemProfileUtil.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/profiles/UnknownSenderView.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/UnknownSenderView.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/profiles/UnknownSenderView.java rename to app/src/main/java/org/thoughtcrime/securesms/profiles/UnknownSenderView.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/providers/BlobProvider.java b/app/src/main/java/org/thoughtcrime/securesms/providers/BlobProvider.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/providers/BlobProvider.java rename to app/src/main/java/org/thoughtcrime/securesms/providers/BlobProvider.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/providers/DeprecatedPersistentBlobProvider.java b/app/src/main/java/org/thoughtcrime/securesms/providers/DeprecatedPersistentBlobProvider.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/providers/DeprecatedPersistentBlobProvider.java rename to app/src/main/java/org/thoughtcrime/securesms/providers/DeprecatedPersistentBlobProvider.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/providers/MmsBodyProvider.java b/app/src/main/java/org/thoughtcrime/securesms/providers/MmsBodyProvider.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/providers/MmsBodyProvider.java rename to app/src/main/java/org/thoughtcrime/securesms/providers/MmsBodyProvider.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/providers/PartProvider.java b/app/src/main/java/org/thoughtcrime/securesms/providers/PartProvider.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/providers/PartProvider.java rename to app/src/main/java/org/thoughtcrime/securesms/providers/PartProvider.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/push/AccountManagerFactory.java b/app/src/main/java/org/thoughtcrime/securesms/push/AccountManagerFactory.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/push/AccountManagerFactory.java rename to app/src/main/java/org/thoughtcrime/securesms/push/AccountManagerFactory.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/push/DomainFrontingTrustStore.java b/app/src/main/java/org/thoughtcrime/securesms/push/DomainFrontingTrustStore.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/push/DomainFrontingTrustStore.java rename to app/src/main/java/org/thoughtcrime/securesms/push/DomainFrontingTrustStore.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/push/IasTrustStore.java b/app/src/main/java/org/thoughtcrime/securesms/push/IasTrustStore.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/push/IasTrustStore.java rename to app/src/main/java/org/thoughtcrime/securesms/push/IasTrustStore.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/push/MessageSenderEventListener.java b/app/src/main/java/org/thoughtcrime/securesms/push/MessageSenderEventListener.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/push/MessageSenderEventListener.java rename to app/src/main/java/org/thoughtcrime/securesms/push/MessageSenderEventListener.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/push/SignalServiceNetworkAccess.java b/app/src/main/java/org/thoughtcrime/securesms/push/SignalServiceNetworkAccess.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/push/SignalServiceNetworkAccess.java rename to app/src/main/java/org/thoughtcrime/securesms/push/SignalServiceNetworkAccess.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/push/SignalServiceTrustStore.java b/app/src/main/java/org/thoughtcrime/securesms/push/SignalServiceTrustStore.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/push/SignalServiceTrustStore.java rename to app/src/main/java/org/thoughtcrime/securesms/push/SignalServiceTrustStore.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/qr/QrCode.java b/app/src/main/java/org/thoughtcrime/securesms/qr/QrCode.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/qr/QrCode.java rename to app/src/main/java/org/thoughtcrime/securesms/qr/QrCode.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/qr/ScanListener.java b/app/src/main/java/org/thoughtcrime/securesms/qr/ScanListener.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/qr/ScanListener.java rename to app/src/main/java/org/thoughtcrime/securesms/qr/ScanListener.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/qr/ScanningThread.java b/app/src/main/java/org/thoughtcrime/securesms/qr/ScanningThread.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/qr/ScanningThread.java rename to app/src/main/java/org/thoughtcrime/securesms/qr/ScanningThread.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/recipients/Recipient.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/Recipient.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/recipients/Recipient.java rename to app/src/main/java/org/thoughtcrime/securesms/recipients/Recipient.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/recipients/RecipientExporter.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientExporter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/recipients/RecipientExporter.java rename to app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientExporter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/recipients/RecipientFormattingException.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientFormattingException.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/recipients/RecipientFormattingException.java rename to app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientFormattingException.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/recipients/RecipientModifiedListener.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientModifiedListener.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/recipients/RecipientModifiedListener.java rename to app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientModifiedListener.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/recipients/RecipientProvider.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientProvider.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/recipients/RecipientProvider.java rename to app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientProvider.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/recipients/RecipientsFormatter.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientsFormatter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/recipients/RecipientsFormatter.java rename to app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientsFormatter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/registration/CaptchaActivity.java b/app/src/main/java/org/thoughtcrime/securesms/registration/CaptchaActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/registration/CaptchaActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/registration/CaptchaActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/registration/WelcomeActivity.java b/app/src/main/java/org/thoughtcrime/securesms/registration/WelcomeActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/registration/WelcomeActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/registration/WelcomeActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java b/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorHud.java b/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorHud.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorHud.java rename to app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorHud.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/scribbles/StickerLoader.java b/app/src/main/java/org/thoughtcrime/securesms/scribbles/StickerLoader.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/scribbles/StickerLoader.java rename to app/src/main/java/org/thoughtcrime/securesms/scribbles/StickerLoader.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/scribbles/StickerSelectActivity.java b/app/src/main/java/org/thoughtcrime/securesms/scribbles/StickerSelectActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/scribbles/StickerSelectActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/scribbles/StickerSelectActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/scribbles/StickerSelectFragment.java b/app/src/main/java/org/thoughtcrime/securesms/scribbles/StickerSelectFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/scribbles/StickerSelectFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/scribbles/StickerSelectFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/scribbles/UriGlideRenderer.java b/app/src/main/java/org/thoughtcrime/securesms/scribbles/UriGlideRenderer.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/scribbles/UriGlideRenderer.java rename to app/src/main/java/org/thoughtcrime/securesms/scribbles/UriGlideRenderer.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/scribbles/widget/ColorPaletteAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/scribbles/widget/ColorPaletteAdapter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/scribbles/widget/ColorPaletteAdapter.java rename to app/src/main/java/org/thoughtcrime/securesms/scribbles/widget/ColorPaletteAdapter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/scribbles/widget/VerticalSlideColorPicker.java b/app/src/main/java/org/thoughtcrime/securesms/scribbles/widget/VerticalSlideColorPicker.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/scribbles/widget/VerticalSlideColorPicker.java rename to app/src/main/java/org/thoughtcrime/securesms/scribbles/widget/VerticalSlideColorPicker.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/search/SearchFragment.java b/app/src/main/java/org/thoughtcrime/securesms/search/SearchFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/search/SearchFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/search/SearchFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/search/SearchListAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/search/SearchListAdapter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/search/SearchListAdapter.java rename to app/src/main/java/org/thoughtcrime/securesms/search/SearchListAdapter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/search/SearchRepository.java b/app/src/main/java/org/thoughtcrime/securesms/search/SearchRepository.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/search/SearchRepository.java rename to app/src/main/java/org/thoughtcrime/securesms/search/SearchRepository.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/search/SearchViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/search/SearchViewModel.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/search/SearchViewModel.java rename to app/src/main/java/org/thoughtcrime/securesms/search/SearchViewModel.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/search/model/MessageResult.java b/app/src/main/java/org/thoughtcrime/securesms/search/model/MessageResult.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/search/model/MessageResult.java rename to app/src/main/java/org/thoughtcrime/securesms/search/model/MessageResult.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/search/model/SearchResult.java b/app/src/main/java/org/thoughtcrime/securesms/search/model/SearchResult.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/search/model/SearchResult.java rename to app/src/main/java/org/thoughtcrime/securesms/search/model/SearchResult.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/service/AccountVerificationTimeoutException.java b/app/src/main/java/org/thoughtcrime/securesms/service/AccountVerificationTimeoutException.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/service/AccountVerificationTimeoutException.java rename to app/src/main/java/org/thoughtcrime/securesms/service/AccountVerificationTimeoutException.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/service/ApplicationMigrationService.java b/app/src/main/java/org/thoughtcrime/securesms/service/ApplicationMigrationService.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/service/ApplicationMigrationService.java rename to app/src/main/java/org/thoughtcrime/securesms/service/ApplicationMigrationService.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/service/BootReceiver.java b/app/src/main/java/org/thoughtcrime/securesms/service/BootReceiver.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/service/BootReceiver.java rename to app/src/main/java/org/thoughtcrime/securesms/service/BootReceiver.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/service/DirectShareService.java b/app/src/main/java/org/thoughtcrime/securesms/service/DirectShareService.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/service/DirectShareService.java rename to app/src/main/java/org/thoughtcrime/securesms/service/DirectShareService.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/service/ExpirationListener.java b/app/src/main/java/org/thoughtcrime/securesms/service/ExpirationListener.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/service/ExpirationListener.java rename to app/src/main/java/org/thoughtcrime/securesms/service/ExpirationListener.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/service/ExpiringMessageManager.java b/app/src/main/java/org/thoughtcrime/securesms/service/ExpiringMessageManager.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/service/ExpiringMessageManager.java rename to app/src/main/java/org/thoughtcrime/securesms/service/ExpiringMessageManager.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/service/GenericForegroundService.java b/app/src/main/java/org/thoughtcrime/securesms/service/GenericForegroundService.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/service/GenericForegroundService.java rename to app/src/main/java/org/thoughtcrime/securesms/service/GenericForegroundService.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/service/IncomingMessageObserver.java b/app/src/main/java/org/thoughtcrime/securesms/service/IncomingMessageObserver.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/service/IncomingMessageObserver.java rename to app/src/main/java/org/thoughtcrime/securesms/service/IncomingMessageObserver.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/service/KeyCachingService.java b/app/src/main/java/org/thoughtcrime/securesms/service/KeyCachingService.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/service/KeyCachingService.java rename to app/src/main/java/org/thoughtcrime/securesms/service/KeyCachingService.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/service/LocalBackupListener.java b/app/src/main/java/org/thoughtcrime/securesms/service/LocalBackupListener.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/service/LocalBackupListener.java rename to app/src/main/java/org/thoughtcrime/securesms/service/LocalBackupListener.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/service/MmsListener.java b/app/src/main/java/org/thoughtcrime/securesms/service/MmsListener.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/service/MmsListener.java rename to app/src/main/java/org/thoughtcrime/securesms/service/MmsListener.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/service/PanicResponderListener.java b/app/src/main/java/org/thoughtcrime/securesms/service/PanicResponderListener.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/service/PanicResponderListener.java rename to app/src/main/java/org/thoughtcrime/securesms/service/PanicResponderListener.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/service/PersistentAlarmManagerListener.java b/app/src/main/java/org/thoughtcrime/securesms/service/PersistentAlarmManagerListener.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/service/PersistentAlarmManagerListener.java rename to app/src/main/java/org/thoughtcrime/securesms/service/PersistentAlarmManagerListener.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/service/PersistentConnectionBootListener.java b/app/src/main/java/org/thoughtcrime/securesms/service/PersistentConnectionBootListener.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/service/PersistentConnectionBootListener.java rename to app/src/main/java/org/thoughtcrime/securesms/service/PersistentConnectionBootListener.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/service/QuickResponseService.java b/app/src/main/java/org/thoughtcrime/securesms/service/QuickResponseService.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/service/QuickResponseService.java rename to app/src/main/java/org/thoughtcrime/securesms/service/QuickResponseService.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/service/RotateSenderCertificateListener.java b/app/src/main/java/org/thoughtcrime/securesms/service/RotateSenderCertificateListener.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/service/RotateSenderCertificateListener.java rename to app/src/main/java/org/thoughtcrime/securesms/service/RotateSenderCertificateListener.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/service/RotateSignedPreKeyListener.java b/app/src/main/java/org/thoughtcrime/securesms/service/RotateSignedPreKeyListener.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/service/RotateSignedPreKeyListener.java rename to app/src/main/java/org/thoughtcrime/securesms/service/RotateSignedPreKeyListener.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/service/SmsDeliveryListener.java b/app/src/main/java/org/thoughtcrime/securesms/service/SmsDeliveryListener.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/service/SmsDeliveryListener.java rename to app/src/main/java/org/thoughtcrime/securesms/service/SmsDeliveryListener.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/service/SmsListener.java b/app/src/main/java/org/thoughtcrime/securesms/service/SmsListener.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/service/SmsListener.java rename to app/src/main/java/org/thoughtcrime/securesms/service/SmsListener.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/service/UpdateApkReadyListener.java b/app/src/main/java/org/thoughtcrime/securesms/service/UpdateApkReadyListener.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/service/UpdateApkReadyListener.java rename to app/src/main/java/org/thoughtcrime/securesms/service/UpdateApkReadyListener.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/service/UpdateApkRefreshListener.java b/app/src/main/java/org/thoughtcrime/securesms/service/UpdateApkRefreshListener.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/service/UpdateApkRefreshListener.java rename to app/src/main/java/org/thoughtcrime/securesms/service/UpdateApkRefreshListener.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/service/VerificationCodeParser.java b/app/src/main/java/org/thoughtcrime/securesms/service/VerificationCodeParser.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/service/VerificationCodeParser.java rename to app/src/main/java/org/thoughtcrime/securesms/service/VerificationCodeParser.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/service/WebRtcCallService.java b/app/src/main/java/org/thoughtcrime/securesms/service/WebRtcCallService.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/service/WebRtcCallService.java rename to app/src/main/java/org/thoughtcrime/securesms/service/WebRtcCallService.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/sms/IncomingEncryptedMessage.java b/app/src/main/java/org/thoughtcrime/securesms/sms/IncomingEncryptedMessage.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/sms/IncomingEncryptedMessage.java rename to app/src/main/java/org/thoughtcrime/securesms/sms/IncomingEncryptedMessage.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/sms/IncomingEndSessionMessage.java b/app/src/main/java/org/thoughtcrime/securesms/sms/IncomingEndSessionMessage.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/sms/IncomingEndSessionMessage.java rename to app/src/main/java/org/thoughtcrime/securesms/sms/IncomingEndSessionMessage.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/sms/IncomingGroupMessage.java b/app/src/main/java/org/thoughtcrime/securesms/sms/IncomingGroupMessage.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/sms/IncomingGroupMessage.java rename to app/src/main/java/org/thoughtcrime/securesms/sms/IncomingGroupMessage.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/sms/IncomingIdentityDefaultMessage.java b/app/src/main/java/org/thoughtcrime/securesms/sms/IncomingIdentityDefaultMessage.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/sms/IncomingIdentityDefaultMessage.java rename to app/src/main/java/org/thoughtcrime/securesms/sms/IncomingIdentityDefaultMessage.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/sms/IncomingIdentityUpdateMessage.java b/app/src/main/java/org/thoughtcrime/securesms/sms/IncomingIdentityUpdateMessage.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/sms/IncomingIdentityUpdateMessage.java rename to app/src/main/java/org/thoughtcrime/securesms/sms/IncomingIdentityUpdateMessage.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/sms/IncomingIdentityVerifiedMessage.java b/app/src/main/java/org/thoughtcrime/securesms/sms/IncomingIdentityVerifiedMessage.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/sms/IncomingIdentityVerifiedMessage.java rename to app/src/main/java/org/thoughtcrime/securesms/sms/IncomingIdentityVerifiedMessage.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/sms/IncomingJoinedMessage.java b/app/src/main/java/org/thoughtcrime/securesms/sms/IncomingJoinedMessage.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/sms/IncomingJoinedMessage.java rename to app/src/main/java/org/thoughtcrime/securesms/sms/IncomingJoinedMessage.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/sms/IncomingPreKeyBundleMessage.java b/app/src/main/java/org/thoughtcrime/securesms/sms/IncomingPreKeyBundleMessage.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/sms/IncomingPreKeyBundleMessage.java rename to app/src/main/java/org/thoughtcrime/securesms/sms/IncomingPreKeyBundleMessage.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/sms/IncomingTextMessage.java b/app/src/main/java/org/thoughtcrime/securesms/sms/IncomingTextMessage.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/sms/IncomingTextMessage.java rename to app/src/main/java/org/thoughtcrime/securesms/sms/IncomingTextMessage.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/sms/MessageSender.java b/app/src/main/java/org/thoughtcrime/securesms/sms/MessageSender.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/sms/MessageSender.java rename to app/src/main/java/org/thoughtcrime/securesms/sms/MessageSender.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/sms/OutgoingEncryptedMessage.java b/app/src/main/java/org/thoughtcrime/securesms/sms/OutgoingEncryptedMessage.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/sms/OutgoingEncryptedMessage.java rename to app/src/main/java/org/thoughtcrime/securesms/sms/OutgoingEncryptedMessage.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/sms/OutgoingEndSessionMessage.java b/app/src/main/java/org/thoughtcrime/securesms/sms/OutgoingEndSessionMessage.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/sms/OutgoingEndSessionMessage.java rename to app/src/main/java/org/thoughtcrime/securesms/sms/OutgoingEndSessionMessage.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/sms/OutgoingIdentityDefaultMessage.java b/app/src/main/java/org/thoughtcrime/securesms/sms/OutgoingIdentityDefaultMessage.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/sms/OutgoingIdentityDefaultMessage.java rename to app/src/main/java/org/thoughtcrime/securesms/sms/OutgoingIdentityDefaultMessage.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/sms/OutgoingIdentityVerifiedMessage.java b/app/src/main/java/org/thoughtcrime/securesms/sms/OutgoingIdentityVerifiedMessage.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/sms/OutgoingIdentityVerifiedMessage.java rename to app/src/main/java/org/thoughtcrime/securesms/sms/OutgoingIdentityVerifiedMessage.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/sms/OutgoingKeyExchangeMessage.java b/app/src/main/java/org/thoughtcrime/securesms/sms/OutgoingKeyExchangeMessage.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/sms/OutgoingKeyExchangeMessage.java rename to app/src/main/java/org/thoughtcrime/securesms/sms/OutgoingKeyExchangeMessage.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/sms/OutgoingPrekeyBundleMessage.java b/app/src/main/java/org/thoughtcrime/securesms/sms/OutgoingPrekeyBundleMessage.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/sms/OutgoingPrekeyBundleMessage.java rename to app/src/main/java/org/thoughtcrime/securesms/sms/OutgoingPrekeyBundleMessage.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/sms/OutgoingTextMessage.java b/app/src/main/java/org/thoughtcrime/securesms/sms/OutgoingTextMessage.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/sms/OutgoingTextMessage.java rename to app/src/main/java/org/thoughtcrime/securesms/sms/OutgoingTextMessage.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/sms/TelephonyServiceState.java b/app/src/main/java/org/thoughtcrime/securesms/sms/TelephonyServiceState.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/sms/TelephonyServiceState.java rename to app/src/main/java/org/thoughtcrime/securesms/sms/TelephonyServiceState.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/stickers/BlessedPacks.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/BlessedPacks.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/stickers/BlessedPacks.java rename to app/src/main/java/org/thoughtcrime/securesms/stickers/BlessedPacks.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardPageAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardPageAdapter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardPageAdapter.java rename to app/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardPageAdapter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardPageFragment.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardPageFragment.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardPageFragment.java rename to app/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardPageFragment.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardPageViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardPageViewModel.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardPageViewModel.java rename to app/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardPageViewModel.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardProvider.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardProvider.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardProvider.java rename to app/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardProvider.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardRepository.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardRepository.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardRepository.java rename to app/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardRepository.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardViewModel.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardViewModel.java rename to app/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardViewModel.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/stickers/StickerLocator.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerLocator.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/stickers/StickerLocator.java rename to app/src/main/java/org/thoughtcrime/securesms/stickers/StickerLocator.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementActivity.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementAdapter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementAdapter.java rename to app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementAdapter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementRepository.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementRepository.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementRepository.java rename to app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementRepository.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementViewModel.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementViewModel.java rename to app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementViewModel.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/stickers/StickerManifest.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManifest.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/stickers/StickerManifest.java rename to app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManifest.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackInstallEvent.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackInstallEvent.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackInstallEvent.java rename to app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackInstallEvent.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackPreviewActivity.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackPreviewActivity.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackPreviewActivity.java rename to app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackPreviewActivity.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackPreviewAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackPreviewAdapter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackPreviewAdapter.java rename to app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackPreviewAdapter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackPreviewRepository.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackPreviewRepository.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackPreviewRepository.java rename to app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackPreviewRepository.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackPreviewViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackPreviewViewModel.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackPreviewViewModel.java rename to app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackPreviewViewModel.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/stickers/StickerPreviewPopup.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPreviewPopup.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/stickers/StickerPreviewPopup.java rename to app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPreviewPopup.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/stickers/StickerRemoteUri.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerRemoteUri.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/stickers/StickerRemoteUri.java rename to app/src/main/java/org/thoughtcrime/securesms/stickers/StickerRemoteUri.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/stickers/StickerRemoteUriFetcher.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerRemoteUriFetcher.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/stickers/StickerRemoteUriFetcher.java rename to app/src/main/java/org/thoughtcrime/securesms/stickers/StickerRemoteUriFetcher.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/stickers/StickerRemoteUriLoader.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerRemoteUriLoader.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/stickers/StickerRemoteUriLoader.java rename to app/src/main/java/org/thoughtcrime/securesms/stickers/StickerRemoteUriLoader.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/stickers/StickerSearchRepository.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerSearchRepository.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/stickers/StickerSearchRepository.java rename to app/src/main/java/org/thoughtcrime/securesms/stickers/StickerSearchRepository.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/stickers/StickerUrl.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerUrl.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/stickers/StickerUrl.java rename to app/src/main/java/org/thoughtcrime/securesms/stickers/StickerUrl.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/transport/InsecureFallbackApprovalException.java b/app/src/main/java/org/thoughtcrime/securesms/transport/InsecureFallbackApprovalException.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/transport/InsecureFallbackApprovalException.java rename to app/src/main/java/org/thoughtcrime/securesms/transport/InsecureFallbackApprovalException.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/transport/RetryLaterException.java b/app/src/main/java/org/thoughtcrime/securesms/transport/RetryLaterException.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/transport/RetryLaterException.java rename to app/src/main/java/org/thoughtcrime/securesms/transport/RetryLaterException.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/transport/UndeliverableMessageException.java b/app/src/main/java/org/thoughtcrime/securesms/transport/UndeliverableMessageException.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/transport/UndeliverableMessageException.java rename to app/src/main/java/org/thoughtcrime/securesms/transport/UndeliverableMessageException.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/AbstractCursorLoader.java b/app/src/main/java/org/thoughtcrime/securesms/util/AbstractCursorLoader.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/AbstractCursorLoader.java rename to app/src/main/java/org/thoughtcrime/securesms/util/AbstractCursorLoader.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/AsyncLoader.java b/app/src/main/java/org/thoughtcrime/securesms/util/AsyncLoader.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/AsyncLoader.java rename to app/src/main/java/org/thoughtcrime/securesms/util/AsyncLoader.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/AttachmentUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/AttachmentUtil.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/AttachmentUtil.java rename to app/src/main/java/org/thoughtcrime/securesms/util/AttachmentUtil.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/BackupUtil.kt b/app/src/main/java/org/thoughtcrime/securesms/util/BackupUtil.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/BackupUtil.kt rename to app/src/main/java/org/thoughtcrime/securesms/util/BackupUtil.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/BackupUtilOld.java b/app/src/main/java/org/thoughtcrime/securesms/util/BackupUtilOld.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/BackupUtilOld.java rename to app/src/main/java/org/thoughtcrime/securesms/util/BackupUtilOld.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/Base64.java b/app/src/main/java/org/thoughtcrime/securesms/util/Base64.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/Base64.java rename to app/src/main/java/org/thoughtcrime/securesms/util/Base64.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/BitmapDecodingException.java b/app/src/main/java/org/thoughtcrime/securesms/util/BitmapDecodingException.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/BitmapDecodingException.java rename to app/src/main/java/org/thoughtcrime/securesms/util/BitmapDecodingException.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/BitmapUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/BitmapUtil.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/BitmapUtil.java rename to app/src/main/java/org/thoughtcrime/securesms/util/BitmapUtil.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/CharacterCalculator.java b/app/src/main/java/org/thoughtcrime/securesms/util/CharacterCalculator.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/CharacterCalculator.java rename to app/src/main/java/org/thoughtcrime/securesms/util/CharacterCalculator.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/CloseableLiveData.java b/app/src/main/java/org/thoughtcrime/securesms/util/CloseableLiveData.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/CloseableLiveData.java rename to app/src/main/java/org/thoughtcrime/securesms/util/CloseableLiveData.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/CommunicationActions.java b/app/src/main/java/org/thoughtcrime/securesms/util/CommunicationActions.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/CommunicationActions.java rename to app/src/main/java/org/thoughtcrime/securesms/util/CommunicationActions.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/ContextProvider.kt b/app/src/main/java/org/thoughtcrime/securesms/util/ContextProvider.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/ContextProvider.kt rename to app/src/main/java/org/thoughtcrime/securesms/util/ContextProvider.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/Conversions.java b/app/src/main/java/org/thoughtcrime/securesms/util/Conversions.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/Conversions.java rename to app/src/main/java/org/thoughtcrime/securesms/util/Conversions.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/DateUtils.java b/app/src/main/java/org/thoughtcrime/securesms/util/DateUtils.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/DateUtils.java rename to app/src/main/java/org/thoughtcrime/securesms/util/DateUtils.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/Debouncer.java b/app/src/main/java/org/thoughtcrime/securesms/util/Debouncer.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/Debouncer.java rename to app/src/main/java/org/thoughtcrime/securesms/util/Debouncer.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/DelimiterUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/DelimiterUtil.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/DelimiterUtil.java rename to app/src/main/java/org/thoughtcrime/securesms/util/DelimiterUtil.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/Dialogs.java b/app/src/main/java/org/thoughtcrime/securesms/util/Dialogs.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/Dialogs.java rename to app/src/main/java/org/thoughtcrime/securesms/util/Dialogs.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/DynamicLanguage.java b/app/src/main/java/org/thoughtcrime/securesms/util/DynamicLanguage.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/DynamicLanguage.java rename to app/src/main/java/org/thoughtcrime/securesms/util/DynamicLanguage.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/DynamicNoActionBarTheme.java b/app/src/main/java/org/thoughtcrime/securesms/util/DynamicNoActionBarTheme.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/DynamicNoActionBarTheme.java rename to app/src/main/java/org/thoughtcrime/securesms/util/DynamicNoActionBarTheme.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/DynamicTheme.java b/app/src/main/java/org/thoughtcrime/securesms/util/DynamicTheme.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/DynamicTheme.java rename to app/src/main/java/org/thoughtcrime/securesms/util/DynamicTheme.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/ExpirationUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/ExpirationUtil.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/ExpirationUtil.java rename to app/src/main/java/org/thoughtcrime/securesms/util/ExpirationUtil.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/ExternalStorageUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/ExternalStorageUtil.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/ExternalStorageUtil.java rename to app/src/main/java/org/thoughtcrime/securesms/util/ExternalStorageUtil.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/FileProviderUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/FileProviderUtil.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/FileProviderUtil.java rename to app/src/main/java/org/thoughtcrime/securesms/util/FileProviderUtil.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/FileUtils.java b/app/src/main/java/org/thoughtcrime/securesms/util/FileUtils.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/FileUtils.java rename to app/src/main/java/org/thoughtcrime/securesms/util/FileUtils.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/FutureTaskListener.java b/app/src/main/java/org/thoughtcrime/securesms/util/FutureTaskListener.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/FutureTaskListener.java rename to app/src/main/java/org/thoughtcrime/securesms/util/FutureTaskListener.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/GroupUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/GroupUtil.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/GroupUtil.java rename to app/src/main/java/org/thoughtcrime/securesms/util/GroupUtil.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/Hex.java b/app/src/main/java/org/thoughtcrime/securesms/util/Hex.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/Hex.java rename to app/src/main/java/org/thoughtcrime/securesms/util/Hex.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/IdentityUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/IdentityUtil.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/IdentityUtil.java rename to app/src/main/java/org/thoughtcrime/securesms/util/IdentityUtil.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/IntentUtils.java b/app/src/main/java/org/thoughtcrime/securesms/util/IntentUtils.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/IntentUtils.java rename to app/src/main/java/org/thoughtcrime/securesms/util/IntentUtils.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/JsonUtils.java b/app/src/main/java/org/thoughtcrime/securesms/util/JsonUtils.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/JsonUtils.java rename to app/src/main/java/org/thoughtcrime/securesms/util/JsonUtils.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/LRUCache.java b/app/src/main/java/org/thoughtcrime/securesms/util/LRUCache.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/LRUCache.java rename to app/src/main/java/org/thoughtcrime/securesms/util/LRUCache.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/LimitedInputStream.java b/app/src/main/java/org/thoughtcrime/securesms/util/LimitedInputStream.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/LimitedInputStream.java rename to app/src/main/java/org/thoughtcrime/securesms/util/LimitedInputStream.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/LinkedBlockingLifoQueue.java b/app/src/main/java/org/thoughtcrime/securesms/util/LinkedBlockingLifoQueue.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/LinkedBlockingLifoQueue.java rename to app/src/main/java/org/thoughtcrime/securesms/util/LinkedBlockingLifoQueue.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/ListenableFutureTask.java b/app/src/main/java/org/thoughtcrime/securesms/util/ListenableFutureTask.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/ListenableFutureTask.java rename to app/src/main/java/org/thoughtcrime/securesms/util/ListenableFutureTask.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/LongClickCopySpan.java b/app/src/main/java/org/thoughtcrime/securesms/util/LongClickCopySpan.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/LongClickCopySpan.java rename to app/src/main/java/org/thoughtcrime/securesms/util/LongClickCopySpan.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/LongClickMovementMethod.java b/app/src/main/java/org/thoughtcrime/securesms/util/LongClickMovementMethod.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/LongClickMovementMethod.java rename to app/src/main/java/org/thoughtcrime/securesms/util/LongClickMovementMethod.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/MathUtils.java b/app/src/main/java/org/thoughtcrime/securesms/util/MathUtils.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/MathUtils.java rename to app/src/main/java/org/thoughtcrime/securesms/util/MathUtils.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/MediaUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/MediaUtil.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/MediaUtil.java rename to app/src/main/java/org/thoughtcrime/securesms/util/MediaUtil.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/MemoryFileUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/MemoryFileUtil.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/MemoryFileUtil.java rename to app/src/main/java/org/thoughtcrime/securesms/util/MemoryFileUtil.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/MmsCharacterCalculator.java b/app/src/main/java/org/thoughtcrime/securesms/util/MmsCharacterCalculator.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/MmsCharacterCalculator.java rename to app/src/main/java/org/thoughtcrime/securesms/util/MmsCharacterCalculator.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/NumberUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/NumberUtil.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/NumberUtil.java rename to app/src/main/java/org/thoughtcrime/securesms/util/NumberUtil.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/ObservingLiveData.java b/app/src/main/java/org/thoughtcrime/securesms/util/ObservingLiveData.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/ObservingLiveData.java rename to app/src/main/java/org/thoughtcrime/securesms/util/ObservingLiveData.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/ParcelUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/ParcelUtil.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/ParcelUtil.java rename to app/src/main/java/org/thoughtcrime/securesms/util/ParcelUtil.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/ParcelableUtil.kt b/app/src/main/java/org/thoughtcrime/securesms/util/ParcelableUtil.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/ParcelableUtil.kt rename to app/src/main/java/org/thoughtcrime/securesms/util/ParcelableUtil.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/PowerManagerCompat.java b/app/src/main/java/org/thoughtcrime/securesms/util/PowerManagerCompat.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/PowerManagerCompat.java rename to app/src/main/java/org/thoughtcrime/securesms/util/PowerManagerCompat.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/PushCharacterCalculator.java b/app/src/main/java/org/thoughtcrime/securesms/util/PushCharacterCalculator.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/PushCharacterCalculator.java rename to app/src/main/java/org/thoughtcrime/securesms/util/PushCharacterCalculator.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/RealtimeSleepTimer.java b/app/src/main/java/org/thoughtcrime/securesms/util/RealtimeSleepTimer.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/RealtimeSleepTimer.java rename to app/src/main/java/org/thoughtcrime/securesms/util/RealtimeSleepTimer.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/RedPhoneCallTypes.java b/app/src/main/java/org/thoughtcrime/securesms/util/RedPhoneCallTypes.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/RedPhoneCallTypes.java rename to app/src/main/java/org/thoughtcrime/securesms/util/RedPhoneCallTypes.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/ResUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/ResUtil.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/ResUtil.java rename to app/src/main/java/org/thoughtcrime/securesms/util/ResUtil.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/Rfc5724Uri.java b/app/src/main/java/org/thoughtcrime/securesms/util/Rfc5724Uri.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/Rfc5724Uri.java rename to app/src/main/java/org/thoughtcrime/securesms/util/Rfc5724Uri.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/SaveAttachmentTask.kt b/app/src/main/java/org/thoughtcrime/securesms/util/SaveAttachmentTask.kt similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/SaveAttachmentTask.kt rename to app/src/main/java/org/thoughtcrime/securesms/util/SaveAttachmentTask.kt diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/SearchUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/SearchUtil.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/SearchUtil.java rename to app/src/main/java/org/thoughtcrime/securesms/util/SearchUtil.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/SelectedRecipientsAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/util/SelectedRecipientsAdapter.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/SelectedRecipientsAdapter.java rename to app/src/main/java/org/thoughtcrime/securesms/util/SelectedRecipientsAdapter.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/ServiceUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/ServiceUtil.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/ServiceUtil.java rename to app/src/main/java/org/thoughtcrime/securesms/util/ServiceUtil.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/SingleLiveEvent.java b/app/src/main/java/org/thoughtcrime/securesms/util/SingleLiveEvent.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/SingleLiveEvent.java rename to app/src/main/java/org/thoughtcrime/securesms/util/SingleLiveEvent.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/SmsCharacterCalculator.java b/app/src/main/java/org/thoughtcrime/securesms/util/SmsCharacterCalculator.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/SmsCharacterCalculator.java rename to app/src/main/java/org/thoughtcrime/securesms/util/SmsCharacterCalculator.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/SoftHashMap.java b/app/src/main/java/org/thoughtcrime/securesms/util/SoftHashMap.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/SoftHashMap.java rename to app/src/main/java/org/thoughtcrime/securesms/util/SoftHashMap.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/SpanUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/SpanUtil.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/SpanUtil.java rename to app/src/main/java/org/thoughtcrime/securesms/util/SpanUtil.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/StableIdGenerator.java b/app/src/main/java/org/thoughtcrime/securesms/util/StableIdGenerator.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/StableIdGenerator.java rename to app/src/main/java/org/thoughtcrime/securesms/util/StableIdGenerator.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/StickyHeaderDecoration.java b/app/src/main/java/org/thoughtcrime/securesms/util/StickyHeaderDecoration.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/StickyHeaderDecoration.java rename to app/src/main/java/org/thoughtcrime/securesms/util/StickyHeaderDecoration.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/Stopwatch.java b/app/src/main/java/org/thoughtcrime/securesms/util/Stopwatch.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/Stopwatch.java rename to app/src/main/java/org/thoughtcrime/securesms/util/Stopwatch.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/TaggedFutureTask.java b/app/src/main/java/org/thoughtcrime/securesms/util/TaggedFutureTask.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/TaggedFutureTask.java rename to app/src/main/java/org/thoughtcrime/securesms/util/TaggedFutureTask.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/TelephonyUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/TelephonyUtil.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/TelephonyUtil.java rename to app/src/main/java/org/thoughtcrime/securesms/util/TelephonyUtil.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/TextSecurePreferences.java b/app/src/main/java/org/thoughtcrime/securesms/util/TextSecurePreferences.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/TextSecurePreferences.java rename to app/src/main/java/org/thoughtcrime/securesms/util/TextSecurePreferences.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/ThemeUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/ThemeUtil.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/ThemeUtil.java rename to app/src/main/java/org/thoughtcrime/securesms/util/ThemeUtil.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/ThreadUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/ThreadUtil.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/ThreadUtil.java rename to app/src/main/java/org/thoughtcrime/securesms/util/ThreadUtil.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/Throttler.java b/app/src/main/java/org/thoughtcrime/securesms/util/Throttler.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/Throttler.java rename to app/src/main/java/org/thoughtcrime/securesms/util/Throttler.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/Trimmer.java b/app/src/main/java/org/thoughtcrime/securesms/util/Trimmer.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/Trimmer.java rename to app/src/main/java/org/thoughtcrime/securesms/util/Trimmer.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/Util.java b/app/src/main/java/org/thoughtcrime/securesms/util/Util.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/Util.java rename to app/src/main/java/org/thoughtcrime/securesms/util/Util.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/VerifySpan.java b/app/src/main/java/org/thoughtcrime/securesms/util/VerifySpan.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/VerifySpan.java rename to app/src/main/java/org/thoughtcrime/securesms/util/VerifySpan.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/VersionTracker.java b/app/src/main/java/org/thoughtcrime/securesms/util/VersionTracker.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/VersionTracker.java rename to app/src/main/java/org/thoughtcrime/securesms/util/VersionTracker.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java rename to app/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/WakeLockUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/WakeLockUtil.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/WakeLockUtil.java rename to app/src/main/java/org/thoughtcrime/securesms/util/WakeLockUtil.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/WorkerThread.java b/app/src/main/java/org/thoughtcrime/securesms/util/WorkerThread.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/WorkerThread.java rename to app/src/main/java/org/thoughtcrime/securesms/util/WorkerThread.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/concurrent/AssertedSuccessListener.java b/app/src/main/java/org/thoughtcrime/securesms/util/concurrent/AssertedSuccessListener.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/concurrent/AssertedSuccessListener.java rename to app/src/main/java/org/thoughtcrime/securesms/util/concurrent/AssertedSuccessListener.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/concurrent/ListenableFuture.java b/app/src/main/java/org/thoughtcrime/securesms/util/concurrent/ListenableFuture.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/concurrent/ListenableFuture.java rename to app/src/main/java/org/thoughtcrime/securesms/util/concurrent/ListenableFuture.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/concurrent/SettableFuture.java b/app/src/main/java/org/thoughtcrime/securesms/util/concurrent/SettableFuture.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/concurrent/SettableFuture.java rename to app/src/main/java/org/thoughtcrime/securesms/util/concurrent/SettableFuture.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/concurrent/SignalExecutors.java b/app/src/main/java/org/thoughtcrime/securesms/util/concurrent/SignalExecutors.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/concurrent/SignalExecutors.java rename to app/src/main/java/org/thoughtcrime/securesms/util/concurrent/SignalExecutors.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/concurrent/SimpleTask.java b/app/src/main/java/org/thoughtcrime/securesms/util/concurrent/SimpleTask.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/concurrent/SimpleTask.java rename to app/src/main/java/org/thoughtcrime/securesms/util/concurrent/SimpleTask.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/dualsim/SubscriptionInfoCompat.java b/app/src/main/java/org/thoughtcrime/securesms/util/dualsim/SubscriptionInfoCompat.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/dualsim/SubscriptionInfoCompat.java rename to app/src/main/java/org/thoughtcrime/securesms/util/dualsim/SubscriptionInfoCompat.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/dualsim/SubscriptionManagerCompat.java b/app/src/main/java/org/thoughtcrime/securesms/util/dualsim/SubscriptionManagerCompat.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/dualsim/SubscriptionManagerCompat.java rename to app/src/main/java/org/thoughtcrime/securesms/util/dualsim/SubscriptionManagerCompat.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/dynamiclanguage/DynamicLanguageActivityHelper.java b/app/src/main/java/org/thoughtcrime/securesms/util/dynamiclanguage/DynamicLanguageActivityHelper.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/dynamiclanguage/DynamicLanguageActivityHelper.java rename to app/src/main/java/org/thoughtcrime/securesms/util/dynamiclanguage/DynamicLanguageActivityHelper.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/dynamiclanguage/DynamicLanguageContextWrapper.java b/app/src/main/java/org/thoughtcrime/securesms/util/dynamiclanguage/DynamicLanguageContextWrapper.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/dynamiclanguage/DynamicLanguageContextWrapper.java rename to app/src/main/java/org/thoughtcrime/securesms/util/dynamiclanguage/DynamicLanguageContextWrapper.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/dynamiclanguage/LanguageString.java b/app/src/main/java/org/thoughtcrime/securesms/util/dynamiclanguage/LanguageString.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/dynamiclanguage/LanguageString.java rename to app/src/main/java/org/thoughtcrime/securesms/util/dynamiclanguage/LanguageString.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/dynamiclanguage/LocaleParser.java b/app/src/main/java/org/thoughtcrime/securesms/util/dynamiclanguage/LocaleParser.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/dynamiclanguage/LocaleParser.java rename to app/src/main/java/org/thoughtcrime/securesms/util/dynamiclanguage/LocaleParser.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/spans/CenterAlignedRelativeSizeSpan.java b/app/src/main/java/org/thoughtcrime/securesms/util/spans/CenterAlignedRelativeSizeSpan.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/spans/CenterAlignedRelativeSizeSpan.java rename to app/src/main/java/org/thoughtcrime/securesms/util/spans/CenterAlignedRelativeSizeSpan.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/task/ProgressDialogAsyncTask.java b/app/src/main/java/org/thoughtcrime/securesms/util/task/ProgressDialogAsyncTask.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/task/ProgressDialogAsyncTask.java rename to app/src/main/java/org/thoughtcrime/securesms/util/task/ProgressDialogAsyncTask.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/task/SnackbarAsyncTask.java b/app/src/main/java/org/thoughtcrime/securesms/util/task/SnackbarAsyncTask.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/task/SnackbarAsyncTask.java rename to app/src/main/java/org/thoughtcrime/securesms/util/task/SnackbarAsyncTask.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/util/views/Stub.java b/app/src/main/java/org/thoughtcrime/securesms/util/views/Stub.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/util/views/Stub.java rename to app/src/main/java/org/thoughtcrime/securesms/util/views/Stub.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/video/EncryptedMediaDataSource.java b/app/src/main/java/org/thoughtcrime/securesms/video/EncryptedMediaDataSource.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/video/EncryptedMediaDataSource.java rename to app/src/main/java/org/thoughtcrime/securesms/video/EncryptedMediaDataSource.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java b/app/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java rename to app/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/video/exo/AttachmentDataSource.java b/app/src/main/java/org/thoughtcrime/securesms/video/exo/AttachmentDataSource.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/video/exo/AttachmentDataSource.java rename to app/src/main/java/org/thoughtcrime/securesms/video/exo/AttachmentDataSource.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/video/exo/AttachmentDataSourceFactory.java b/app/src/main/java/org/thoughtcrime/securesms/video/exo/AttachmentDataSourceFactory.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/video/exo/AttachmentDataSourceFactory.java rename to app/src/main/java/org/thoughtcrime/securesms/video/exo/AttachmentDataSourceFactory.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/video/exo/PartDataSource.java b/app/src/main/java/org/thoughtcrime/securesms/video/exo/PartDataSource.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/video/exo/PartDataSource.java rename to app/src/main/java/org/thoughtcrime/securesms/video/exo/PartDataSource.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/webrtc/CallNotificationBuilder.java b/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallNotificationBuilder.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/webrtc/CallNotificationBuilder.java rename to app/src/main/java/org/thoughtcrime/securesms/webrtc/CallNotificationBuilder.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/webrtc/CameraState.java b/app/src/main/java/org/thoughtcrime/securesms/webrtc/CameraState.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/webrtc/CameraState.java rename to app/src/main/java/org/thoughtcrime/securesms/webrtc/CameraState.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/webrtc/IncomingPstnCallReceiver.java b/app/src/main/java/org/thoughtcrime/securesms/webrtc/IncomingPstnCallReceiver.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/webrtc/IncomingPstnCallReceiver.java rename to app/src/main/java/org/thoughtcrime/securesms/webrtc/IncomingPstnCallReceiver.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/webrtc/PeerConnectionFactoryOptions.java b/app/src/main/java/org/thoughtcrime/securesms/webrtc/PeerConnectionFactoryOptions.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/webrtc/PeerConnectionFactoryOptions.java rename to app/src/main/java/org/thoughtcrime/securesms/webrtc/PeerConnectionFactoryOptions.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/webrtc/PeerConnectionWrapper.java b/app/src/main/java/org/thoughtcrime/securesms/webrtc/PeerConnectionWrapper.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/webrtc/PeerConnectionWrapper.java rename to app/src/main/java/org/thoughtcrime/securesms/webrtc/PeerConnectionWrapper.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/webrtc/UncaughtExceptionHandlerManager.java b/app/src/main/java/org/thoughtcrime/securesms/webrtc/UncaughtExceptionHandlerManager.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/webrtc/UncaughtExceptionHandlerManager.java rename to app/src/main/java/org/thoughtcrime/securesms/webrtc/UncaughtExceptionHandlerManager.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/webrtc/VoiceCallShare.java b/app/src/main/java/org/thoughtcrime/securesms/webrtc/VoiceCallShare.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/webrtc/VoiceCallShare.java rename to app/src/main/java/org/thoughtcrime/securesms/webrtc/VoiceCallShare.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/webrtc/WebRtcDataProtos.java b/app/src/main/java/org/thoughtcrime/securesms/webrtc/WebRtcDataProtos.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/webrtc/WebRtcDataProtos.java rename to app/src/main/java/org/thoughtcrime/securesms/webrtc/WebRtcDataProtos.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/webrtc/audio/BluetoothStateManager.java b/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/BluetoothStateManager.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/webrtc/audio/BluetoothStateManager.java rename to app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/BluetoothStateManager.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/webrtc/audio/IncomingRinger.java b/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/IncomingRinger.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/webrtc/audio/IncomingRinger.java rename to app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/IncomingRinger.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/webrtc/audio/OutgoingRinger.java b/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/OutgoingRinger.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/webrtc/audio/OutgoingRinger.java rename to app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/OutgoingRinger.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/webrtc/audio/SignalAudioManager.java b/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/SignalAudioManager.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/webrtc/audio/SignalAudioManager.java rename to app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/SignalAudioManager.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/webrtc/locks/AccelerometerListener.java b/app/src/main/java/org/thoughtcrime/securesms/webrtc/locks/AccelerometerListener.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/webrtc/locks/AccelerometerListener.java rename to app/src/main/java/org/thoughtcrime/securesms/webrtc/locks/AccelerometerListener.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/webrtc/locks/LockManager.java b/app/src/main/java/org/thoughtcrime/securesms/webrtc/locks/LockManager.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/webrtc/locks/LockManager.java rename to app/src/main/java/org/thoughtcrime/securesms/webrtc/locks/LockManager.java diff --git a/session/src/main/java/org/thoughtcrime/securesms/webrtc/locks/ProximityLock.java b/app/src/main/java/org/thoughtcrime/securesms/webrtc/locks/ProximityLock.java similarity index 100% rename from session/src/main/java/org/thoughtcrime/securesms/webrtc/locks/ProximityLock.java rename to app/src/main/java/org/thoughtcrime/securesms/webrtc/locks/ProximityLock.java diff --git a/session/src/main/jni/Android.mk b/app/src/main/jni/Android.mk similarity index 100% rename from session/src/main/jni/Android.mk rename to app/src/main/jni/Android.mk diff --git a/session/src/main/jni/Application.mk b/app/src/main/jni/Application.mk similarity index 100% rename from session/src/main/jni/Application.mk rename to app/src/main/jni/Application.mk diff --git a/session/src/main/jni/utils/org_thoughtcrime_securesms_util_FileUtils.cpp b/app/src/main/jni/utils/org_thoughtcrime_securesms_util_FileUtils.cpp similarity index 100% rename from session/src/main/jni/utils/org_thoughtcrime_securesms_util_FileUtils.cpp rename to app/src/main/jni/utils/org_thoughtcrime_securesms_util_FileUtils.cpp diff --git a/session/src/main/jni/utils/org_thoughtcrime_securesms_util_FileUtils.h b/app/src/main/jni/utils/org_thoughtcrime_securesms_util_FileUtils.h similarity index 100% rename from session/src/main/jni/utils/org_thoughtcrime_securesms_util_FileUtils.h rename to app/src/main/jni/utils/org_thoughtcrime_securesms_util_FileUtils.h diff --git a/session/src/main/protobuf/Backups.proto b/app/src/main/protobuf/Backups.proto similarity index 100% rename from session/src/main/protobuf/Backups.proto rename to app/src/main/protobuf/Backups.proto diff --git a/session/src/main/protobuf/DeviceName.proto b/app/src/main/protobuf/DeviceName.proto similarity index 100% rename from session/src/main/protobuf/DeviceName.proto rename to app/src/main/protobuf/DeviceName.proto diff --git a/session/src/main/protobuf/Makefile b/app/src/main/protobuf/Makefile similarity index 100% rename from session/src/main/protobuf/Makefile rename to app/src/main/protobuf/Makefile diff --git a/session/src/main/protobuf/WebRtcData.proto b/app/src/main/protobuf/WebRtcData.proto similarity index 100% rename from session/src/main/protobuf/WebRtcData.proto rename to app/src/main/protobuf/WebRtcData.proto diff --git a/session/src/main/res/anim/animation_toggle_in.xml b/app/src/main/res/anim/animation_toggle_in.xml similarity index 100% rename from session/src/main/res/anim/animation_toggle_in.xml rename to app/src/main/res/anim/animation_toggle_in.xml diff --git a/session/src/main/res/anim/animation_toggle_out.xml b/app/src/main/res/anim/animation_toggle_out.xml similarity index 100% rename from session/src/main/res/anim/animation_toggle_out.xml rename to app/src/main/res/anim/animation_toggle_out.xml diff --git a/session/src/main/res/anim/camera_capture_button_grow.xml b/app/src/main/res/anim/camera_capture_button_grow.xml similarity index 100% rename from session/src/main/res/anim/camera_capture_button_grow.xml rename to app/src/main/res/anim/camera_capture_button_grow.xml diff --git a/session/src/main/res/anim/camera_capture_button_shrink.xml b/app/src/main/res/anim/camera_capture_button_shrink.xml similarity index 100% rename from session/src/main/res/anim/camera_capture_button_shrink.xml rename to app/src/main/res/anim/camera_capture_button_shrink.xml diff --git a/session/src/main/res/anim/camera_slide_from_bottom.xml b/app/src/main/res/anim/camera_slide_from_bottom.xml similarity index 100% rename from session/src/main/res/anim/camera_slide_from_bottom.xml rename to app/src/main/res/anim/camera_slide_from_bottom.xml diff --git a/session/src/main/res/anim/camera_slide_to_bottom.xml b/app/src/main/res/anim/camera_slide_to_bottom.xml similarity index 100% rename from session/src/main/res/anim/camera_slide_to_bottom.xml rename to app/src/main/res/anim/camera_slide_to_bottom.xml diff --git a/session/src/main/res/anim/fade_in.xml b/app/src/main/res/anim/fade_in.xml similarity index 100% rename from session/src/main/res/anim/fade_in.xml rename to app/src/main/res/anim/fade_in.xml diff --git a/session/src/main/res/anim/fade_out.xml b/app/src/main/res/anim/fade_out.xml similarity index 100% rename from session/src/main/res/anim/fade_out.xml rename to app/src/main/res/anim/fade_out.xml diff --git a/session/src/main/res/anim/fade_scale_in.xml b/app/src/main/res/anim/fade_scale_in.xml similarity index 100% rename from session/src/main/res/anim/fade_scale_in.xml rename to app/src/main/res/anim/fade_scale_in.xml diff --git a/session/src/main/res/anim/fade_scale_out.xml b/app/src/main/res/anim/fade_scale_out.xml similarity index 100% rename from session/src/main/res/anim/fade_scale_out.xml rename to app/src/main/res/anim/fade_scale_out.xml diff --git a/session/src/main/res/anim/slide_from_bottom.xml b/app/src/main/res/anim/slide_from_bottom.xml similarity index 100% rename from session/src/main/res/anim/slide_from_bottom.xml rename to app/src/main/res/anim/slide_from_bottom.xml diff --git a/session/src/main/res/anim/slide_from_left.xml b/app/src/main/res/anim/slide_from_left.xml similarity index 100% rename from session/src/main/res/anim/slide_from_left.xml rename to app/src/main/res/anim/slide_from_left.xml diff --git a/session/src/main/res/anim/slide_from_right.xml b/app/src/main/res/anim/slide_from_right.xml similarity index 100% rename from session/src/main/res/anim/slide_from_right.xml rename to app/src/main/res/anim/slide_from_right.xml diff --git a/session/src/main/res/anim/slide_from_top.xml b/app/src/main/res/anim/slide_from_top.xml similarity index 100% rename from session/src/main/res/anim/slide_from_top.xml rename to app/src/main/res/anim/slide_from_top.xml diff --git a/session/src/main/res/anim/slide_to_bottom.xml b/app/src/main/res/anim/slide_to_bottom.xml similarity index 100% rename from session/src/main/res/anim/slide_to_bottom.xml rename to app/src/main/res/anim/slide_to_bottom.xml diff --git a/session/src/main/res/anim/slide_to_left.xml b/app/src/main/res/anim/slide_to_left.xml similarity index 100% rename from session/src/main/res/anim/slide_to_left.xml rename to app/src/main/res/anim/slide_to_left.xml diff --git a/session/src/main/res/anim/slide_to_right.xml b/app/src/main/res/anim/slide_to_right.xml similarity index 100% rename from session/src/main/res/anim/slide_to_right.xml rename to app/src/main/res/anim/slide_to_right.xml diff --git a/session/src/main/res/anim/slide_to_top.xml b/app/src/main/res/anim/slide_to_top.xml similarity index 100% rename from session/src/main/res/anim/slide_to_top.xml rename to app/src/main/res/anim/slide_to_top.xml diff --git a/session/src/main/res/anim/stationary.xml b/app/src/main/res/anim/stationary.xml similarity index 100% rename from session/src/main/res/anim/stationary.xml rename to app/src/main/res/anim/stationary.xml diff --git a/session/src/main/res/animator/appbar_elevation.xml b/app/src/main/res/animator/appbar_elevation.xml similarity index 100% rename from session/src/main/res/animator/appbar_elevation.xml rename to app/src/main/res/animator/appbar_elevation.xml diff --git a/session/src/main/res/animator/bottom_pause_to_play_animation.xml b/app/src/main/res/animator/bottom_pause_to_play_animation.xml similarity index 100% rename from session/src/main/res/animator/bottom_pause_to_play_animation.xml rename to app/src/main/res/animator/bottom_pause_to_play_animation.xml diff --git a/session/src/main/res/animator/bottom_play_to_pause_animation.xml b/app/src/main/res/animator/bottom_play_to_pause_animation.xml similarity index 100% rename from session/src/main/res/animator/bottom_play_to_pause_animation.xml rename to app/src/main/res/animator/bottom_play_to_pause_animation.xml diff --git a/session/src/main/res/animator/rotate_90_animation.xml b/app/src/main/res/animator/rotate_90_animation.xml similarity index 100% rename from session/src/main/res/animator/rotate_90_animation.xml rename to app/src/main/res/animator/rotate_90_animation.xml diff --git a/session/src/main/res/animator/rotate_minus_90_animation.xml b/app/src/main/res/animator/rotate_minus_90_animation.xml similarity index 100% rename from session/src/main/res/animator/rotate_minus_90_animation.xml rename to app/src/main/res/animator/rotate_minus_90_animation.xml diff --git a/session/src/main/res/animator/upper_pause_to_play_animation.xml b/app/src/main/res/animator/upper_pause_to_play_animation.xml similarity index 100% rename from session/src/main/res/animator/upper_pause_to_play_animation.xml rename to app/src/main/res/animator/upper_pause_to_play_animation.xml diff --git a/session/src/main/res/animator/upper_play_to_pause_animation.xml b/app/src/main/res/animator/upper_play_to_pause_animation.xml similarity index 100% rename from session/src/main/res/animator/upper_play_to_pause_animation.xml rename to app/src/main/res/animator/upper_play_to_pause_animation.xml diff --git a/session/src/main/res/color/text_color_dark_theme.xml b/app/src/main/res/color/text_color_dark_theme.xml similarity index 100% rename from session/src/main/res/color/text_color_dark_theme.xml rename to app/src/main/res/color/text_color_dark_theme.xml diff --git a/session/src/main/res/color/text_color_secondary_dark_theme.xml b/app/src/main/res/color/text_color_secondary_dark_theme.xml similarity index 100% rename from session/src/main/res/color/text_color_secondary_dark_theme.xml rename to app/src/main/res/color/text_color_secondary_dark_theme.xml diff --git a/session/src/main/res/drawable-anydpi-v24/ic_notification.xml b/app/src/main/res/drawable-anydpi-v24/ic_notification.xml similarity index 100% rename from session/src/main/res/drawable-anydpi-v24/ic_notification.xml rename to app/src/main/res/drawable-anydpi-v24/ic_notification.xml diff --git a/session/src/main/res/drawable-hdpi/baseline_account_circle_white_24.png b/app/src/main/res/drawable-hdpi/baseline_account_circle_white_24.png similarity index 100% rename from session/src/main/res/drawable-hdpi/baseline_account_circle_white_24.png rename to app/src/main/res/drawable-hdpi/baseline_account_circle_white_24.png diff --git a/session/src/main/res/drawable-hdpi/baseline_email_white_24.png b/app/src/main/res/drawable-hdpi/baseline_email_white_24.png similarity index 100% rename from session/src/main/res/drawable-hdpi/baseline_email_white_24.png rename to app/src/main/res/drawable-hdpi/baseline_email_white_24.png diff --git a/session/src/main/res/drawable-hdpi/check.png b/app/src/main/res/drawable-hdpi/check.png similarity index 100% rename from session/src/main/res/drawable-hdpi/check.png rename to app/src/main/res/drawable-hdpi/check.png diff --git a/session/src/main/res/drawable-hdpi/clear_profile_avatar.png b/app/src/main/res/drawable-hdpi/clear_profile_avatar.png similarity index 100% rename from session/src/main/res/drawable-hdpi/clear_profile_avatar.png rename to app/src/main/res/drawable-hdpi/clear_profile_avatar.png diff --git a/session/src/main/res/drawable-hdpi/conversation_list_empty_state.png b/app/src/main/res/drawable-hdpi/conversation_list_empty_state.png similarity index 100% rename from session/src/main/res/drawable-hdpi/conversation_list_empty_state.png rename to app/src/main/res/drawable-hdpi/conversation_list_empty_state.png diff --git a/session/src/main/res/drawable-hdpi/divet_lower_right_dark.png b/app/src/main/res/drawable-hdpi/divet_lower_right_dark.png similarity index 100% rename from session/src/main/res/drawable-hdpi/divet_lower_right_dark.png rename to app/src/main/res/drawable-hdpi/divet_lower_right_dark.png diff --git a/session/src/main/res/drawable-hdpi/divet_lower_right_light.png b/app/src/main/res/drawable-hdpi/divet_lower_right_light.png similarity index 100% rename from session/src/main/res/drawable-hdpi/divet_lower_right_light.png rename to app/src/main/res/drawable-hdpi/divet_lower_right_light.png diff --git a/session/src/main/res/drawable-hdpi/empty_inbox_1.png b/app/src/main/res/drawable-hdpi/empty_inbox_1.png similarity index 100% rename from session/src/main/res/drawable-hdpi/empty_inbox_1.png rename to app/src/main/res/drawable-hdpi/empty_inbox_1.png diff --git a/session/src/main/res/drawable-hdpi/empty_inbox_2.png b/app/src/main/res/drawable-hdpi/empty_inbox_2.png similarity index 100% rename from session/src/main/res/drawable-hdpi/empty_inbox_2.png rename to app/src/main/res/drawable-hdpi/empty_inbox_2.png diff --git a/session/src/main/res/drawable-hdpi/empty_inbox_3.png b/app/src/main/res/drawable-hdpi/empty_inbox_3.png similarity index 100% rename from session/src/main/res/drawable-hdpi/empty_inbox_3.png rename to app/src/main/res/drawable-hdpi/empty_inbox_3.png diff --git a/session/src/main/res/drawable-hdpi/empty_inbox_4.png b/app/src/main/res/drawable-hdpi/empty_inbox_4.png similarity index 100% rename from session/src/main/res/drawable-hdpi/empty_inbox_4.png rename to app/src/main/res/drawable-hdpi/empty_inbox_4.png diff --git a/session/src/main/res/drawable-hdpi/empty_inbox_5.png b/app/src/main/res/drawable-hdpi/empty_inbox_5.png similarity index 100% rename from session/src/main/res/drawable-hdpi/empty_inbox_5.png rename to app/src/main/res/drawable-hdpi/empty_inbox_5.png diff --git a/session/src/main/res/drawable-hdpi/ic_account_box_dark.png b/app/src/main/res/drawable-hdpi/ic_account_box_dark.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_account_box_dark.png rename to app/src/main/res/drawable-hdpi/ic_account_box_dark.png diff --git a/session/src/main/res/drawable-hdpi/ic_account_box_light.png b/app/src/main/res/drawable-hdpi/ic_account_box_light.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_account_box_light.png rename to app/src/main/res/drawable-hdpi/ic_account_box_light.png diff --git a/session/src/main/res/drawable-hdpi/ic_action_name.png b/app/src/main/res/drawable-hdpi/ic_action_name.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_action_name.png rename to app/src/main/res/drawable-hdpi/ic_action_name.png diff --git a/session/src/main/res/drawable-hdpi/ic_action_warning_red.png b/app/src/main/res/drawable-hdpi/ic_action_warning_red.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_action_warning_red.png rename to app/src/main/res/drawable-hdpi/ic_action_warning_red.png diff --git a/session/src/main/res/drawable-hdpi/ic_add_caption_36.png b/app/src/main/res/drawable-hdpi/ic_add_caption_36.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_add_caption_36.png rename to app/src/main/res/drawable-hdpi/ic_add_caption_36.png diff --git a/session/src/main/res/drawable-hdpi/ic_add_photo.png b/app/src/main/res/drawable-hdpi/ic_add_photo.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_add_photo.png rename to app/src/main/res/drawable-hdpi/ic_add_photo.png diff --git a/session/src/main/res/drawable-hdpi/ic_add_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_add_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_add_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_add_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_add_white_original_24dp.png b/app/src/main/res/drawable-hdpi/ic_add_white_original_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_add_white_original_24dp.png rename to app/src/main/res/drawable-hdpi/ic_add_white_original_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_advanced_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_advanced_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_advanced_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_advanced_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_archive_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_archive_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_archive_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_archive_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_arrow_back_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_arrow_back_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_arrow_back_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_arrow_back_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_arrow_right.png b/app/src/main/res/drawable-hdpi/ic_arrow_right.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_arrow_right.png rename to app/src/main/res/drawable-hdpi/ic_arrow_right.png diff --git a/session/src/main/res/drawable-hdpi/ic_arrow_up.png b/app/src/main/res/drawable-hdpi/ic_arrow_up.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_arrow_up.png rename to app/src/main/res/drawable-hdpi/ic_arrow_up.png diff --git a/session/src/main/res/drawable-hdpi/ic_attach_grey600_24dp.png b/app/src/main/res/drawable-hdpi/ic_attach_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_attach_grey600_24dp.png rename to app/src/main/res/drawable-hdpi/ic_attach_grey600_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_attach_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_attach_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_attach_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_attach_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_audio_dark.png b/app/src/main/res/drawable-hdpi/ic_audio_dark.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_audio_dark.png rename to app/src/main/res/drawable-hdpi/ic_audio_dark.png diff --git a/session/src/main/res/drawable-hdpi/ic_audio_light.png b/app/src/main/res/drawable-hdpi/ic_audio_light.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_audio_light.png rename to app/src/main/res/drawable-hdpi/ic_audio_light.png diff --git a/session/src/main/res/drawable-hdpi/ic_backspace_grey600_24dp.png b/app/src/main/res/drawable-hdpi/ic_backspace_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_backspace_grey600_24dp.png rename to app/src/main/res/drawable-hdpi/ic_backspace_grey600_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_block_grey600_18dp.png b/app/src/main/res/drawable-hdpi/ic_block_grey600_18dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_block_grey600_18dp.png rename to app/src/main/res/drawable-hdpi/ic_block_grey600_18dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_block_white_18dp.png b/app/src/main/res/drawable-hdpi/ic_block_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_block_white_18dp.png rename to app/src/main/res/drawable-hdpi/ic_block_white_18dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_block_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_block_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_block_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_block_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_bluetooth_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_bluetooth_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_bluetooth_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_bluetooth_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_brightness_6_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_brightness_6_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_brightness_6_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_brightness_6_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_broken_link.png b/app/src/main/res/drawable-hdpi/ic_broken_link.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_broken_link.png rename to app/src/main/res/drawable-hdpi/ic_broken_link.png diff --git a/session/src/main/res/drawable-hdpi/ic_brush_highlight_32.png b/app/src/main/res/drawable-hdpi/ic_brush_highlight_32.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_brush_highlight_32.png rename to app/src/main/res/drawable-hdpi/ic_brush_highlight_32.png diff --git a/session/src/main/res/drawable-hdpi/ic_brush_marker_32.png b/app/src/main/res/drawable-hdpi/ic_brush_marker_32.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_brush_marker_32.png rename to app/src/main/res/drawable-hdpi/ic_brush_marker_32.png diff --git a/session/src/main/res/drawable-hdpi/ic_call_end_grey600_32dp.png b/app/src/main/res/drawable-hdpi/ic_call_end_grey600_32dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_call_end_grey600_32dp.png rename to app/src/main/res/drawable-hdpi/ic_call_end_grey600_32dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_call_end_white_48dp.png b/app/src/main/res/drawable-hdpi/ic_call_end_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_call_end_white_48dp.png rename to app/src/main/res/drawable-hdpi/ic_call_end_white_48dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_call_made_grey600_24dp.png b/app/src/main/res/drawable-hdpi/ic_call_made_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_call_made_grey600_24dp.png rename to app/src/main/res/drawable-hdpi/ic_call_made_grey600_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_call_missed_grey600_24dp.png b/app/src/main/res/drawable-hdpi/ic_call_missed_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_call_missed_grey600_24dp.png rename to app/src/main/res/drawable-hdpi/ic_call_missed_grey600_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_call_received_grey600_24dp.png b/app/src/main/res/drawable-hdpi/ic_call_received_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_call_received_grey600_24dp.png rename to app/src/main/res/drawable-hdpi/ic_call_received_grey600_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_call_secure_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_call_secure_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_call_secure_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_call_secure_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_call_split_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_call_split_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_call_split_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_call_split_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_camera_alt_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_camera_alt_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_camera_alt_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_camera_alt_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_camera_filled_24.png b/app/src/main/res/drawable-hdpi/ic_camera_filled_24.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_camera_filled_24.png rename to app/src/main/res/drawable-hdpi/ic_camera_filled_24.png diff --git a/session/src/main/res/drawable-hdpi/ic_camera_shutter.png b/app/src/main/res/drawable-hdpi/ic_camera_shutter.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_camera_shutter.png rename to app/src/main/res/drawable-hdpi/ic_camera_shutter.png diff --git a/session/src/main/res/drawable-hdpi/ic_camera_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_camera_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_camera_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_camera_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_caption_28.png b/app/src/main/res/drawable-hdpi/ic_caption_28.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_caption_28.png rename to app/src/main/res/drawable-hdpi/ic_caption_28.png diff --git a/session/src/main/res/drawable-hdpi/ic_check_circle_32.png b/app/src/main/res/drawable-hdpi/ic_check_circle_32.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_check_circle_32.png rename to app/src/main/res/drawable-hdpi/ic_check_circle_32.png diff --git a/session/src/main/res/drawable-hdpi/ic_check_circle_white_18dp.png b/app/src/main/res/drawable-hdpi/ic_check_circle_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_check_circle_white_18dp.png rename to app/src/main/res/drawable-hdpi/ic_check_circle_white_18dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_check_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_check_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_check_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_check_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_check_white_48dp.png b/app/src/main/res/drawable-hdpi/ic_check_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_check_white_48dp.png rename to app/src/main/res/drawable-hdpi/ic_check_white_48dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_circle_fill_white_48dp.png b/app/src/main/res/drawable-hdpi/ic_circle_fill_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_circle_fill_white_48dp.png rename to app/src/main/res/drawable-hdpi/ic_circle_fill_white_48dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_clear_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_clear_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_clear_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_clear_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_close_grey600_32dp.png b/app/src/main/res/drawable-hdpi/ic_close_grey600_32dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_close_grey600_32dp.png rename to app/src/main/res/drawable-hdpi/ic_close_grey600_32dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_close_white_18dp.png b/app/src/main/res/drawable-hdpi/ic_close_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_close_white_18dp.png rename to app/src/main/res/drawable-hdpi/ic_close_white_18dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_close_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_close_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_close_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_close_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_close_white_48dp.png b/app/src/main/res/drawable-hdpi/ic_close_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_close_white_48dp.png rename to app/src/main/res/drawable-hdpi/ic_close_white_48dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_contact_picture.png b/app/src/main/res/drawable-hdpi/ic_contact_picture.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_contact_picture.png rename to app/src/main/res/drawable-hdpi/ic_contact_picture.png diff --git a/session/src/main/res/drawable-hdpi/ic_contact_picture_large.png b/app/src/main/res/drawable-hdpi/ic_contact_picture_large.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_contact_picture_large.png rename to app/src/main/res/drawable-hdpi/ic_contact_picture_large.png diff --git a/session/src/main/res/drawable-hdpi/ic_contacts_white_48dp.png b/app/src/main/res/drawable-hdpi/ic_contacts_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_contacts_white_48dp.png rename to app/src/main/res/drawable-hdpi/ic_contacts_white_48dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_content_copy_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_content_copy_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_content_copy_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_content_copy_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_create_album_filled_32.png b/app/src/main/res/drawable-hdpi/ic_create_album_filled_32.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_create_album_filled_32.png rename to app/src/main/res/drawable-hdpi/ic_create_album_filled_32.png diff --git a/session/src/main/res/drawable-hdpi/ic_create_album_outline_32.png b/app/src/main/res/drawable-hdpi/ic_create_album_outline_32.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_create_album_outline_32.png rename to app/src/main/res/drawable-hdpi/ic_create_album_outline_32.png diff --git a/session/src/main/res/drawable-hdpi/ic_create_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_create_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_create_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_create_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_crop_32.png b/app/src/main/res/drawable-hdpi/ic_crop_32.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_crop_32.png rename to app/src/main/res/drawable-hdpi/ic_crop_32.png diff --git a/session/src/main/res/drawable-hdpi/ic_crop_lock_32.png b/app/src/main/res/drawable-hdpi/ic_crop_lock_32.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_crop_lock_32.png rename to app/src/main/res/drawable-hdpi/ic_crop_lock_32.png diff --git a/session/src/main/res/drawable-hdpi/ic_crop_unlock_32.png b/app/src/main/res/drawable-hdpi/ic_crop_unlock_32.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_crop_unlock_32.png rename to app/src/main/res/drawable-hdpi/ic_crop_unlock_32.png diff --git a/session/src/main/res/drawable-hdpi/ic_dashboard_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_dashboard_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_dashboard_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_dashboard_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_delete_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_delete_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_delete_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_delete_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_delivery_status_delivered.png b/app/src/main/res/drawable-hdpi/ic_delivery_status_delivered.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_delivery_status_delivered.png rename to app/src/main/res/drawable-hdpi/ic_delivery_status_delivered.png diff --git a/session/src/main/res/drawable-hdpi/ic_delivery_status_read.png b/app/src/main/res/drawable-hdpi/ic_delivery_status_read.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_delivery_status_read.png rename to app/src/main/res/drawable-hdpi/ic_delivery_status_read.png diff --git a/session/src/main/res/drawable-hdpi/ic_delivery_status_sending.png b/app/src/main/res/drawable-hdpi/ic_delivery_status_sending.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_delivery_status_sending.png rename to app/src/main/res/drawable-hdpi/ic_delivery_status_sending.png diff --git a/session/src/main/res/drawable-hdpi/ic_delivery_status_sent.png b/app/src/main/res/drawable-hdpi/ic_delivery_status_sent.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_delivery_status_sent.png rename to app/src/main/res/drawable-hdpi/ic_delivery_status_sent.png diff --git a/session/src/main/res/drawable-hdpi/ic_devices_white.png b/app/src/main/res/drawable-hdpi/ic_devices_white.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_devices_white.png rename to app/src/main/res/drawable-hdpi/ic_devices_white.png diff --git a/session/src/main/res/drawable-hdpi/ic_dialpad_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_dialpad_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_dialpad_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_dialpad_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_document_large_dark.png b/app/src/main/res/drawable-hdpi/ic_document_large_dark.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_document_large_dark.png rename to app/src/main/res/drawable-hdpi/ic_document_large_dark.png diff --git a/session/src/main/res/drawable-hdpi/ic_document_large_light.png b/app/src/main/res/drawable-hdpi/ic_document_large_light.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_document_large_light.png rename to app/src/main/res/drawable-hdpi/ic_document_large_light.png diff --git a/session/src/main/res/drawable-hdpi/ic_document_small_dark.png b/app/src/main/res/drawable-hdpi/ic_document_small_dark.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_document_small_dark.png rename to app/src/main/res/drawable-hdpi/ic_document_small_dark.png diff --git a/session/src/main/res/drawable-hdpi/ic_document_small_light.png b/app/src/main/res/drawable-hdpi/ic_document_small_light.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_document_small_light.png rename to app/src/main/res/drawable-hdpi/ic_document_small_light.png diff --git a/session/src/main/res/drawable-hdpi/ic_download_circle_fill_white_48dp.png b/app/src/main/res/drawable-hdpi/ic_download_circle_fill_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_download_circle_fill_white_48dp.png rename to app/src/main/res/drawable-hdpi/ic_download_circle_fill_white_48dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_emoji_32.png b/app/src/main/res/drawable-hdpi/ic_emoji_32.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_emoji_32.png rename to app/src/main/res/drawable-hdpi/ic_emoji_32.png diff --git a/session/src/main/res/drawable-hdpi/ic_error.png b/app/src/main/res/drawable-hdpi/ic_error.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_error.png rename to app/src/main/res/drawable-hdpi/ic_error.png diff --git a/session/src/main/res/drawable-hdpi/ic_face_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_face_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_face_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_face_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_favorite_grey600_24dp.png b/app/src/main/res/drawable-hdpi/ic_favorite_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_favorite_grey600_24dp.png rename to app/src/main/res/drawable-hdpi/ic_favorite_grey600_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_file_download_white_36dp.png b/app/src/main/res/drawable-hdpi/ic_file_download_white_36dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_file_download_white_36dp.png rename to app/src/main/res/drawable-hdpi/ic_file_download_white_36dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_fingerprint_white_48dp.png b/app/src/main/res/drawable-hdpi/ic_fingerprint_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_fingerprint_white_48dp.png rename to app/src/main/res/drawable-hdpi/ic_fingerprint_white_48dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_flip_32.png b/app/src/main/res/drawable-hdpi/ic_flip_32.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_flip_32.png rename to app/src/main/res/drawable-hdpi/ic_flip_32.png diff --git a/session/src/main/res/drawable-hdpi/ic_forum_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_forum_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_forum_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_forum_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_gif_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_gif_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_gif_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_gif_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_group_grey600_24dp.png b/app/src/main/res/drawable-hdpi/ic_group_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_group_grey600_24dp.png rename to app/src/main/res/drawable-hdpi/ic_group_grey600_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_group_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_group_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_group_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_group_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_headset_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_headset_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_headset_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_headset_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_image_dark.png b/app/src/main/res/drawable-hdpi/ic_image_dark.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_image_dark.png rename to app/src/main/res/drawable-hdpi/ic_image_dark.png diff --git a/session/src/main/res/drawable-hdpi/ic_image_light.png b/app/src/main/res/drawable-hdpi/ic_image_light.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_image_light.png rename to app/src/main/res/drawable-hdpi/ic_image_light.png diff --git a/session/src/main/res/drawable-hdpi/ic_image_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_image_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_image_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_image_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_info_outline_dark.png b/app/src/main/res/drawable-hdpi/ic_info_outline_dark.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_info_outline_dark.png rename to app/src/main/res/drawable-hdpi/ic_info_outline_dark.png diff --git a/session/src/main/res/drawable-hdpi/ic_info_outline_light.png b/app/src/main/res/drawable-hdpi/ic_info_outline_light.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_info_outline_light.png rename to app/src/main/res/drawable-hdpi/ic_info_outline_light.png diff --git a/session/src/main/res/drawable-hdpi/ic_info_outline_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_info_outline_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_info_outline_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_info_outline_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_info_white_18dp.png b/app/src/main/res/drawable-hdpi/ic_info_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_info_white_18dp.png rename to app/src/main/res/drawable-hdpi/ic_info_white_18dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_insert_drive_file_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_insert_drive_file_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_insert_drive_file_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_insert_drive_file_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_keyboard_arrow_left_grey600_24dp.png b/app/src/main/res/drawable-hdpi/ic_keyboard_arrow_left_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_keyboard_arrow_left_grey600_24dp.png rename to app/src/main/res/drawable-hdpi/ic_keyboard_arrow_left_grey600_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_keyboard_grey600_24dp.png b/app/src/main/res/drawable-hdpi/ic_keyboard_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_keyboard_grey600_24dp.png rename to app/src/main/res/drawable-hdpi/ic_keyboard_grey600_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_keyboard_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_keyboard_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_keyboard_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_keyboard_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_laptop_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_laptop_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_laptop_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_laptop_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_launch_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_launch_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_launch_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_launch_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_local_dining_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_local_dining_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_local_dining_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_local_dining_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_location_on_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_location_on_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_location_on_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_location_on_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_lock_white_18dp.png b/app/src/main/res/drawable-hdpi/ic_lock_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_lock_white_18dp.png rename to app/src/main/res/drawable-hdpi/ic_lock_white_18dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_lock_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_lock_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_lock_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_lock_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_lock_white_48dp.png b/app/src/main/res/drawable-hdpi/ic_lock_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_lock_white_48dp.png rename to app/src/main/res/drawable-hdpi/ic_lock_white_48dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_menu_add_field_holo_light.png b/app/src/main/res/drawable-hdpi/ic_menu_add_field_holo_light.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_menu_add_field_holo_light.png rename to app/src/main/res/drawable-hdpi/ic_menu_add_field_holo_light.png diff --git a/session/src/main/res/drawable-hdpi/ic_menu_lock_dark.png b/app/src/main/res/drawable-hdpi/ic_menu_lock_dark.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_menu_lock_dark.png rename to app/src/main/res/drawable-hdpi/ic_menu_lock_dark.png diff --git a/session/src/main/res/drawable-hdpi/ic_menu_login.png b/app/src/main/res/drawable-hdpi/ic_menu_login.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_menu_login.png rename to app/src/main/res/drawable-hdpi/ic_menu_login.png diff --git a/session/src/main/res/drawable-hdpi/ic_menu_remove_holo_light.png b/app/src/main/res/drawable-hdpi/ic_menu_remove_holo_light.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_menu_remove_holo_light.png rename to app/src/main/res/drawable-hdpi/ic_menu_remove_holo_light.png diff --git a/session/src/main/res/drawable-hdpi/ic_menu_search_holo_light.png b/app/src/main/res/drawable-hdpi/ic_menu_search_holo_light.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_menu_search_holo_light.png rename to app/src/main/res/drawable-hdpi/ic_menu_search_holo_light.png diff --git a/session/src/main/res/drawable-hdpi/ic_message_black_18dp.png b/app/src/main/res/drawable-hdpi/ic_message_black_18dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_message_black_18dp.png rename to app/src/main/res/drawable-hdpi/ic_message_black_18dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_message_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_message_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_message_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_message_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_mic_grey600_24dp.png b/app/src/main/res/drawable-hdpi/ic_mic_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_mic_grey600_24dp.png rename to app/src/main/res/drawable-hdpi/ic_mic_grey600_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_mic_off_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_mic_off_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_mic_off_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_mic_off_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_mic_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_mic_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_mic_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_mic_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_mic_white_48dp.png b/app/src/main/res/drawable-hdpi/ic_mic_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_mic_white_48dp.png rename to app/src/main/res/drawable-hdpi/ic_mic_white_48dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_missing_thumbnail_picture.png b/app/src/main/res/drawable-hdpi/ic_missing_thumbnail_picture.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_missing_thumbnail_picture.png rename to app/src/main/res/drawable-hdpi/ic_missing_thumbnail_picture.png diff --git a/session/src/main/res/drawable-hdpi/ic_mood_grey600_24dp.png b/app/src/main/res/drawable-hdpi/ic_mood_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_mood_grey600_24dp.png rename to app/src/main/res/drawable-hdpi/ic_mood_grey600_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_mood_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_mood_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_mood_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_mood_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_movie_creation_dark.png b/app/src/main/res/drawable-hdpi/ic_movie_creation_dark.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_movie_creation_dark.png rename to app/src/main/res/drawable-hdpi/ic_movie_creation_dark.png diff --git a/session/src/main/res/drawable-hdpi/ic_movie_creation_light.png b/app/src/main/res/drawable-hdpi/ic_movie_creation_light.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_movie_creation_light.png rename to app/src/main/res/drawable-hdpi/ic_movie_creation_light.png diff --git a/session/src/main/res/drawable-hdpi/ic_note_to_self.png b/app/src/main/res/drawable-hdpi/ic_note_to_self.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_note_to_self.png rename to app/src/main/res/drawable-hdpi/ic_note_to_self.png diff --git a/session/src/main/res/drawable-hdpi/ic_notification.png b/app/src/main/res/drawable-hdpi/ic_notification.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_notification.png rename to app/src/main/res/drawable-hdpi/ic_notification.png diff --git a/session/src/main/res/drawable-hdpi/ic_notifications_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_notifications_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_notifications_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_notifications_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_pause_circle_fill_white_48dp.png b/app/src/main/res/drawable-hdpi/ic_pause_circle_fill_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_pause_circle_fill_white_48dp.png rename to app/src/main/res/drawable-hdpi/ic_pause_circle_fill_white_48dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_person_add_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_person_add_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_person_add_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_person_add_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_person_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_person_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_person_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_person_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_pets_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_pets_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_pets_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_pets_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_phone_grey600_32dp.png b/app/src/main/res/drawable-hdpi/ic_phone_grey600_32dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_phone_grey600_32dp.png rename to app/src/main/res/drawable-hdpi/ic_phone_grey600_32dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_photo_camera_dark.png b/app/src/main/res/drawable-hdpi/ic_photo_camera_dark.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_photo_camera_dark.png rename to app/src/main/res/drawable-hdpi/ic_photo_camera_dark.png diff --git a/session/src/main/res/drawable-hdpi/ic_photo_camera_light.png b/app/src/main/res/drawable-hdpi/ic_photo_camera_light.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_photo_camera_light.png rename to app/src/main/res/drawable-hdpi/ic_photo_camera_light.png diff --git a/session/src/main/res/drawable-hdpi/ic_photo_camera_white_48dp.png b/app/src/main/res/drawable-hdpi/ic_photo_camera_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_photo_camera_white_48dp.png rename to app/src/main/res/drawable-hdpi/ic_photo_camera_white_48dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_photo_library_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_photo_library_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_photo_library_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_photo_library_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_play_circle_fill_white_48dp.png b/app/src/main/res/drawable-hdpi/ic_play_circle_fill_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_play_circle_fill_white_48dp.png rename to app/src/main/res/drawable-hdpi/ic_play_circle_fill_white_48dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_plus_28.png b/app/src/main/res/drawable-hdpi/ic_plus_28.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_plus_28.png rename to app/src/main/res/drawable-hdpi/ic_plus_28.png diff --git a/session/src/main/res/drawable-hdpi/ic_profile_camera.png b/app/src/main/res/drawable-hdpi/ic_profile_camera.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_profile_camera.png rename to app/src/main/res/drawable-hdpi/ic_profile_camera.png diff --git a/session/src/main/res/drawable-hdpi/ic_profile_default.png b/app/src/main/res/drawable-hdpi/ic_profile_default.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_profile_default.png rename to app/src/main/res/drawable-hdpi/ic_profile_default.png diff --git a/session/src/main/res/drawable-hdpi/ic_refresh_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_refresh_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_refresh_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_refresh_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_reply.png b/app/src/main/res/drawable-hdpi/ic_reply.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_reply.png rename to app/src/main/res/drawable-hdpi/ic_reply.png diff --git a/session/src/main/res/drawable-hdpi/ic_reply_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_reply_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_reply_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_reply_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_reply_white_36dp.png b/app/src/main/res/drawable-hdpi/ic_reply_white_36dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_reply_white_36dp.png rename to app/src/main/res/drawable-hdpi/ic_reply_white_36dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_restore_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_restore_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_restore_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_restore_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_rotate_32.png b/app/src/main/res/drawable-hdpi/ic_rotate_32.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_rotate_32.png rename to app/src/main/res/drawable-hdpi/ic_rotate_32.png diff --git a/session/src/main/res/drawable-hdpi/ic_scribble_save.png b/app/src/main/res/drawable-hdpi/ic_scribble_save.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_scribble_save.png rename to app/src/main/res/drawable-hdpi/ic_scribble_save.png diff --git a/session/src/main/res/drawable-hdpi/ic_scroll_down.png b/app/src/main/res/drawable-hdpi/ic_scroll_down.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_scroll_down.png rename to app/src/main/res/drawable-hdpi/ic_scroll_down.png diff --git a/session/src/main/res/drawable-hdpi/ic_security_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_security_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_security_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_security_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_select_all_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_select_all_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_select_all_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_select_all_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_select_off.png b/app/src/main/res/drawable-hdpi/ic_select_off.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_select_off.png rename to app/src/main/res/drawable-hdpi/ic_select_off.png diff --git a/session/src/main/res/drawable-hdpi/ic_select_on.png b/app/src/main/res/drawable-hdpi/ic_select_on.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_select_on.png rename to app/src/main/res/drawable-hdpi/ic_select_on.png diff --git a/session/src/main/res/drawable-hdpi/ic_send_push.png b/app/src/main/res/drawable-hdpi/ic_send_push.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_send_push.png rename to app/src/main/res/drawable-hdpi/ic_send_push.png diff --git a/session/src/main/res/drawable-hdpi/ic_send_push_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_send_push_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_send_push_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_send_push_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_send_sms_insecure.png b/app/src/main/res/drawable-hdpi/ic_send_sms_insecure.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_send_sms_insecure.png rename to app/src/main/res/drawable-hdpi/ic_send_sms_insecure.png diff --git a/session/src/main/res/drawable-hdpi/ic_send_sms_insecure_dark.png b/app/src/main/res/drawable-hdpi/ic_send_sms_insecure_dark.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_send_sms_insecure_dark.png rename to app/src/main/res/drawable-hdpi/ic_send_sms_insecure_dark.png diff --git a/session/src/main/res/drawable-hdpi/ic_send_sms_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_send_sms_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_send_sms_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_send_sms_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_share_black_18dp.png b/app/src/main/res/drawable-hdpi/ic_share_black_18dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_share_black_18dp.png rename to app/src/main/res/drawable-hdpi/ic_share_black_18dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_share_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_share_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_share_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_share_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_signal_background_connection.png b/app/src/main/res/drawable-hdpi/ic_signal_background_connection.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_signal_background_connection.png rename to app/src/main/res/drawable-hdpi/ic_signal_background_connection.png diff --git a/session/src/main/res/drawable-hdpi/ic_signal_backup.png b/app/src/main/res/drawable-hdpi/ic_signal_backup.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_signal_backup.png rename to app/src/main/res/drawable-hdpi/ic_signal_backup.png diff --git a/session/src/main/res/drawable-hdpi/ic_signal_downloading.png b/app/src/main/res/drawable-hdpi/ic_signal_downloading.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_signal_downloading.png rename to app/src/main/res/drawable-hdpi/ic_signal_downloading.png diff --git a/session/src/main/res/drawable-hdpi/ic_switch_camera_32.png b/app/src/main/res/drawable-hdpi/ic_switch_camera_32.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_switch_camera_32.png rename to app/src/main/res/drawable-hdpi/ic_switch_camera_32.png diff --git a/session/src/main/res/drawable-hdpi/ic_tag_faces_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_tag_faces_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_tag_faces_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_tag_faces_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_text_32.png b/app/src/main/res/drawable-hdpi/ic_text_32.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_text_32.png rename to app/src/main/res/drawable-hdpi/ic_text_32.png diff --git a/session/src/main/res/drawable-hdpi/ic_textsms_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_textsms_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_textsms_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_textsms_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_textsms_white_48dp.png b/app/src/main/res/drawable-hdpi/ic_textsms_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_textsms_white_48dp.png rename to app/src/main/res/drawable-hdpi/ic_textsms_white_48dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_timer.png b/app/src/main/res/drawable-hdpi/ic_timer.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_timer.png rename to app/src/main/res/drawable-hdpi/ic_timer.png diff --git a/session/src/main/res/drawable-hdpi/ic_timer_disabled.png b/app/src/main/res/drawable-hdpi/ic_timer_disabled.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_timer_disabled.png rename to app/src/main/res/drawable-hdpi/ic_timer_disabled.png diff --git a/session/src/main/res/drawable-hdpi/ic_timer_off_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_timer_off_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_timer_off_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_timer_off_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_trash_filled_32.png b/app/src/main/res/drawable-hdpi/ic_trash_filled_32.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_trash_filled_32.png rename to app/src/main/res/drawable-hdpi/ic_trash_filled_32.png diff --git a/session/src/main/res/drawable-hdpi/ic_unarchive_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_unarchive_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_unarchive_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_unarchive_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_unarchive_white_36dp.png b/app/src/main/res/drawable-hdpi/ic_unarchive_white_36dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_unarchive_white_36dp.png rename to app/src/main/res/drawable-hdpi/ic_unarchive_white_36dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_undo_32.png b/app/src/main/res/drawable-hdpi/ic_undo_32.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_undo_32.png rename to app/src/main/res/drawable-hdpi/ic_undo_32.png diff --git a/session/src/main/res/drawable-hdpi/ic_unidentified_delivery.png b/app/src/main/res/drawable-hdpi/ic_unidentified_delivery.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_unidentified_delivery.png rename to app/src/main/res/drawable-hdpi/ic_unidentified_delivery.png diff --git a/session/src/main/res/drawable-hdpi/ic_unlocked_white_18dp.png b/app/src/main/res/drawable-hdpi/ic_unlocked_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_unlocked_white_18dp.png rename to app/src/main/res/drawable-hdpi/ic_unlocked_white_18dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_unlocked_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_unlocked_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_unlocked_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_unlocked_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_video_dark.png b/app/src/main/res/drawable-hdpi/ic_video_dark.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_video_dark.png rename to app/src/main/res/drawable-hdpi/ic_video_dark.png diff --git a/session/src/main/res/drawable-hdpi/ic_video_light.png b/app/src/main/res/drawable-hdpi/ic_video_light.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_video_light.png rename to app/src/main/res/drawable-hdpi/ic_video_light.png diff --git a/session/src/main/res/drawable-hdpi/ic_videocam_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_videocam_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_videocam_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_videocam_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_videocam_white_48dp.png b/app/src/main/res/drawable-hdpi/ic_videocam_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_videocam_white_48dp.png rename to app/src/main/res/drawable-hdpi/ic_videocam_white_48dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_view_stream_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_view_stream_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_view_stream_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_view_stream_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_volume_off_grey600_18dp.png b/app/src/main/res/drawable-hdpi/ic_volume_off_grey600_18dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_volume_off_grey600_18dp.png rename to app/src/main/res/drawable-hdpi/ic_volume_off_grey600_18dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_volume_off_white_18dp.png b/app/src/main/res/drawable-hdpi/ic_volume_off_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_volume_off_white_18dp.png rename to app/src/main/res/drawable-hdpi/ic_volume_off_white_18dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_volume_up_dark.png b/app/src/main/res/drawable-hdpi/ic_volume_up_dark.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_volume_up_dark.png rename to app/src/main/res/drawable-hdpi/ic_volume_up_dark.png diff --git a/session/src/main/res/drawable-hdpi/ic_volume_up_light.png b/app/src/main/res/drawable-hdpi/ic_volume_up_light.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_volume_up_light.png rename to app/src/main/res/drawable-hdpi/ic_volume_up_light.png diff --git a/session/src/main/res/drawable-hdpi/ic_volume_up_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_volume_up_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_volume_up_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_volume_up_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_warning_dark.png b/app/src/main/res/drawable-hdpi/ic_warning_dark.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_warning_dark.png rename to app/src/main/res/drawable-hdpi/ic_warning_dark.png diff --git a/session/src/main/res/drawable-hdpi/ic_warning_light.png b/app/src/main/res/drawable-hdpi/ic_warning_light.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_warning_light.png rename to app/src/main/res/drawable-hdpi/ic_warning_light.png diff --git a/session/src/main/res/drawable-hdpi/ic_wb_sunny_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_wb_sunny_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_wb_sunny_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_wb_sunny_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_work_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_work_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_work_white_24dp.png rename to app/src/main/res/drawable-hdpi/ic_work_white_24dp.png diff --git a/session/src/main/res/drawable-hdpi/ic_x_28.png b/app/src/main/res/drawable-hdpi/ic_x_28.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_x_28.png rename to app/src/main/res/drawable-hdpi/ic_x_28.png diff --git a/session/src/main/res/drawable-hdpi/ic_x_circle.png b/app/src/main/res/drawable-hdpi/ic_x_circle.png similarity index 100% rename from session/src/main/res/drawable-hdpi/ic_x_circle.png rename to app/src/main/res/drawable-hdpi/ic_x_circle.png diff --git a/session/src/main/res/drawable-hdpi/icon_cached.png b/app/src/main/res/drawable-hdpi/icon_cached.png similarity index 100% rename from session/src/main/res/drawable-hdpi/icon_cached.png rename to app/src/main/res/drawable-hdpi/icon_cached.png diff --git a/session/src/main/res/drawable-hdpi/icon_dialog.png b/app/src/main/res/drawable-hdpi/icon_dialog.png similarity index 100% rename from session/src/main/res/drawable-hdpi/icon_dialog.png rename to app/src/main/res/drawable-hdpi/icon_dialog.png diff --git a/session/src/main/res/drawable-hdpi/icon_lock.png b/app/src/main/res/drawable-hdpi/icon_lock.png similarity index 100% rename from session/src/main/res/drawable-hdpi/icon_lock.png rename to app/src/main/res/drawable-hdpi/icon_lock.png diff --git a/session/src/main/res/drawable-hdpi/icon_transparent.png b/app/src/main/res/drawable-hdpi/icon_transparent.png similarity index 100% rename from session/src/main/res/drawable-hdpi/icon_transparent.png rename to app/src/main/res/drawable-hdpi/icon_transparent.png diff --git a/session/src/main/res/drawable-hdpi/import_database.png b/app/src/main/res/drawable-hdpi/import_database.png similarity index 100% rename from session/src/main/res/drawable-hdpi/import_database.png rename to app/src/main/res/drawable-hdpi/import_database.png diff --git a/session/src/main/res/drawable-hdpi/inbox_zero.png b/app/src/main/res/drawable-hdpi/inbox_zero.png similarity index 100% rename from session/src/main/res/drawable-hdpi/inbox_zero.png rename to app/src/main/res/drawable-hdpi/inbox_zero.png diff --git a/session/src/main/res/drawable-hdpi/link_preview_splash.png b/app/src/main/res/drawable-hdpi/link_preview_splash.png similarity index 100% rename from session/src/main/res/drawable-hdpi/link_preview_splash.png rename to app/src/main/res/drawable-hdpi/link_preview_splash.png diff --git a/session/src/main/res/drawable-hdpi/lockscreen_watermark_dark.png b/app/src/main/res/drawable-hdpi/lockscreen_watermark_dark.png similarity index 100% rename from session/src/main/res/drawable-hdpi/lockscreen_watermark_dark.png rename to app/src/main/res/drawable-hdpi/lockscreen_watermark_dark.png diff --git a/session/src/main/res/drawable-hdpi/lockscreen_watermark_light.png b/app/src/main/res/drawable-hdpi/lockscreen_watermark_light.png similarity index 100% rename from session/src/main/res/drawable-hdpi/lockscreen_watermark_light.png rename to app/src/main/res/drawable-hdpi/lockscreen_watermark_light.png diff --git a/session/src/main/res/drawable-hdpi/love_heart.png b/app/src/main/res/drawable-hdpi/love_heart.png similarity index 100% rename from session/src/main/res/drawable-hdpi/love_heart.png rename to app/src/main/res/drawable-hdpi/love_heart.png diff --git a/session/src/main/res/drawable-hdpi/message_24dp.png b/app/src/main/res/drawable-hdpi/message_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/message_24dp.png rename to app/src/main/res/drawable-hdpi/message_24dp.png diff --git a/session/src/main/res/drawable-hdpi/no_contacts.png b/app/src/main/res/drawable-hdpi/no_contacts.png similarity index 100% rename from session/src/main/res/drawable-hdpi/no_contacts.png rename to app/src/main/res/drawable-hdpi/no_contacts.png diff --git a/session/src/main/res/drawable-hdpi/notify_panel_notification_icon_bg.png b/app/src/main/res/drawable-hdpi/notify_panel_notification_icon_bg.png similarity index 100% rename from session/src/main/res/drawable-hdpi/notify_panel_notification_icon_bg.png rename to app/src/main/res/drawable-hdpi/notify_panel_notification_icon_bg.png diff --git a/session/src/main/res/drawable-hdpi/phone_24dp.png b/app/src/main/res/drawable-hdpi/phone_24dp.png similarity index 100% rename from session/src/main/res/drawable-hdpi/phone_24dp.png rename to app/src/main/res/drawable-hdpi/phone_24dp.png diff --git a/session/src/main/res/drawable-hdpi/poweredby_giphy.png b/app/src/main/res/drawable-hdpi/poweredby_giphy.png similarity index 100% rename from session/src/main/res/drawable-hdpi/poweredby_giphy.png rename to app/src/main/res/drawable-hdpi/poweredby_giphy.png diff --git a/session/src/main/res/drawable-hdpi/profile_splash.png b/app/src/main/res/drawable-hdpi/profile_splash.png similarity index 100% rename from session/src/main/res/drawable-hdpi/profile_splash.png rename to app/src/main/res/drawable-hdpi/profile_splash.png diff --git a/session/src/main/res/drawable-hdpi/quick_camera_dark.png b/app/src/main/res/drawable-hdpi/quick_camera_dark.png similarity index 100% rename from session/src/main/res/drawable-hdpi/quick_camera_dark.png rename to app/src/main/res/drawable-hdpi/quick_camera_dark.png diff --git a/session/src/main/res/drawable-hdpi/quick_camera_exit_fullscreen.png b/app/src/main/res/drawable-hdpi/quick_camera_exit_fullscreen.png similarity index 100% rename from session/src/main/res/drawable-hdpi/quick_camera_exit_fullscreen.png rename to app/src/main/res/drawable-hdpi/quick_camera_exit_fullscreen.png diff --git a/session/src/main/res/drawable-hdpi/quick_camera_front.png b/app/src/main/res/drawable-hdpi/quick_camera_front.png similarity index 100% rename from session/src/main/res/drawable-hdpi/quick_camera_front.png rename to app/src/main/res/drawable-hdpi/quick_camera_front.png diff --git a/session/src/main/res/drawable-hdpi/quick_camera_fullscreen.png b/app/src/main/res/drawable-hdpi/quick_camera_fullscreen.png similarity index 100% rename from session/src/main/res/drawable-hdpi/quick_camera_fullscreen.png rename to app/src/main/res/drawable-hdpi/quick_camera_fullscreen.png diff --git a/session/src/main/res/drawable-hdpi/quick_camera_hide.png b/app/src/main/res/drawable-hdpi/quick_camera_hide.png similarity index 100% rename from session/src/main/res/drawable-hdpi/quick_camera_hide.png rename to app/src/main/res/drawable-hdpi/quick_camera_hide.png diff --git a/session/src/main/res/drawable-hdpi/quick_camera_light.png b/app/src/main/res/drawable-hdpi/quick_camera_light.png similarity index 100% rename from session/src/main/res/drawable-hdpi/quick_camera_light.png rename to app/src/main/res/drawable-hdpi/quick_camera_light.png diff --git a/session/src/main/res/drawable-hdpi/quick_camera_rear.png b/app/src/main/res/drawable-hdpi/quick_camera_rear.png similarity index 100% rename from session/src/main/res/drawable-hdpi/quick_camera_rear.png rename to app/src/main/res/drawable-hdpi/quick_camera_rear.png diff --git a/session/src/main/res/drawable-hdpi/quick_shutter_button.png b/app/src/main/res/drawable-hdpi/quick_shutter_button.png similarity index 100% rename from session/src/main/res/drawable-hdpi/quick_shutter_button.png rename to app/src/main/res/drawable-hdpi/quick_shutter_button.png diff --git a/session/src/main/res/drawable-hdpi/timer00.png b/app/src/main/res/drawable-hdpi/timer00.png similarity index 100% rename from session/src/main/res/drawable-hdpi/timer00.png rename to app/src/main/res/drawable-hdpi/timer00.png diff --git a/session/src/main/res/drawable-hdpi/timer05.png b/app/src/main/res/drawable-hdpi/timer05.png similarity index 100% rename from session/src/main/res/drawable-hdpi/timer05.png rename to app/src/main/res/drawable-hdpi/timer05.png diff --git a/session/src/main/res/drawable-hdpi/timer10.png b/app/src/main/res/drawable-hdpi/timer10.png similarity index 100% rename from session/src/main/res/drawable-hdpi/timer10.png rename to app/src/main/res/drawable-hdpi/timer10.png diff --git a/session/src/main/res/drawable-hdpi/timer15.png b/app/src/main/res/drawable-hdpi/timer15.png similarity index 100% rename from session/src/main/res/drawable-hdpi/timer15.png rename to app/src/main/res/drawable-hdpi/timer15.png diff --git a/session/src/main/res/drawable-hdpi/timer20.png b/app/src/main/res/drawable-hdpi/timer20.png similarity index 100% rename from session/src/main/res/drawable-hdpi/timer20.png rename to app/src/main/res/drawable-hdpi/timer20.png diff --git a/session/src/main/res/drawable-hdpi/timer25.png b/app/src/main/res/drawable-hdpi/timer25.png similarity index 100% rename from session/src/main/res/drawable-hdpi/timer25.png rename to app/src/main/res/drawable-hdpi/timer25.png diff --git a/session/src/main/res/drawable-hdpi/timer30.png b/app/src/main/res/drawable-hdpi/timer30.png similarity index 100% rename from session/src/main/res/drawable-hdpi/timer30.png rename to app/src/main/res/drawable-hdpi/timer30.png diff --git a/session/src/main/res/drawable-hdpi/timer35.png b/app/src/main/res/drawable-hdpi/timer35.png similarity index 100% rename from session/src/main/res/drawable-hdpi/timer35.png rename to app/src/main/res/drawable-hdpi/timer35.png diff --git a/session/src/main/res/drawable-hdpi/timer40.png b/app/src/main/res/drawable-hdpi/timer40.png similarity index 100% rename from session/src/main/res/drawable-hdpi/timer40.png rename to app/src/main/res/drawable-hdpi/timer40.png diff --git a/session/src/main/res/drawable-hdpi/timer45.png b/app/src/main/res/drawable-hdpi/timer45.png similarity index 100% rename from session/src/main/res/drawable-hdpi/timer45.png rename to app/src/main/res/drawable-hdpi/timer45.png diff --git a/session/src/main/res/drawable-hdpi/timer50.png b/app/src/main/res/drawable-hdpi/timer50.png similarity index 100% rename from session/src/main/res/drawable-hdpi/timer50.png rename to app/src/main/res/drawable-hdpi/timer50.png diff --git a/session/src/main/res/drawable-hdpi/timer55.png b/app/src/main/res/drawable-hdpi/timer55.png similarity index 100% rename from session/src/main/res/drawable-hdpi/timer55.png rename to app/src/main/res/drawable-hdpi/timer55.png diff --git a/session/src/main/res/drawable-hdpi/timer60.png b/app/src/main/res/drawable-hdpi/timer60.png similarity index 100% rename from session/src/main/res/drawable-hdpi/timer60.png rename to app/src/main/res/drawable-hdpi/timer60.png diff --git a/session/src/main/res/drawable-hdpi/video_splash.png b/app/src/main/res/drawable-hdpi/video_splash.png similarity index 100% rename from session/src/main/res/drawable-hdpi/video_splash.png rename to app/src/main/res/drawable-hdpi/video_splash.png diff --git a/session/src/main/res/drawable-hdpi/welcome.png b/app/src/main/res/drawable-hdpi/welcome.png similarity index 100% rename from session/src/main/res/drawable-hdpi/welcome.png rename to app/src/main/res/drawable-hdpi/welcome.png diff --git a/session/src/main/res/drawable-ldrtl-hdpi/ic_arrow_back_white_24dp.png b/app/src/main/res/drawable-ldrtl-hdpi/ic_arrow_back_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-ldrtl-hdpi/ic_arrow_back_white_24dp.png rename to app/src/main/res/drawable-ldrtl-hdpi/ic_arrow_back_white_24dp.png diff --git a/session/src/main/res/drawable-ldrtl-hdpi/ic_keyboard_arrow_left_grey600_24dp.png b/app/src/main/res/drawable-ldrtl-hdpi/ic_keyboard_arrow_left_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-ldrtl-hdpi/ic_keyboard_arrow_left_grey600_24dp.png rename to app/src/main/res/drawable-ldrtl-hdpi/ic_keyboard_arrow_left_grey600_24dp.png diff --git a/session/src/main/res/drawable-ldrtl-mdpi/ic_arrow_back_white_24dp.png b/app/src/main/res/drawable-ldrtl-mdpi/ic_arrow_back_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-ldrtl-mdpi/ic_arrow_back_white_24dp.png rename to app/src/main/res/drawable-ldrtl-mdpi/ic_arrow_back_white_24dp.png diff --git a/session/src/main/res/drawable-ldrtl-xhdpi/ic_arrow_back_white_24dp.png b/app/src/main/res/drawable-ldrtl-xhdpi/ic_arrow_back_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-ldrtl-xhdpi/ic_arrow_back_white_24dp.png rename to app/src/main/res/drawable-ldrtl-xhdpi/ic_arrow_back_white_24dp.png diff --git a/session/src/main/res/drawable-ldrtl-xhdpi/ic_keyboard_arrow_left_grey600_24dp.png b/app/src/main/res/drawable-ldrtl-xhdpi/ic_keyboard_arrow_left_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-ldrtl-xhdpi/ic_keyboard_arrow_left_grey600_24dp.png rename to app/src/main/res/drawable-ldrtl-xhdpi/ic_keyboard_arrow_left_grey600_24dp.png diff --git a/session/src/main/res/drawable-ldrtl-xxhdpi/ic_arrow_back_white_24dp.png b/app/src/main/res/drawable-ldrtl-xxhdpi/ic_arrow_back_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-ldrtl-xxhdpi/ic_arrow_back_white_24dp.png rename to app/src/main/res/drawable-ldrtl-xxhdpi/ic_arrow_back_white_24dp.png diff --git a/session/src/main/res/drawable-ldrtl-xxhdpi/ic_keyboard_arrow_left_grey600_24dp.png b/app/src/main/res/drawable-ldrtl-xxhdpi/ic_keyboard_arrow_left_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-ldrtl-xxhdpi/ic_keyboard_arrow_left_grey600_24dp.png rename to app/src/main/res/drawable-ldrtl-xxhdpi/ic_keyboard_arrow_left_grey600_24dp.png diff --git a/session/src/main/res/drawable-ldrtl-xxxhdpi/ic_arrow_back_white_24dp.png b/app/src/main/res/drawable-ldrtl-xxxhdpi/ic_arrow_back_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-ldrtl-xxxhdpi/ic_arrow_back_white_24dp.png rename to app/src/main/res/drawable-ldrtl-xxxhdpi/ic_arrow_back_white_24dp.png diff --git a/session/src/main/res/drawable-ldrtl-xxxhdpi/ic_keyboard_arrow_left_grey600_24dp.png b/app/src/main/res/drawable-ldrtl-xxxhdpi/ic_keyboard_arrow_left_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-ldrtl-xxxhdpi/ic_keyboard_arrow_left_grey600_24dp.png rename to app/src/main/res/drawable-ldrtl-xxxhdpi/ic_keyboard_arrow_left_grey600_24dp.png diff --git a/session/src/main/res/drawable-mdpi/baseline_account_circle_white_24.png b/app/src/main/res/drawable-mdpi/baseline_account_circle_white_24.png similarity index 100% rename from session/src/main/res/drawable-mdpi/baseline_account_circle_white_24.png rename to app/src/main/res/drawable-mdpi/baseline_account_circle_white_24.png diff --git a/session/src/main/res/drawable-mdpi/baseline_email_white_24.png b/app/src/main/res/drawable-mdpi/baseline_email_white_24.png similarity index 100% rename from session/src/main/res/drawable-mdpi/baseline_email_white_24.png rename to app/src/main/res/drawable-mdpi/baseline_email_white_24.png diff --git a/session/src/main/res/drawable-mdpi/check.png b/app/src/main/res/drawable-mdpi/check.png similarity index 100% rename from session/src/main/res/drawable-mdpi/check.png rename to app/src/main/res/drawable-mdpi/check.png diff --git a/session/src/main/res/drawable-mdpi/clear_profile_avatar.png b/app/src/main/res/drawable-mdpi/clear_profile_avatar.png similarity index 100% rename from session/src/main/res/drawable-mdpi/clear_profile_avatar.png rename to app/src/main/res/drawable-mdpi/clear_profile_avatar.png diff --git a/session/src/main/res/drawable-mdpi/conversation_list_empty_state.png b/app/src/main/res/drawable-mdpi/conversation_list_empty_state.png similarity index 100% rename from session/src/main/res/drawable-mdpi/conversation_list_empty_state.png rename to app/src/main/res/drawable-mdpi/conversation_list_empty_state.png diff --git a/session/src/main/res/drawable-mdpi/divet_lower_right_dark.png b/app/src/main/res/drawable-mdpi/divet_lower_right_dark.png similarity index 100% rename from session/src/main/res/drawable-mdpi/divet_lower_right_dark.png rename to app/src/main/res/drawable-mdpi/divet_lower_right_dark.png diff --git a/session/src/main/res/drawable-mdpi/divet_lower_right_light.png b/app/src/main/res/drawable-mdpi/divet_lower_right_light.png similarity index 100% rename from session/src/main/res/drawable-mdpi/divet_lower_right_light.png rename to app/src/main/res/drawable-mdpi/divet_lower_right_light.png diff --git a/session/src/main/res/drawable-mdpi/empty_inbox_1.png b/app/src/main/res/drawable-mdpi/empty_inbox_1.png similarity index 100% rename from session/src/main/res/drawable-mdpi/empty_inbox_1.png rename to app/src/main/res/drawable-mdpi/empty_inbox_1.png diff --git a/session/src/main/res/drawable-mdpi/empty_inbox_2.png b/app/src/main/res/drawable-mdpi/empty_inbox_2.png similarity index 100% rename from session/src/main/res/drawable-mdpi/empty_inbox_2.png rename to app/src/main/res/drawable-mdpi/empty_inbox_2.png diff --git a/session/src/main/res/drawable-mdpi/empty_inbox_3.png b/app/src/main/res/drawable-mdpi/empty_inbox_3.png similarity index 100% rename from session/src/main/res/drawable-mdpi/empty_inbox_3.png rename to app/src/main/res/drawable-mdpi/empty_inbox_3.png diff --git a/session/src/main/res/drawable-mdpi/empty_inbox_4.png b/app/src/main/res/drawable-mdpi/empty_inbox_4.png similarity index 100% rename from session/src/main/res/drawable-mdpi/empty_inbox_4.png rename to app/src/main/res/drawable-mdpi/empty_inbox_4.png diff --git a/session/src/main/res/drawable-mdpi/empty_inbox_5.png b/app/src/main/res/drawable-mdpi/empty_inbox_5.png similarity index 100% rename from session/src/main/res/drawable-mdpi/empty_inbox_5.png rename to app/src/main/res/drawable-mdpi/empty_inbox_5.png diff --git a/session/src/main/res/drawable-mdpi/ic_account_box_dark.png b/app/src/main/res/drawable-mdpi/ic_account_box_dark.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_account_box_dark.png rename to app/src/main/res/drawable-mdpi/ic_account_box_dark.png diff --git a/session/src/main/res/drawable-mdpi/ic_account_box_light.png b/app/src/main/res/drawable-mdpi/ic_account_box_light.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_account_box_light.png rename to app/src/main/res/drawable-mdpi/ic_account_box_light.png diff --git a/session/src/main/res/drawable-mdpi/ic_action_name.png b/app/src/main/res/drawable-mdpi/ic_action_name.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_action_name.png rename to app/src/main/res/drawable-mdpi/ic_action_name.png diff --git a/session/src/main/res/drawable-mdpi/ic_action_warning_red.png b/app/src/main/res/drawable-mdpi/ic_action_warning_red.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_action_warning_red.png rename to app/src/main/res/drawable-mdpi/ic_action_warning_red.png diff --git a/session/src/main/res/drawable-mdpi/ic_add_caption_36.png b/app/src/main/res/drawable-mdpi/ic_add_caption_36.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_add_caption_36.png rename to app/src/main/res/drawable-mdpi/ic_add_caption_36.png diff --git a/session/src/main/res/drawable-mdpi/ic_add_photo.png b/app/src/main/res/drawable-mdpi/ic_add_photo.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_add_photo.png rename to app/src/main/res/drawable-mdpi/ic_add_photo.png diff --git a/session/src/main/res/drawable-mdpi/ic_add_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_add_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_add_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_add_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_add_white_original_24dp.png b/app/src/main/res/drawable-mdpi/ic_add_white_original_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_add_white_original_24dp.png rename to app/src/main/res/drawable-mdpi/ic_add_white_original_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_advanced_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_advanced_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_advanced_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_advanced_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_archive_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_archive_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_archive_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_archive_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_arrow_back_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_arrow_back_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_arrow_back_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_arrow_back_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_arrow_right.png b/app/src/main/res/drawable-mdpi/ic_arrow_right.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_arrow_right.png rename to app/src/main/res/drawable-mdpi/ic_arrow_right.png diff --git a/session/src/main/res/drawable-mdpi/ic_arrow_up.png b/app/src/main/res/drawable-mdpi/ic_arrow_up.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_arrow_up.png rename to app/src/main/res/drawable-mdpi/ic_arrow_up.png diff --git a/session/src/main/res/drawable-mdpi/ic_attach_grey600_24dp.png b/app/src/main/res/drawable-mdpi/ic_attach_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_attach_grey600_24dp.png rename to app/src/main/res/drawable-mdpi/ic_attach_grey600_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_attach_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_attach_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_attach_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_attach_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_audio_dark.png b/app/src/main/res/drawable-mdpi/ic_audio_dark.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_audio_dark.png rename to app/src/main/res/drawable-mdpi/ic_audio_dark.png diff --git a/session/src/main/res/drawable-mdpi/ic_audio_light.png b/app/src/main/res/drawable-mdpi/ic_audio_light.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_audio_light.png rename to app/src/main/res/drawable-mdpi/ic_audio_light.png diff --git a/session/src/main/res/drawable-mdpi/ic_backspace_grey600_24dp.png b/app/src/main/res/drawable-mdpi/ic_backspace_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_backspace_grey600_24dp.png rename to app/src/main/res/drawable-mdpi/ic_backspace_grey600_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_block_grey600_18dp.png b/app/src/main/res/drawable-mdpi/ic_block_grey600_18dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_block_grey600_18dp.png rename to app/src/main/res/drawable-mdpi/ic_block_grey600_18dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_block_white_18dp.png b/app/src/main/res/drawable-mdpi/ic_block_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_block_white_18dp.png rename to app/src/main/res/drawable-mdpi/ic_block_white_18dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_block_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_block_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_block_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_block_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_bluetooth_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_bluetooth_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_bluetooth_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_bluetooth_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_brightness_6_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_brightness_6_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_brightness_6_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_brightness_6_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_broken_link.png b/app/src/main/res/drawable-mdpi/ic_broken_link.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_broken_link.png rename to app/src/main/res/drawable-mdpi/ic_broken_link.png diff --git a/session/src/main/res/drawable-mdpi/ic_brush_highlight_32.png b/app/src/main/res/drawable-mdpi/ic_brush_highlight_32.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_brush_highlight_32.png rename to app/src/main/res/drawable-mdpi/ic_brush_highlight_32.png diff --git a/session/src/main/res/drawable-mdpi/ic_brush_marker_32.png b/app/src/main/res/drawable-mdpi/ic_brush_marker_32.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_brush_marker_32.png rename to app/src/main/res/drawable-mdpi/ic_brush_marker_32.png diff --git a/session/src/main/res/drawable-mdpi/ic_call_end_grey600_32dp.png b/app/src/main/res/drawable-mdpi/ic_call_end_grey600_32dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_call_end_grey600_32dp.png rename to app/src/main/res/drawable-mdpi/ic_call_end_grey600_32dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_call_end_white_48dp.png b/app/src/main/res/drawable-mdpi/ic_call_end_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_call_end_white_48dp.png rename to app/src/main/res/drawable-mdpi/ic_call_end_white_48dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_call_made_grey600_24dp.png b/app/src/main/res/drawable-mdpi/ic_call_made_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_call_made_grey600_24dp.png rename to app/src/main/res/drawable-mdpi/ic_call_made_grey600_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_call_missed_grey600_24dp.png b/app/src/main/res/drawable-mdpi/ic_call_missed_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_call_missed_grey600_24dp.png rename to app/src/main/res/drawable-mdpi/ic_call_missed_grey600_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_call_received_grey600_24dp.png b/app/src/main/res/drawable-mdpi/ic_call_received_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_call_received_grey600_24dp.png rename to app/src/main/res/drawable-mdpi/ic_call_received_grey600_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_call_secure_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_call_secure_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_call_secure_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_call_secure_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_call_split_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_call_split_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_call_split_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_call_split_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_camera_alt_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_camera_alt_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_camera_alt_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_camera_alt_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_camera_filled_24.png b/app/src/main/res/drawable-mdpi/ic_camera_filled_24.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_camera_filled_24.png rename to app/src/main/res/drawable-mdpi/ic_camera_filled_24.png diff --git a/session/src/main/res/drawable-mdpi/ic_camera_shutter.png b/app/src/main/res/drawable-mdpi/ic_camera_shutter.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_camera_shutter.png rename to app/src/main/res/drawable-mdpi/ic_camera_shutter.png diff --git a/session/src/main/res/drawable-mdpi/ic_camera_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_camera_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_camera_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_camera_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_caption_28.png b/app/src/main/res/drawable-mdpi/ic_caption_28.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_caption_28.png rename to app/src/main/res/drawable-mdpi/ic_caption_28.png diff --git a/session/src/main/res/drawable-mdpi/ic_check_circle_32.png b/app/src/main/res/drawable-mdpi/ic_check_circle_32.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_check_circle_32.png rename to app/src/main/res/drawable-mdpi/ic_check_circle_32.png diff --git a/session/src/main/res/drawable-mdpi/ic_check_circle_white_18dp.png b/app/src/main/res/drawable-mdpi/ic_check_circle_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_check_circle_white_18dp.png rename to app/src/main/res/drawable-mdpi/ic_check_circle_white_18dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_check_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_check_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_check_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_check_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_check_white_48dp.png b/app/src/main/res/drawable-mdpi/ic_check_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_check_white_48dp.png rename to app/src/main/res/drawable-mdpi/ic_check_white_48dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_circle_fill_white_48dp.png b/app/src/main/res/drawable-mdpi/ic_circle_fill_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_circle_fill_white_48dp.png rename to app/src/main/res/drawable-mdpi/ic_circle_fill_white_48dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_clear_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_clear_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_clear_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_clear_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_close_grey600_32dp.png b/app/src/main/res/drawable-mdpi/ic_close_grey600_32dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_close_grey600_32dp.png rename to app/src/main/res/drawable-mdpi/ic_close_grey600_32dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_close_white_18dp.png b/app/src/main/res/drawable-mdpi/ic_close_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_close_white_18dp.png rename to app/src/main/res/drawable-mdpi/ic_close_white_18dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_close_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_close_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_close_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_close_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_close_white_48dp.png b/app/src/main/res/drawable-mdpi/ic_close_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_close_white_48dp.png rename to app/src/main/res/drawable-mdpi/ic_close_white_48dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_contact_picture.png b/app/src/main/res/drawable-mdpi/ic_contact_picture.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_contact_picture.png rename to app/src/main/res/drawable-mdpi/ic_contact_picture.png diff --git a/session/src/main/res/drawable-mdpi/ic_contact_picture_large.png b/app/src/main/res/drawable-mdpi/ic_contact_picture_large.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_contact_picture_large.png rename to app/src/main/res/drawable-mdpi/ic_contact_picture_large.png diff --git a/session/src/main/res/drawable-mdpi/ic_contacts_white_48dp.png b/app/src/main/res/drawable-mdpi/ic_contacts_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_contacts_white_48dp.png rename to app/src/main/res/drawable-mdpi/ic_contacts_white_48dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_content_copy_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_content_copy_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_content_copy_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_content_copy_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_create_album_filled_32.png b/app/src/main/res/drawable-mdpi/ic_create_album_filled_32.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_create_album_filled_32.png rename to app/src/main/res/drawable-mdpi/ic_create_album_filled_32.png diff --git a/session/src/main/res/drawable-mdpi/ic_create_album_outline_32.png b/app/src/main/res/drawable-mdpi/ic_create_album_outline_32.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_create_album_outline_32.png rename to app/src/main/res/drawable-mdpi/ic_create_album_outline_32.png diff --git a/session/src/main/res/drawable-mdpi/ic_create_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_create_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_create_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_create_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_crop_32.png b/app/src/main/res/drawable-mdpi/ic_crop_32.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_crop_32.png rename to app/src/main/res/drawable-mdpi/ic_crop_32.png diff --git a/session/src/main/res/drawable-mdpi/ic_crop_lock_32.png b/app/src/main/res/drawable-mdpi/ic_crop_lock_32.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_crop_lock_32.png rename to app/src/main/res/drawable-mdpi/ic_crop_lock_32.png diff --git a/session/src/main/res/drawable-mdpi/ic_crop_unlock_32.png b/app/src/main/res/drawable-mdpi/ic_crop_unlock_32.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_crop_unlock_32.png rename to app/src/main/res/drawable-mdpi/ic_crop_unlock_32.png diff --git a/session/src/main/res/drawable-mdpi/ic_dashboard_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_dashboard_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_dashboard_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_dashboard_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_delete_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_delete_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_delete_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_delete_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_delivery_status_delivered.png b/app/src/main/res/drawable-mdpi/ic_delivery_status_delivered.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_delivery_status_delivered.png rename to app/src/main/res/drawable-mdpi/ic_delivery_status_delivered.png diff --git a/session/src/main/res/drawable-mdpi/ic_delivery_status_read.png b/app/src/main/res/drawable-mdpi/ic_delivery_status_read.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_delivery_status_read.png rename to app/src/main/res/drawable-mdpi/ic_delivery_status_read.png diff --git a/session/src/main/res/drawable-mdpi/ic_delivery_status_sending.png b/app/src/main/res/drawable-mdpi/ic_delivery_status_sending.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_delivery_status_sending.png rename to app/src/main/res/drawable-mdpi/ic_delivery_status_sending.png diff --git a/session/src/main/res/drawable-mdpi/ic_delivery_status_sent.png b/app/src/main/res/drawable-mdpi/ic_delivery_status_sent.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_delivery_status_sent.png rename to app/src/main/res/drawable-mdpi/ic_delivery_status_sent.png diff --git a/session/src/main/res/drawable-mdpi/ic_devices_white.png b/app/src/main/res/drawable-mdpi/ic_devices_white.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_devices_white.png rename to app/src/main/res/drawable-mdpi/ic_devices_white.png diff --git a/session/src/main/res/drawable-mdpi/ic_dialpad_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_dialpad_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_dialpad_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_dialpad_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_document_large_dark.png b/app/src/main/res/drawable-mdpi/ic_document_large_dark.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_document_large_dark.png rename to app/src/main/res/drawable-mdpi/ic_document_large_dark.png diff --git a/session/src/main/res/drawable-mdpi/ic_document_large_light.png b/app/src/main/res/drawable-mdpi/ic_document_large_light.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_document_large_light.png rename to app/src/main/res/drawable-mdpi/ic_document_large_light.png diff --git a/session/src/main/res/drawable-mdpi/ic_document_small_dark.png b/app/src/main/res/drawable-mdpi/ic_document_small_dark.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_document_small_dark.png rename to app/src/main/res/drawable-mdpi/ic_document_small_dark.png diff --git a/session/src/main/res/drawable-mdpi/ic_document_small_light.png b/app/src/main/res/drawable-mdpi/ic_document_small_light.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_document_small_light.png rename to app/src/main/res/drawable-mdpi/ic_document_small_light.png diff --git a/session/src/main/res/drawable-mdpi/ic_download_circle_fill_white_48dp.png b/app/src/main/res/drawable-mdpi/ic_download_circle_fill_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_download_circle_fill_white_48dp.png rename to app/src/main/res/drawable-mdpi/ic_download_circle_fill_white_48dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_emoji_32.png b/app/src/main/res/drawable-mdpi/ic_emoji_32.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_emoji_32.png rename to app/src/main/res/drawable-mdpi/ic_emoji_32.png diff --git a/session/src/main/res/drawable-mdpi/ic_error.png b/app/src/main/res/drawable-mdpi/ic_error.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_error.png rename to app/src/main/res/drawable-mdpi/ic_error.png diff --git a/session/src/main/res/drawable-mdpi/ic_face_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_face_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_face_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_face_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_favorite_grey600_24dp.png b/app/src/main/res/drawable-mdpi/ic_favorite_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_favorite_grey600_24dp.png rename to app/src/main/res/drawable-mdpi/ic_favorite_grey600_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_file_download_white_36dp.png b/app/src/main/res/drawable-mdpi/ic_file_download_white_36dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_file_download_white_36dp.png rename to app/src/main/res/drawable-mdpi/ic_file_download_white_36dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_fingerprint_white_48dp.png b/app/src/main/res/drawable-mdpi/ic_fingerprint_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_fingerprint_white_48dp.png rename to app/src/main/res/drawable-mdpi/ic_fingerprint_white_48dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_flip_32.png b/app/src/main/res/drawable-mdpi/ic_flip_32.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_flip_32.png rename to app/src/main/res/drawable-mdpi/ic_flip_32.png diff --git a/session/src/main/res/drawable-mdpi/ic_forum_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_forum_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_forum_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_forum_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_gif_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_gif_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_gif_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_gif_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_group_grey600_24dp.png b/app/src/main/res/drawable-mdpi/ic_group_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_group_grey600_24dp.png rename to app/src/main/res/drawable-mdpi/ic_group_grey600_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_group_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_group_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_group_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_group_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_headset_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_headset_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_headset_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_headset_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_image_dark.png b/app/src/main/res/drawable-mdpi/ic_image_dark.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_image_dark.png rename to app/src/main/res/drawable-mdpi/ic_image_dark.png diff --git a/session/src/main/res/drawable-mdpi/ic_image_light.png b/app/src/main/res/drawable-mdpi/ic_image_light.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_image_light.png rename to app/src/main/res/drawable-mdpi/ic_image_light.png diff --git a/session/src/main/res/drawable-mdpi/ic_image_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_image_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_image_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_image_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_info_outline_dark.png b/app/src/main/res/drawable-mdpi/ic_info_outline_dark.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_info_outline_dark.png rename to app/src/main/res/drawable-mdpi/ic_info_outline_dark.png diff --git a/session/src/main/res/drawable-mdpi/ic_info_outline_light.png b/app/src/main/res/drawable-mdpi/ic_info_outline_light.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_info_outline_light.png rename to app/src/main/res/drawable-mdpi/ic_info_outline_light.png diff --git a/session/src/main/res/drawable-mdpi/ic_info_outline_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_info_outline_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_info_outline_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_info_outline_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_info_white_18dp.png b/app/src/main/res/drawable-mdpi/ic_info_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_info_white_18dp.png rename to app/src/main/res/drawable-mdpi/ic_info_white_18dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_insert_drive_file_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_insert_drive_file_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_insert_drive_file_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_insert_drive_file_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_keyboard_arrow_left_grey600_24dp.png b/app/src/main/res/drawable-mdpi/ic_keyboard_arrow_left_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_keyboard_arrow_left_grey600_24dp.png rename to app/src/main/res/drawable-mdpi/ic_keyboard_arrow_left_grey600_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_keyboard_grey600_24dp.png b/app/src/main/res/drawable-mdpi/ic_keyboard_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_keyboard_grey600_24dp.png rename to app/src/main/res/drawable-mdpi/ic_keyboard_grey600_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_keyboard_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_keyboard_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_keyboard_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_keyboard_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_laptop_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_laptop_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_laptop_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_laptop_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_launch_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_launch_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_launch_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_launch_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_local_dining_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_local_dining_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_local_dining_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_local_dining_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_location_on_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_location_on_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_location_on_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_location_on_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_lock_white_18dp.png b/app/src/main/res/drawable-mdpi/ic_lock_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_lock_white_18dp.png rename to app/src/main/res/drawable-mdpi/ic_lock_white_18dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_lock_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_lock_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_lock_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_lock_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_lock_white_48dp.png b/app/src/main/res/drawable-mdpi/ic_lock_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_lock_white_48dp.png rename to app/src/main/res/drawable-mdpi/ic_lock_white_48dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_menu_add_field_holo_light.png b/app/src/main/res/drawable-mdpi/ic_menu_add_field_holo_light.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_menu_add_field_holo_light.png rename to app/src/main/res/drawable-mdpi/ic_menu_add_field_holo_light.png diff --git a/session/src/main/res/drawable-mdpi/ic_menu_lock_dark.png b/app/src/main/res/drawable-mdpi/ic_menu_lock_dark.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_menu_lock_dark.png rename to app/src/main/res/drawable-mdpi/ic_menu_lock_dark.png diff --git a/session/src/main/res/drawable-mdpi/ic_menu_login.png b/app/src/main/res/drawable-mdpi/ic_menu_login.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_menu_login.png rename to app/src/main/res/drawable-mdpi/ic_menu_login.png diff --git a/session/src/main/res/drawable-mdpi/ic_menu_remove_holo_light.png b/app/src/main/res/drawable-mdpi/ic_menu_remove_holo_light.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_menu_remove_holo_light.png rename to app/src/main/res/drawable-mdpi/ic_menu_remove_holo_light.png diff --git a/session/src/main/res/drawable-mdpi/ic_menu_search_holo_light.png b/app/src/main/res/drawable-mdpi/ic_menu_search_holo_light.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_menu_search_holo_light.png rename to app/src/main/res/drawable-mdpi/ic_menu_search_holo_light.png diff --git a/session/src/main/res/drawable-mdpi/ic_message_black_18dp.png b/app/src/main/res/drawable-mdpi/ic_message_black_18dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_message_black_18dp.png rename to app/src/main/res/drawable-mdpi/ic_message_black_18dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_message_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_message_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_message_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_message_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_mic_grey600_24dp.png b/app/src/main/res/drawable-mdpi/ic_mic_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_mic_grey600_24dp.png rename to app/src/main/res/drawable-mdpi/ic_mic_grey600_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_mic_off_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_mic_off_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_mic_off_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_mic_off_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_mic_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_mic_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_mic_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_mic_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_mic_white_48dp.png b/app/src/main/res/drawable-mdpi/ic_mic_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_mic_white_48dp.png rename to app/src/main/res/drawable-mdpi/ic_mic_white_48dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_missing_thumbnail_picture.png b/app/src/main/res/drawable-mdpi/ic_missing_thumbnail_picture.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_missing_thumbnail_picture.png rename to app/src/main/res/drawable-mdpi/ic_missing_thumbnail_picture.png diff --git a/session/src/main/res/drawable-mdpi/ic_mood_grey600_24dp.png b/app/src/main/res/drawable-mdpi/ic_mood_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_mood_grey600_24dp.png rename to app/src/main/res/drawable-mdpi/ic_mood_grey600_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_mood_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_mood_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_mood_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_mood_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_movie_creation_dark.png b/app/src/main/res/drawable-mdpi/ic_movie_creation_dark.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_movie_creation_dark.png rename to app/src/main/res/drawable-mdpi/ic_movie_creation_dark.png diff --git a/session/src/main/res/drawable-mdpi/ic_movie_creation_light.png b/app/src/main/res/drawable-mdpi/ic_movie_creation_light.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_movie_creation_light.png rename to app/src/main/res/drawable-mdpi/ic_movie_creation_light.png diff --git a/session/src/main/res/drawable-mdpi/ic_note_to_self.png b/app/src/main/res/drawable-mdpi/ic_note_to_self.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_note_to_self.png rename to app/src/main/res/drawable-mdpi/ic_note_to_self.png diff --git a/session/src/main/res/drawable-mdpi/ic_notification.png b/app/src/main/res/drawable-mdpi/ic_notification.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_notification.png rename to app/src/main/res/drawable-mdpi/ic_notification.png diff --git a/session/src/main/res/drawable-mdpi/ic_notifications_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_notifications_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_notifications_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_notifications_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_pause_circle_fill_white_48dp.png b/app/src/main/res/drawable-mdpi/ic_pause_circle_fill_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_pause_circle_fill_white_48dp.png rename to app/src/main/res/drawable-mdpi/ic_pause_circle_fill_white_48dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_person_add_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_person_add_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_person_add_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_person_add_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_person_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_person_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_person_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_person_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_pets_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_pets_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_pets_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_pets_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_phone_grey600_32dp.png b/app/src/main/res/drawable-mdpi/ic_phone_grey600_32dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_phone_grey600_32dp.png rename to app/src/main/res/drawable-mdpi/ic_phone_grey600_32dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_photo_camera_dark.png b/app/src/main/res/drawable-mdpi/ic_photo_camera_dark.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_photo_camera_dark.png rename to app/src/main/res/drawable-mdpi/ic_photo_camera_dark.png diff --git a/session/src/main/res/drawable-mdpi/ic_photo_camera_light.png b/app/src/main/res/drawable-mdpi/ic_photo_camera_light.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_photo_camera_light.png rename to app/src/main/res/drawable-mdpi/ic_photo_camera_light.png diff --git a/session/src/main/res/drawable-mdpi/ic_photo_camera_white_48dp.png b/app/src/main/res/drawable-mdpi/ic_photo_camera_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_photo_camera_white_48dp.png rename to app/src/main/res/drawable-mdpi/ic_photo_camera_white_48dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_photo_library_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_photo_library_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_photo_library_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_photo_library_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_play_circle_fill_white_48dp.png b/app/src/main/res/drawable-mdpi/ic_play_circle_fill_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_play_circle_fill_white_48dp.png rename to app/src/main/res/drawable-mdpi/ic_play_circle_fill_white_48dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_plus_28.png b/app/src/main/res/drawable-mdpi/ic_plus_28.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_plus_28.png rename to app/src/main/res/drawable-mdpi/ic_plus_28.png diff --git a/session/src/main/res/drawable-mdpi/ic_profile_camera.png b/app/src/main/res/drawable-mdpi/ic_profile_camera.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_profile_camera.png rename to app/src/main/res/drawable-mdpi/ic_profile_camera.png diff --git a/session/src/main/res/drawable-mdpi/ic_profile_default.png b/app/src/main/res/drawable-mdpi/ic_profile_default.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_profile_default.png rename to app/src/main/res/drawable-mdpi/ic_profile_default.png diff --git a/session/src/main/res/drawable-mdpi/ic_refresh_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_refresh_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_refresh_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_refresh_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_reply.png b/app/src/main/res/drawable-mdpi/ic_reply.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_reply.png rename to app/src/main/res/drawable-mdpi/ic_reply.png diff --git a/session/src/main/res/drawable-mdpi/ic_reply_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_reply_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_reply_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_reply_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_reply_white_36dp.png b/app/src/main/res/drawable-mdpi/ic_reply_white_36dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_reply_white_36dp.png rename to app/src/main/res/drawable-mdpi/ic_reply_white_36dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_restore_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_restore_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_restore_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_restore_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_rotate_32.png b/app/src/main/res/drawable-mdpi/ic_rotate_32.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_rotate_32.png rename to app/src/main/res/drawable-mdpi/ic_rotate_32.png diff --git a/session/src/main/res/drawable-mdpi/ic_scribble_save.png b/app/src/main/res/drawable-mdpi/ic_scribble_save.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_scribble_save.png rename to app/src/main/res/drawable-mdpi/ic_scribble_save.png diff --git a/session/src/main/res/drawable-mdpi/ic_scroll_down.png b/app/src/main/res/drawable-mdpi/ic_scroll_down.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_scroll_down.png rename to app/src/main/res/drawable-mdpi/ic_scroll_down.png diff --git a/session/src/main/res/drawable-mdpi/ic_security_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_security_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_security_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_security_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_select_all_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_select_all_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_select_all_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_select_all_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_select_off.png b/app/src/main/res/drawable-mdpi/ic_select_off.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_select_off.png rename to app/src/main/res/drawable-mdpi/ic_select_off.png diff --git a/session/src/main/res/drawable-mdpi/ic_select_on.png b/app/src/main/res/drawable-mdpi/ic_select_on.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_select_on.png rename to app/src/main/res/drawable-mdpi/ic_select_on.png diff --git a/session/src/main/res/drawable-mdpi/ic_send_push.png b/app/src/main/res/drawable-mdpi/ic_send_push.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_send_push.png rename to app/src/main/res/drawable-mdpi/ic_send_push.png diff --git a/session/src/main/res/drawable-mdpi/ic_send_push_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_send_push_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_send_push_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_send_push_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_send_sms_insecure.png b/app/src/main/res/drawable-mdpi/ic_send_sms_insecure.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_send_sms_insecure.png rename to app/src/main/res/drawable-mdpi/ic_send_sms_insecure.png diff --git a/session/src/main/res/drawable-mdpi/ic_send_sms_insecure_dark.png b/app/src/main/res/drawable-mdpi/ic_send_sms_insecure_dark.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_send_sms_insecure_dark.png rename to app/src/main/res/drawable-mdpi/ic_send_sms_insecure_dark.png diff --git a/session/src/main/res/drawable-mdpi/ic_send_sms_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_send_sms_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_send_sms_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_send_sms_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_share_black_18dp.png b/app/src/main/res/drawable-mdpi/ic_share_black_18dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_share_black_18dp.png rename to app/src/main/res/drawable-mdpi/ic_share_black_18dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_share_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_share_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_share_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_share_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_signal_background_connection.png b/app/src/main/res/drawable-mdpi/ic_signal_background_connection.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_signal_background_connection.png rename to app/src/main/res/drawable-mdpi/ic_signal_background_connection.png diff --git a/session/src/main/res/drawable-mdpi/ic_signal_backup.png b/app/src/main/res/drawable-mdpi/ic_signal_backup.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_signal_backup.png rename to app/src/main/res/drawable-mdpi/ic_signal_backup.png diff --git a/session/src/main/res/drawable-mdpi/ic_signal_downloading.png b/app/src/main/res/drawable-mdpi/ic_signal_downloading.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_signal_downloading.png rename to app/src/main/res/drawable-mdpi/ic_signal_downloading.png diff --git a/session/src/main/res/drawable-mdpi/ic_switch_camera_32.png b/app/src/main/res/drawable-mdpi/ic_switch_camera_32.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_switch_camera_32.png rename to app/src/main/res/drawable-mdpi/ic_switch_camera_32.png diff --git a/session/src/main/res/drawable-mdpi/ic_tag_faces_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_tag_faces_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_tag_faces_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_tag_faces_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_text_32.png b/app/src/main/res/drawable-mdpi/ic_text_32.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_text_32.png rename to app/src/main/res/drawable-mdpi/ic_text_32.png diff --git a/session/src/main/res/drawable-mdpi/ic_textsms_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_textsms_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_textsms_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_textsms_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_textsms_white_48dp.png b/app/src/main/res/drawable-mdpi/ic_textsms_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_textsms_white_48dp.png rename to app/src/main/res/drawable-mdpi/ic_textsms_white_48dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_timer.png b/app/src/main/res/drawable-mdpi/ic_timer.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_timer.png rename to app/src/main/res/drawable-mdpi/ic_timer.png diff --git a/session/src/main/res/drawable-mdpi/ic_timer_disabled.png b/app/src/main/res/drawable-mdpi/ic_timer_disabled.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_timer_disabled.png rename to app/src/main/res/drawable-mdpi/ic_timer_disabled.png diff --git a/session/src/main/res/drawable-mdpi/ic_timer_off_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_timer_off_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_timer_off_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_timer_off_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_trash_filled_32.png b/app/src/main/res/drawable-mdpi/ic_trash_filled_32.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_trash_filled_32.png rename to app/src/main/res/drawable-mdpi/ic_trash_filled_32.png diff --git a/session/src/main/res/drawable-mdpi/ic_unarchive_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_unarchive_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_unarchive_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_unarchive_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_unarchive_white_36dp.png b/app/src/main/res/drawable-mdpi/ic_unarchive_white_36dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_unarchive_white_36dp.png rename to app/src/main/res/drawable-mdpi/ic_unarchive_white_36dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_undo_32.png b/app/src/main/res/drawable-mdpi/ic_undo_32.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_undo_32.png rename to app/src/main/res/drawable-mdpi/ic_undo_32.png diff --git a/session/src/main/res/drawable-mdpi/ic_unidentified_delivery.png b/app/src/main/res/drawable-mdpi/ic_unidentified_delivery.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_unidentified_delivery.png rename to app/src/main/res/drawable-mdpi/ic_unidentified_delivery.png diff --git a/session/src/main/res/drawable-mdpi/ic_unlocked_white_18dp.png b/app/src/main/res/drawable-mdpi/ic_unlocked_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_unlocked_white_18dp.png rename to app/src/main/res/drawable-mdpi/ic_unlocked_white_18dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_unlocked_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_unlocked_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_unlocked_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_unlocked_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_video_dark.png b/app/src/main/res/drawable-mdpi/ic_video_dark.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_video_dark.png rename to app/src/main/res/drawable-mdpi/ic_video_dark.png diff --git a/session/src/main/res/drawable-mdpi/ic_video_light.png b/app/src/main/res/drawable-mdpi/ic_video_light.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_video_light.png rename to app/src/main/res/drawable-mdpi/ic_video_light.png diff --git a/session/src/main/res/drawable-mdpi/ic_videocam_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_videocam_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_videocam_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_videocam_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_videocam_white_48dp.png b/app/src/main/res/drawable-mdpi/ic_videocam_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_videocam_white_48dp.png rename to app/src/main/res/drawable-mdpi/ic_videocam_white_48dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_view_stream_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_view_stream_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_view_stream_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_view_stream_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_volume_off_grey600_18dp.png b/app/src/main/res/drawable-mdpi/ic_volume_off_grey600_18dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_volume_off_grey600_18dp.png rename to app/src/main/res/drawable-mdpi/ic_volume_off_grey600_18dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_volume_off_white_18dp.png b/app/src/main/res/drawable-mdpi/ic_volume_off_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_volume_off_white_18dp.png rename to app/src/main/res/drawable-mdpi/ic_volume_off_white_18dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_volume_up_dark.png b/app/src/main/res/drawable-mdpi/ic_volume_up_dark.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_volume_up_dark.png rename to app/src/main/res/drawable-mdpi/ic_volume_up_dark.png diff --git a/session/src/main/res/drawable-mdpi/ic_volume_up_light.png b/app/src/main/res/drawable-mdpi/ic_volume_up_light.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_volume_up_light.png rename to app/src/main/res/drawable-mdpi/ic_volume_up_light.png diff --git a/session/src/main/res/drawable-mdpi/ic_volume_up_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_volume_up_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_volume_up_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_volume_up_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_warning_dark.png b/app/src/main/res/drawable-mdpi/ic_warning_dark.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_warning_dark.png rename to app/src/main/res/drawable-mdpi/ic_warning_dark.png diff --git a/session/src/main/res/drawable-mdpi/ic_warning_light.png b/app/src/main/res/drawable-mdpi/ic_warning_light.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_warning_light.png rename to app/src/main/res/drawable-mdpi/ic_warning_light.png diff --git a/session/src/main/res/drawable-mdpi/ic_wb_sunny_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_wb_sunny_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_wb_sunny_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_wb_sunny_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_work_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_work_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_work_white_24dp.png rename to app/src/main/res/drawable-mdpi/ic_work_white_24dp.png diff --git a/session/src/main/res/drawable-mdpi/ic_x_28.png b/app/src/main/res/drawable-mdpi/ic_x_28.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_x_28.png rename to app/src/main/res/drawable-mdpi/ic_x_28.png diff --git a/session/src/main/res/drawable-mdpi/ic_x_circle.png b/app/src/main/res/drawable-mdpi/ic_x_circle.png similarity index 100% rename from session/src/main/res/drawable-mdpi/ic_x_circle.png rename to app/src/main/res/drawable-mdpi/ic_x_circle.png diff --git a/session/src/main/res/drawable-mdpi/icon_cached.png b/app/src/main/res/drawable-mdpi/icon_cached.png similarity index 100% rename from session/src/main/res/drawable-mdpi/icon_cached.png rename to app/src/main/res/drawable-mdpi/icon_cached.png diff --git a/session/src/main/res/drawable-mdpi/icon_dialog.png b/app/src/main/res/drawable-mdpi/icon_dialog.png similarity index 100% rename from session/src/main/res/drawable-mdpi/icon_dialog.png rename to app/src/main/res/drawable-mdpi/icon_dialog.png diff --git a/session/src/main/res/drawable-mdpi/icon_lock.png b/app/src/main/res/drawable-mdpi/icon_lock.png similarity index 100% rename from session/src/main/res/drawable-mdpi/icon_lock.png rename to app/src/main/res/drawable-mdpi/icon_lock.png diff --git a/session/src/main/res/drawable-mdpi/icon_transparent.png b/app/src/main/res/drawable-mdpi/icon_transparent.png similarity index 100% rename from session/src/main/res/drawable-mdpi/icon_transparent.png rename to app/src/main/res/drawable-mdpi/icon_transparent.png diff --git a/session/src/main/res/drawable-mdpi/import_database.png b/app/src/main/res/drawable-mdpi/import_database.png similarity index 100% rename from session/src/main/res/drawable-mdpi/import_database.png rename to app/src/main/res/drawable-mdpi/import_database.png diff --git a/session/src/main/res/drawable-mdpi/inbox_zero.png b/app/src/main/res/drawable-mdpi/inbox_zero.png similarity index 100% rename from session/src/main/res/drawable-mdpi/inbox_zero.png rename to app/src/main/res/drawable-mdpi/inbox_zero.png diff --git a/session/src/main/res/drawable-mdpi/link_preview_splash.png b/app/src/main/res/drawable-mdpi/link_preview_splash.png similarity index 100% rename from session/src/main/res/drawable-mdpi/link_preview_splash.png rename to app/src/main/res/drawable-mdpi/link_preview_splash.png diff --git a/session/src/main/res/drawable-mdpi/lockscreen_watermark_dark.png b/app/src/main/res/drawable-mdpi/lockscreen_watermark_dark.png similarity index 100% rename from session/src/main/res/drawable-mdpi/lockscreen_watermark_dark.png rename to app/src/main/res/drawable-mdpi/lockscreen_watermark_dark.png diff --git a/session/src/main/res/drawable-mdpi/lockscreen_watermark_light.png b/app/src/main/res/drawable-mdpi/lockscreen_watermark_light.png similarity index 100% rename from session/src/main/res/drawable-mdpi/lockscreen_watermark_light.png rename to app/src/main/res/drawable-mdpi/lockscreen_watermark_light.png diff --git a/session/src/main/res/drawable-mdpi/love_heart.png b/app/src/main/res/drawable-mdpi/love_heart.png similarity index 100% rename from session/src/main/res/drawable-mdpi/love_heart.png rename to app/src/main/res/drawable-mdpi/love_heart.png diff --git a/session/src/main/res/drawable-mdpi/message_24dp.png b/app/src/main/res/drawable-mdpi/message_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/message_24dp.png rename to app/src/main/res/drawable-mdpi/message_24dp.png diff --git a/session/src/main/res/drawable-mdpi/no_contacts.png b/app/src/main/res/drawable-mdpi/no_contacts.png similarity index 100% rename from session/src/main/res/drawable-mdpi/no_contacts.png rename to app/src/main/res/drawable-mdpi/no_contacts.png diff --git a/session/src/main/res/drawable-mdpi/notify_panel_notification_icon_bg.png b/app/src/main/res/drawable-mdpi/notify_panel_notification_icon_bg.png similarity index 100% rename from session/src/main/res/drawable-mdpi/notify_panel_notification_icon_bg.png rename to app/src/main/res/drawable-mdpi/notify_panel_notification_icon_bg.png diff --git a/session/src/main/res/drawable-mdpi/phone_24dp.png b/app/src/main/res/drawable-mdpi/phone_24dp.png similarity index 100% rename from session/src/main/res/drawable-mdpi/phone_24dp.png rename to app/src/main/res/drawable-mdpi/phone_24dp.png diff --git a/session/src/main/res/drawable-mdpi/poweredby_giphy.png b/app/src/main/res/drawable-mdpi/poweredby_giphy.png similarity index 100% rename from session/src/main/res/drawable-mdpi/poweredby_giphy.png rename to app/src/main/res/drawable-mdpi/poweredby_giphy.png diff --git a/session/src/main/res/drawable-mdpi/profile_splash.png b/app/src/main/res/drawable-mdpi/profile_splash.png similarity index 100% rename from session/src/main/res/drawable-mdpi/profile_splash.png rename to app/src/main/res/drawable-mdpi/profile_splash.png diff --git a/session/src/main/res/drawable-mdpi/quick_camera_dark.png b/app/src/main/res/drawable-mdpi/quick_camera_dark.png similarity index 100% rename from session/src/main/res/drawable-mdpi/quick_camera_dark.png rename to app/src/main/res/drawable-mdpi/quick_camera_dark.png diff --git a/session/src/main/res/drawable-mdpi/quick_camera_exit_fullscreen.png b/app/src/main/res/drawable-mdpi/quick_camera_exit_fullscreen.png similarity index 100% rename from session/src/main/res/drawable-mdpi/quick_camera_exit_fullscreen.png rename to app/src/main/res/drawable-mdpi/quick_camera_exit_fullscreen.png diff --git a/session/src/main/res/drawable-mdpi/quick_camera_front.png b/app/src/main/res/drawable-mdpi/quick_camera_front.png similarity index 100% rename from session/src/main/res/drawable-mdpi/quick_camera_front.png rename to app/src/main/res/drawable-mdpi/quick_camera_front.png diff --git a/session/src/main/res/drawable-mdpi/quick_camera_fullscreen.png b/app/src/main/res/drawable-mdpi/quick_camera_fullscreen.png similarity index 100% rename from session/src/main/res/drawable-mdpi/quick_camera_fullscreen.png rename to app/src/main/res/drawable-mdpi/quick_camera_fullscreen.png diff --git a/session/src/main/res/drawable-mdpi/quick_camera_hide.png b/app/src/main/res/drawable-mdpi/quick_camera_hide.png similarity index 100% rename from session/src/main/res/drawable-mdpi/quick_camera_hide.png rename to app/src/main/res/drawable-mdpi/quick_camera_hide.png diff --git a/session/src/main/res/drawable-mdpi/quick_camera_light.png b/app/src/main/res/drawable-mdpi/quick_camera_light.png similarity index 100% rename from session/src/main/res/drawable-mdpi/quick_camera_light.png rename to app/src/main/res/drawable-mdpi/quick_camera_light.png diff --git a/session/src/main/res/drawable-mdpi/quick_camera_rear.png b/app/src/main/res/drawable-mdpi/quick_camera_rear.png similarity index 100% rename from session/src/main/res/drawable-mdpi/quick_camera_rear.png rename to app/src/main/res/drawable-mdpi/quick_camera_rear.png diff --git a/session/src/main/res/drawable-mdpi/quick_shutter_button.png b/app/src/main/res/drawable-mdpi/quick_shutter_button.png similarity index 100% rename from session/src/main/res/drawable-mdpi/quick_shutter_button.png rename to app/src/main/res/drawable-mdpi/quick_shutter_button.png diff --git a/session/src/main/res/drawable-mdpi/timer00.png b/app/src/main/res/drawable-mdpi/timer00.png similarity index 100% rename from session/src/main/res/drawable-mdpi/timer00.png rename to app/src/main/res/drawable-mdpi/timer00.png diff --git a/session/src/main/res/drawable-mdpi/timer05.png b/app/src/main/res/drawable-mdpi/timer05.png similarity index 100% rename from session/src/main/res/drawable-mdpi/timer05.png rename to app/src/main/res/drawable-mdpi/timer05.png diff --git a/session/src/main/res/drawable-mdpi/timer10.png b/app/src/main/res/drawable-mdpi/timer10.png similarity index 100% rename from session/src/main/res/drawable-mdpi/timer10.png rename to app/src/main/res/drawable-mdpi/timer10.png diff --git a/session/src/main/res/drawable-mdpi/timer15.png b/app/src/main/res/drawable-mdpi/timer15.png similarity index 100% rename from session/src/main/res/drawable-mdpi/timer15.png rename to app/src/main/res/drawable-mdpi/timer15.png diff --git a/session/src/main/res/drawable-mdpi/timer20.png b/app/src/main/res/drawable-mdpi/timer20.png similarity index 100% rename from session/src/main/res/drawable-mdpi/timer20.png rename to app/src/main/res/drawable-mdpi/timer20.png diff --git a/session/src/main/res/drawable-mdpi/timer25.png b/app/src/main/res/drawable-mdpi/timer25.png similarity index 100% rename from session/src/main/res/drawable-mdpi/timer25.png rename to app/src/main/res/drawable-mdpi/timer25.png diff --git a/session/src/main/res/drawable-mdpi/timer30.png b/app/src/main/res/drawable-mdpi/timer30.png similarity index 100% rename from session/src/main/res/drawable-mdpi/timer30.png rename to app/src/main/res/drawable-mdpi/timer30.png diff --git a/session/src/main/res/drawable-mdpi/timer35.png b/app/src/main/res/drawable-mdpi/timer35.png similarity index 100% rename from session/src/main/res/drawable-mdpi/timer35.png rename to app/src/main/res/drawable-mdpi/timer35.png diff --git a/session/src/main/res/drawable-mdpi/timer40.png b/app/src/main/res/drawable-mdpi/timer40.png similarity index 100% rename from session/src/main/res/drawable-mdpi/timer40.png rename to app/src/main/res/drawable-mdpi/timer40.png diff --git a/session/src/main/res/drawable-mdpi/timer45.png b/app/src/main/res/drawable-mdpi/timer45.png similarity index 100% rename from session/src/main/res/drawable-mdpi/timer45.png rename to app/src/main/res/drawable-mdpi/timer45.png diff --git a/session/src/main/res/drawable-mdpi/timer50.png b/app/src/main/res/drawable-mdpi/timer50.png similarity index 100% rename from session/src/main/res/drawable-mdpi/timer50.png rename to app/src/main/res/drawable-mdpi/timer50.png diff --git a/session/src/main/res/drawable-mdpi/timer55.png b/app/src/main/res/drawable-mdpi/timer55.png similarity index 100% rename from session/src/main/res/drawable-mdpi/timer55.png rename to app/src/main/res/drawable-mdpi/timer55.png diff --git a/session/src/main/res/drawable-mdpi/timer60.png b/app/src/main/res/drawable-mdpi/timer60.png similarity index 100% rename from session/src/main/res/drawable-mdpi/timer60.png rename to app/src/main/res/drawable-mdpi/timer60.png diff --git a/session/src/main/res/drawable-mdpi/video_splash.png b/app/src/main/res/drawable-mdpi/video_splash.png similarity index 100% rename from session/src/main/res/drawable-mdpi/video_splash.png rename to app/src/main/res/drawable-mdpi/video_splash.png diff --git a/session/src/main/res/drawable-mdpi/welcome.png b/app/src/main/res/drawable-mdpi/welcome.png similarity index 100% rename from session/src/main/res/drawable-mdpi/welcome.png rename to app/src/main/res/drawable-mdpi/welcome.png diff --git a/session/src/main/res/drawable-notnight/prominent_filled_button_medium_background.xml b/app/src/main/res/drawable-notnight/prominent_filled_button_medium_background.xml similarity index 100% rename from session/src/main/res/drawable-notnight/prominent_filled_button_medium_background.xml rename to app/src/main/res/drawable-notnight/prominent_filled_button_medium_background.xml diff --git a/session/src/main/res/drawable-notnight/prominent_outline_button_medium_background.xml b/app/src/main/res/drawable-notnight/prominent_outline_button_medium_background.xml similarity index 100% rename from session/src/main/res/drawable-notnight/prominent_outline_button_medium_background.xml rename to app/src/main/res/drawable-notnight/prominent_outline_button_medium_background.xml diff --git a/session/src/main/res/drawable-notnight/unimportant_filled_button_medium_background.xml b/app/src/main/res/drawable-notnight/unimportant_filled_button_medium_background.xml similarity index 100% rename from session/src/main/res/drawable-notnight/unimportant_filled_button_medium_background.xml rename to app/src/main/res/drawable-notnight/unimportant_filled_button_medium_background.xml diff --git a/session/src/main/res/drawable-xhdpi/baseline_account_circle_white_24.png b/app/src/main/res/drawable-xhdpi/baseline_account_circle_white_24.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/baseline_account_circle_white_24.png rename to app/src/main/res/drawable-xhdpi/baseline_account_circle_white_24.png diff --git a/session/src/main/res/drawable-xhdpi/baseline_email_white_24.png b/app/src/main/res/drawable-xhdpi/baseline_email_white_24.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/baseline_email_white_24.png rename to app/src/main/res/drawable-xhdpi/baseline_email_white_24.png diff --git a/session/src/main/res/drawable-xhdpi/check.png b/app/src/main/res/drawable-xhdpi/check.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/check.png rename to app/src/main/res/drawable-xhdpi/check.png diff --git a/session/src/main/res/drawable-xhdpi/clear_profile_avatar.png b/app/src/main/res/drawable-xhdpi/clear_profile_avatar.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/clear_profile_avatar.png rename to app/src/main/res/drawable-xhdpi/clear_profile_avatar.png diff --git a/session/src/main/res/drawable-xhdpi/conversation_list_empty_state.png b/app/src/main/res/drawable-xhdpi/conversation_list_empty_state.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/conversation_list_empty_state.png rename to app/src/main/res/drawable-xhdpi/conversation_list_empty_state.png diff --git a/session/src/main/res/drawable-xhdpi/divet_lower_right_dark.png b/app/src/main/res/drawable-xhdpi/divet_lower_right_dark.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/divet_lower_right_dark.png rename to app/src/main/res/drawable-xhdpi/divet_lower_right_dark.png diff --git a/session/src/main/res/drawable-xhdpi/divet_lower_right_light.png b/app/src/main/res/drawable-xhdpi/divet_lower_right_light.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/divet_lower_right_light.png rename to app/src/main/res/drawable-xhdpi/divet_lower_right_light.png diff --git a/session/src/main/res/drawable-xhdpi/empty_inbox_1.png b/app/src/main/res/drawable-xhdpi/empty_inbox_1.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/empty_inbox_1.png rename to app/src/main/res/drawable-xhdpi/empty_inbox_1.png diff --git a/session/src/main/res/drawable-xhdpi/empty_inbox_2.png b/app/src/main/res/drawable-xhdpi/empty_inbox_2.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/empty_inbox_2.png rename to app/src/main/res/drawable-xhdpi/empty_inbox_2.png diff --git a/session/src/main/res/drawable-xhdpi/empty_inbox_3.png b/app/src/main/res/drawable-xhdpi/empty_inbox_3.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/empty_inbox_3.png rename to app/src/main/res/drawable-xhdpi/empty_inbox_3.png diff --git a/session/src/main/res/drawable-xhdpi/empty_inbox_4.png b/app/src/main/res/drawable-xhdpi/empty_inbox_4.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/empty_inbox_4.png rename to app/src/main/res/drawable-xhdpi/empty_inbox_4.png diff --git a/session/src/main/res/drawable-xhdpi/empty_inbox_5.png b/app/src/main/res/drawable-xhdpi/empty_inbox_5.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/empty_inbox_5.png rename to app/src/main/res/drawable-xhdpi/empty_inbox_5.png diff --git a/session/src/main/res/drawable-xhdpi/ic_account_box_dark.png b/app/src/main/res/drawable-xhdpi/ic_account_box_dark.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_account_box_dark.png rename to app/src/main/res/drawable-xhdpi/ic_account_box_dark.png diff --git a/session/src/main/res/drawable-xhdpi/ic_account_box_light.png b/app/src/main/res/drawable-xhdpi/ic_account_box_light.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_account_box_light.png rename to app/src/main/res/drawable-xhdpi/ic_account_box_light.png diff --git a/session/src/main/res/drawable-xhdpi/ic_action_name.png b/app/src/main/res/drawable-xhdpi/ic_action_name.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_action_name.png rename to app/src/main/res/drawable-xhdpi/ic_action_name.png diff --git a/session/src/main/res/drawable-xhdpi/ic_action_warning_red.png b/app/src/main/res/drawable-xhdpi/ic_action_warning_red.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_action_warning_red.png rename to app/src/main/res/drawable-xhdpi/ic_action_warning_red.png diff --git a/session/src/main/res/drawable-xhdpi/ic_add_caption_36.png b/app/src/main/res/drawable-xhdpi/ic_add_caption_36.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_add_caption_36.png rename to app/src/main/res/drawable-xhdpi/ic_add_caption_36.png diff --git a/session/src/main/res/drawable-xhdpi/ic_add_photo.png b/app/src/main/res/drawable-xhdpi/ic_add_photo.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_add_photo.png rename to app/src/main/res/drawable-xhdpi/ic_add_photo.png diff --git a/session/src/main/res/drawable-xhdpi/ic_add_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_add_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_add_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_add_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_add_white_original_24dp.png b/app/src/main/res/drawable-xhdpi/ic_add_white_original_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_add_white_original_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_add_white_original_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_advanced_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_advanced_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_advanced_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_advanced_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_archive_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_archive_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_archive_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_archive_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_arrow_back_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_arrow_back_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_arrow_back_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_arrow_back_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_arrow_right.png b/app/src/main/res/drawable-xhdpi/ic_arrow_right.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_arrow_right.png rename to app/src/main/res/drawable-xhdpi/ic_arrow_right.png diff --git a/session/src/main/res/drawable-xhdpi/ic_arrow_up.png b/app/src/main/res/drawable-xhdpi/ic_arrow_up.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_arrow_up.png rename to app/src/main/res/drawable-xhdpi/ic_arrow_up.png diff --git a/session/src/main/res/drawable-xhdpi/ic_attach_grey600_24dp.png b/app/src/main/res/drawable-xhdpi/ic_attach_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_attach_grey600_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_attach_grey600_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_attach_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_attach_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_attach_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_attach_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_audio_dark.png b/app/src/main/res/drawable-xhdpi/ic_audio_dark.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_audio_dark.png rename to app/src/main/res/drawable-xhdpi/ic_audio_dark.png diff --git a/session/src/main/res/drawable-xhdpi/ic_audio_light.png b/app/src/main/res/drawable-xhdpi/ic_audio_light.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_audio_light.png rename to app/src/main/res/drawable-xhdpi/ic_audio_light.png diff --git a/session/src/main/res/drawable-xhdpi/ic_backspace_grey600_24dp.png b/app/src/main/res/drawable-xhdpi/ic_backspace_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_backspace_grey600_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_backspace_grey600_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_block_grey600_18dp.png b/app/src/main/res/drawable-xhdpi/ic_block_grey600_18dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_block_grey600_18dp.png rename to app/src/main/res/drawable-xhdpi/ic_block_grey600_18dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_block_white_18dp.png b/app/src/main/res/drawable-xhdpi/ic_block_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_block_white_18dp.png rename to app/src/main/res/drawable-xhdpi/ic_block_white_18dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_block_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_block_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_block_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_block_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_bluetooth_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_bluetooth_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_bluetooth_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_bluetooth_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_brightness_6_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_brightness_6_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_brightness_6_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_brightness_6_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_broken_link.png b/app/src/main/res/drawable-xhdpi/ic_broken_link.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_broken_link.png rename to app/src/main/res/drawable-xhdpi/ic_broken_link.png diff --git a/session/src/main/res/drawable-xhdpi/ic_brush_highlight_32.png b/app/src/main/res/drawable-xhdpi/ic_brush_highlight_32.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_brush_highlight_32.png rename to app/src/main/res/drawable-xhdpi/ic_brush_highlight_32.png diff --git a/session/src/main/res/drawable-xhdpi/ic_brush_marker_32.png b/app/src/main/res/drawable-xhdpi/ic_brush_marker_32.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_brush_marker_32.png rename to app/src/main/res/drawable-xhdpi/ic_brush_marker_32.png diff --git a/session/src/main/res/drawable-xhdpi/ic_call_end_grey600_32dp.png b/app/src/main/res/drawable-xhdpi/ic_call_end_grey600_32dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_call_end_grey600_32dp.png rename to app/src/main/res/drawable-xhdpi/ic_call_end_grey600_32dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_call_end_white_48dp.png b/app/src/main/res/drawable-xhdpi/ic_call_end_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_call_end_white_48dp.png rename to app/src/main/res/drawable-xhdpi/ic_call_end_white_48dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_call_made_grey600_24dp.png b/app/src/main/res/drawable-xhdpi/ic_call_made_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_call_made_grey600_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_call_made_grey600_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_call_missed_grey600_24dp.png b/app/src/main/res/drawable-xhdpi/ic_call_missed_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_call_missed_grey600_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_call_missed_grey600_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_call_received_grey600_24dp.png b/app/src/main/res/drawable-xhdpi/ic_call_received_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_call_received_grey600_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_call_received_grey600_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_call_secure_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_call_secure_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_call_secure_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_call_secure_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_call_split_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_call_split_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_call_split_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_call_split_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_camera_alt_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_camera_alt_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_camera_alt_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_camera_alt_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_camera_filled_24.png b/app/src/main/res/drawable-xhdpi/ic_camera_filled_24.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_camera_filled_24.png rename to app/src/main/res/drawable-xhdpi/ic_camera_filled_24.png diff --git a/session/src/main/res/drawable-xhdpi/ic_camera_shutter.png b/app/src/main/res/drawable-xhdpi/ic_camera_shutter.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_camera_shutter.png rename to app/src/main/res/drawable-xhdpi/ic_camera_shutter.png diff --git a/session/src/main/res/drawable-xhdpi/ic_camera_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_camera_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_camera_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_camera_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_caption_28.png b/app/src/main/res/drawable-xhdpi/ic_caption_28.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_caption_28.png rename to app/src/main/res/drawable-xhdpi/ic_caption_28.png diff --git a/session/src/main/res/drawable-xhdpi/ic_check_circle_32.png b/app/src/main/res/drawable-xhdpi/ic_check_circle_32.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_check_circle_32.png rename to app/src/main/res/drawable-xhdpi/ic_check_circle_32.png diff --git a/session/src/main/res/drawable-xhdpi/ic_check_circle_white_18dp.png b/app/src/main/res/drawable-xhdpi/ic_check_circle_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_check_circle_white_18dp.png rename to app/src/main/res/drawable-xhdpi/ic_check_circle_white_18dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_check_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_check_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_check_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_check_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_check_white_48dp.png b/app/src/main/res/drawable-xhdpi/ic_check_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_check_white_48dp.png rename to app/src/main/res/drawable-xhdpi/ic_check_white_48dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_circle_fill_white_48dp.png b/app/src/main/res/drawable-xhdpi/ic_circle_fill_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_circle_fill_white_48dp.png rename to app/src/main/res/drawable-xhdpi/ic_circle_fill_white_48dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_clear_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_clear_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_clear_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_clear_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_close_grey600_32dp.png b/app/src/main/res/drawable-xhdpi/ic_close_grey600_32dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_close_grey600_32dp.png rename to app/src/main/res/drawable-xhdpi/ic_close_grey600_32dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_close_white_18dp.png b/app/src/main/res/drawable-xhdpi/ic_close_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_close_white_18dp.png rename to app/src/main/res/drawable-xhdpi/ic_close_white_18dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_close_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_close_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_close_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_close_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_close_white_48dp.png b/app/src/main/res/drawable-xhdpi/ic_close_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_close_white_48dp.png rename to app/src/main/res/drawable-xhdpi/ic_close_white_48dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_contact_picture.png b/app/src/main/res/drawable-xhdpi/ic_contact_picture.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_contact_picture.png rename to app/src/main/res/drawable-xhdpi/ic_contact_picture.png diff --git a/session/src/main/res/drawable-xhdpi/ic_contact_picture_large.png b/app/src/main/res/drawable-xhdpi/ic_contact_picture_large.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_contact_picture_large.png rename to app/src/main/res/drawable-xhdpi/ic_contact_picture_large.png diff --git a/session/src/main/res/drawable-xhdpi/ic_contacts_white_48dp.png b/app/src/main/res/drawable-xhdpi/ic_contacts_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_contacts_white_48dp.png rename to app/src/main/res/drawable-xhdpi/ic_contacts_white_48dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_content_copy_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_content_copy_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_content_copy_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_content_copy_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_create_album_filled_32.png b/app/src/main/res/drawable-xhdpi/ic_create_album_filled_32.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_create_album_filled_32.png rename to app/src/main/res/drawable-xhdpi/ic_create_album_filled_32.png diff --git a/session/src/main/res/drawable-xhdpi/ic_create_album_outline_32.png b/app/src/main/res/drawable-xhdpi/ic_create_album_outline_32.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_create_album_outline_32.png rename to app/src/main/res/drawable-xhdpi/ic_create_album_outline_32.png diff --git a/session/src/main/res/drawable-xhdpi/ic_create_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_create_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_create_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_create_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_crop_32.png b/app/src/main/res/drawable-xhdpi/ic_crop_32.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_crop_32.png rename to app/src/main/res/drawable-xhdpi/ic_crop_32.png diff --git a/session/src/main/res/drawable-xhdpi/ic_crop_lock_32.png b/app/src/main/res/drawable-xhdpi/ic_crop_lock_32.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_crop_lock_32.png rename to app/src/main/res/drawable-xhdpi/ic_crop_lock_32.png diff --git a/session/src/main/res/drawable-xhdpi/ic_crop_unlock_32.png b/app/src/main/res/drawable-xhdpi/ic_crop_unlock_32.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_crop_unlock_32.png rename to app/src/main/res/drawable-xhdpi/ic_crop_unlock_32.png diff --git a/session/src/main/res/drawable-xhdpi/ic_dashboard_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_dashboard_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_dashboard_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_dashboard_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_delete_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_delete_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_delete_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_delete_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_delivery_status_delivered.png b/app/src/main/res/drawable-xhdpi/ic_delivery_status_delivered.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_delivery_status_delivered.png rename to app/src/main/res/drawable-xhdpi/ic_delivery_status_delivered.png diff --git a/session/src/main/res/drawable-xhdpi/ic_delivery_status_read.png b/app/src/main/res/drawable-xhdpi/ic_delivery_status_read.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_delivery_status_read.png rename to app/src/main/res/drawable-xhdpi/ic_delivery_status_read.png diff --git a/session/src/main/res/drawable-xhdpi/ic_delivery_status_sending.png b/app/src/main/res/drawable-xhdpi/ic_delivery_status_sending.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_delivery_status_sending.png rename to app/src/main/res/drawable-xhdpi/ic_delivery_status_sending.png diff --git a/session/src/main/res/drawable-xhdpi/ic_delivery_status_sent.png b/app/src/main/res/drawable-xhdpi/ic_delivery_status_sent.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_delivery_status_sent.png rename to app/src/main/res/drawable-xhdpi/ic_delivery_status_sent.png diff --git a/session/src/main/res/drawable-xhdpi/ic_devices_white.png b/app/src/main/res/drawable-xhdpi/ic_devices_white.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_devices_white.png rename to app/src/main/res/drawable-xhdpi/ic_devices_white.png diff --git a/session/src/main/res/drawable-xhdpi/ic_dialpad_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_dialpad_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_dialpad_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_dialpad_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_document_large_dark.png b/app/src/main/res/drawable-xhdpi/ic_document_large_dark.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_document_large_dark.png rename to app/src/main/res/drawable-xhdpi/ic_document_large_dark.png diff --git a/session/src/main/res/drawable-xhdpi/ic_document_large_light.png b/app/src/main/res/drawable-xhdpi/ic_document_large_light.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_document_large_light.png rename to app/src/main/res/drawable-xhdpi/ic_document_large_light.png diff --git a/session/src/main/res/drawable-xhdpi/ic_document_small_dark.png b/app/src/main/res/drawable-xhdpi/ic_document_small_dark.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_document_small_dark.png rename to app/src/main/res/drawable-xhdpi/ic_document_small_dark.png diff --git a/session/src/main/res/drawable-xhdpi/ic_document_small_light.png b/app/src/main/res/drawable-xhdpi/ic_document_small_light.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_document_small_light.png rename to app/src/main/res/drawable-xhdpi/ic_document_small_light.png diff --git a/session/src/main/res/drawable-xhdpi/ic_download_circle_fill_white_48dp.png b/app/src/main/res/drawable-xhdpi/ic_download_circle_fill_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_download_circle_fill_white_48dp.png rename to app/src/main/res/drawable-xhdpi/ic_download_circle_fill_white_48dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_emoji_32.png b/app/src/main/res/drawable-xhdpi/ic_emoji_32.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_emoji_32.png rename to app/src/main/res/drawable-xhdpi/ic_emoji_32.png diff --git a/session/src/main/res/drawable-xhdpi/ic_error.png b/app/src/main/res/drawable-xhdpi/ic_error.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_error.png rename to app/src/main/res/drawable-xhdpi/ic_error.png diff --git a/session/src/main/res/drawable-xhdpi/ic_face_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_face_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_face_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_face_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_favorite_grey600_24dp.png b/app/src/main/res/drawable-xhdpi/ic_favorite_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_favorite_grey600_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_favorite_grey600_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_file_download_white_36dp.png b/app/src/main/res/drawable-xhdpi/ic_file_download_white_36dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_file_download_white_36dp.png rename to app/src/main/res/drawable-xhdpi/ic_file_download_white_36dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_fingerprint_white_48dp.png b/app/src/main/res/drawable-xhdpi/ic_fingerprint_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_fingerprint_white_48dp.png rename to app/src/main/res/drawable-xhdpi/ic_fingerprint_white_48dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_flip_32.png b/app/src/main/res/drawable-xhdpi/ic_flip_32.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_flip_32.png rename to app/src/main/res/drawable-xhdpi/ic_flip_32.png diff --git a/session/src/main/res/drawable-xhdpi/ic_forum_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_forum_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_forum_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_forum_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_gif_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_gif_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_gif_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_gif_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_group_grey600_24dp.png b/app/src/main/res/drawable-xhdpi/ic_group_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_group_grey600_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_group_grey600_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_group_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_group_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_group_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_group_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_headset_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_headset_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_headset_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_headset_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_image_dark.png b/app/src/main/res/drawable-xhdpi/ic_image_dark.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_image_dark.png rename to app/src/main/res/drawable-xhdpi/ic_image_dark.png diff --git a/session/src/main/res/drawable-xhdpi/ic_image_light.png b/app/src/main/res/drawable-xhdpi/ic_image_light.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_image_light.png rename to app/src/main/res/drawable-xhdpi/ic_image_light.png diff --git a/session/src/main/res/drawable-xhdpi/ic_image_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_image_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_image_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_image_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_info_outline_dark.png b/app/src/main/res/drawable-xhdpi/ic_info_outline_dark.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_info_outline_dark.png rename to app/src/main/res/drawable-xhdpi/ic_info_outline_dark.png diff --git a/session/src/main/res/drawable-xhdpi/ic_info_outline_light.png b/app/src/main/res/drawable-xhdpi/ic_info_outline_light.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_info_outline_light.png rename to app/src/main/res/drawable-xhdpi/ic_info_outline_light.png diff --git a/session/src/main/res/drawable-xhdpi/ic_info_outline_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_info_outline_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_info_outline_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_info_outline_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_info_white_18dp.png b/app/src/main/res/drawable-xhdpi/ic_info_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_info_white_18dp.png rename to app/src/main/res/drawable-xhdpi/ic_info_white_18dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_insert_drive_file_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_insert_drive_file_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_insert_drive_file_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_insert_drive_file_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_keyboard_arrow_left_grey600_24dp.png b/app/src/main/res/drawable-xhdpi/ic_keyboard_arrow_left_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_keyboard_arrow_left_grey600_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_keyboard_arrow_left_grey600_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_keyboard_grey600_24dp.png b/app/src/main/res/drawable-xhdpi/ic_keyboard_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_keyboard_grey600_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_keyboard_grey600_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_keyboard_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_keyboard_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_keyboard_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_keyboard_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_laptop_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_laptop_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_laptop_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_laptop_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_launch_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_launch_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_launch_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_launch_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_local_dining_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_local_dining_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_local_dining_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_local_dining_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_location_on_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_location_on_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_location_on_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_location_on_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_lock_white_18dp.png b/app/src/main/res/drawable-xhdpi/ic_lock_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_lock_white_18dp.png rename to app/src/main/res/drawable-xhdpi/ic_lock_white_18dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_lock_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_lock_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_lock_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_lock_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_lock_white_48dp.png b/app/src/main/res/drawable-xhdpi/ic_lock_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_lock_white_48dp.png rename to app/src/main/res/drawable-xhdpi/ic_lock_white_48dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_menu_add_field_holo_light.png b/app/src/main/res/drawable-xhdpi/ic_menu_add_field_holo_light.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_menu_add_field_holo_light.png rename to app/src/main/res/drawable-xhdpi/ic_menu_add_field_holo_light.png diff --git a/session/src/main/res/drawable-xhdpi/ic_menu_lock_dark.png b/app/src/main/res/drawable-xhdpi/ic_menu_lock_dark.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_menu_lock_dark.png rename to app/src/main/res/drawable-xhdpi/ic_menu_lock_dark.png diff --git a/session/src/main/res/drawable-xhdpi/ic_menu_login.png b/app/src/main/res/drawable-xhdpi/ic_menu_login.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_menu_login.png rename to app/src/main/res/drawable-xhdpi/ic_menu_login.png diff --git a/session/src/main/res/drawable-xhdpi/ic_menu_remove_holo_light.png b/app/src/main/res/drawable-xhdpi/ic_menu_remove_holo_light.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_menu_remove_holo_light.png rename to app/src/main/res/drawable-xhdpi/ic_menu_remove_holo_light.png diff --git a/session/src/main/res/drawable-xhdpi/ic_menu_search_holo_light.png b/app/src/main/res/drawable-xhdpi/ic_menu_search_holo_light.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_menu_search_holo_light.png rename to app/src/main/res/drawable-xhdpi/ic_menu_search_holo_light.png diff --git a/session/src/main/res/drawable-xhdpi/ic_message_black_18dp.png b/app/src/main/res/drawable-xhdpi/ic_message_black_18dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_message_black_18dp.png rename to app/src/main/res/drawable-xhdpi/ic_message_black_18dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_message_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_message_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_message_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_message_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_mic_grey600_24dp.png b/app/src/main/res/drawable-xhdpi/ic_mic_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_mic_grey600_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_mic_grey600_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_mic_off_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_mic_off_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_mic_off_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_mic_off_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_mic_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_mic_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_mic_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_mic_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_mic_white_48dp.png b/app/src/main/res/drawable-xhdpi/ic_mic_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_mic_white_48dp.png rename to app/src/main/res/drawable-xhdpi/ic_mic_white_48dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_missing_thumbnail_picture.png b/app/src/main/res/drawable-xhdpi/ic_missing_thumbnail_picture.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_missing_thumbnail_picture.png rename to app/src/main/res/drawable-xhdpi/ic_missing_thumbnail_picture.png diff --git a/session/src/main/res/drawable-xhdpi/ic_mood_grey600_24dp.png b/app/src/main/res/drawable-xhdpi/ic_mood_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_mood_grey600_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_mood_grey600_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_mood_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_mood_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_mood_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_mood_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_movie_creation_dark.png b/app/src/main/res/drawable-xhdpi/ic_movie_creation_dark.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_movie_creation_dark.png rename to app/src/main/res/drawable-xhdpi/ic_movie_creation_dark.png diff --git a/session/src/main/res/drawable-xhdpi/ic_movie_creation_light.png b/app/src/main/res/drawable-xhdpi/ic_movie_creation_light.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_movie_creation_light.png rename to app/src/main/res/drawable-xhdpi/ic_movie_creation_light.png diff --git a/session/src/main/res/drawable-xhdpi/ic_note_to_self.png b/app/src/main/res/drawable-xhdpi/ic_note_to_self.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_note_to_self.png rename to app/src/main/res/drawable-xhdpi/ic_note_to_self.png diff --git a/session/src/main/res/drawable-xhdpi/ic_notification.png b/app/src/main/res/drawable-xhdpi/ic_notification.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_notification.png rename to app/src/main/res/drawable-xhdpi/ic_notification.png diff --git a/session/src/main/res/drawable-xhdpi/ic_notifications_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_notifications_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_notifications_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_notifications_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_pause_circle_fill_white_48dp.png b/app/src/main/res/drawable-xhdpi/ic_pause_circle_fill_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_pause_circle_fill_white_48dp.png rename to app/src/main/res/drawable-xhdpi/ic_pause_circle_fill_white_48dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_person_add_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_person_add_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_person_add_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_person_add_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_person_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_person_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_person_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_person_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_pets_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_pets_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_pets_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_pets_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_phone_grey600_32dp.png b/app/src/main/res/drawable-xhdpi/ic_phone_grey600_32dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_phone_grey600_32dp.png rename to app/src/main/res/drawable-xhdpi/ic_phone_grey600_32dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_photo_camera_dark.png b/app/src/main/res/drawable-xhdpi/ic_photo_camera_dark.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_photo_camera_dark.png rename to app/src/main/res/drawable-xhdpi/ic_photo_camera_dark.png diff --git a/session/src/main/res/drawable-xhdpi/ic_photo_camera_light.png b/app/src/main/res/drawable-xhdpi/ic_photo_camera_light.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_photo_camera_light.png rename to app/src/main/res/drawable-xhdpi/ic_photo_camera_light.png diff --git a/session/src/main/res/drawable-xhdpi/ic_photo_camera_white_48dp.png b/app/src/main/res/drawable-xhdpi/ic_photo_camera_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_photo_camera_white_48dp.png rename to app/src/main/res/drawable-xhdpi/ic_photo_camera_white_48dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_photo_library_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_photo_library_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_photo_library_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_photo_library_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_play_circle_fill_white_48dp.png b/app/src/main/res/drawable-xhdpi/ic_play_circle_fill_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_play_circle_fill_white_48dp.png rename to app/src/main/res/drawable-xhdpi/ic_play_circle_fill_white_48dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_plus_28.png b/app/src/main/res/drawable-xhdpi/ic_plus_28.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_plus_28.png rename to app/src/main/res/drawable-xhdpi/ic_plus_28.png diff --git a/session/src/main/res/drawable-xhdpi/ic_profile_camera.png b/app/src/main/res/drawable-xhdpi/ic_profile_camera.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_profile_camera.png rename to app/src/main/res/drawable-xhdpi/ic_profile_camera.png diff --git a/session/src/main/res/drawable-xhdpi/ic_profile_default.png b/app/src/main/res/drawable-xhdpi/ic_profile_default.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_profile_default.png rename to app/src/main/res/drawable-xhdpi/ic_profile_default.png diff --git a/session/src/main/res/drawable-xhdpi/ic_refresh_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_refresh_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_refresh_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_refresh_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_reply.png b/app/src/main/res/drawable-xhdpi/ic_reply.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_reply.png rename to app/src/main/res/drawable-xhdpi/ic_reply.png diff --git a/session/src/main/res/drawable-xhdpi/ic_reply_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_reply_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_reply_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_reply_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_reply_white_36dp.png b/app/src/main/res/drawable-xhdpi/ic_reply_white_36dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_reply_white_36dp.png rename to app/src/main/res/drawable-xhdpi/ic_reply_white_36dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_restore_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_restore_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_restore_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_restore_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_rotate_32.png b/app/src/main/res/drawable-xhdpi/ic_rotate_32.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_rotate_32.png rename to app/src/main/res/drawable-xhdpi/ic_rotate_32.png diff --git a/session/src/main/res/drawable-xhdpi/ic_scribble_save.png b/app/src/main/res/drawable-xhdpi/ic_scribble_save.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_scribble_save.png rename to app/src/main/res/drawable-xhdpi/ic_scribble_save.png diff --git a/session/src/main/res/drawable-xhdpi/ic_scroll_down.png b/app/src/main/res/drawable-xhdpi/ic_scroll_down.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_scroll_down.png rename to app/src/main/res/drawable-xhdpi/ic_scroll_down.png diff --git a/session/src/main/res/drawable-xhdpi/ic_security_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_security_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_security_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_security_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_select_all_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_select_all_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_select_all_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_select_all_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_select_off.png b/app/src/main/res/drawable-xhdpi/ic_select_off.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_select_off.png rename to app/src/main/res/drawable-xhdpi/ic_select_off.png diff --git a/session/src/main/res/drawable-xhdpi/ic_select_on.png b/app/src/main/res/drawable-xhdpi/ic_select_on.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_select_on.png rename to app/src/main/res/drawable-xhdpi/ic_select_on.png diff --git a/session/src/main/res/drawable-xhdpi/ic_send_push.png b/app/src/main/res/drawable-xhdpi/ic_send_push.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_send_push.png rename to app/src/main/res/drawable-xhdpi/ic_send_push.png diff --git a/session/src/main/res/drawable-xhdpi/ic_send_push_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_send_push_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_send_push_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_send_push_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_send_sms_insecure.png b/app/src/main/res/drawable-xhdpi/ic_send_sms_insecure.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_send_sms_insecure.png rename to app/src/main/res/drawable-xhdpi/ic_send_sms_insecure.png diff --git a/session/src/main/res/drawable-xhdpi/ic_send_sms_insecure_dark.png b/app/src/main/res/drawable-xhdpi/ic_send_sms_insecure_dark.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_send_sms_insecure_dark.png rename to app/src/main/res/drawable-xhdpi/ic_send_sms_insecure_dark.png diff --git a/session/src/main/res/drawable-xhdpi/ic_send_sms_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_send_sms_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_send_sms_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_send_sms_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_share_black_18dp.png b/app/src/main/res/drawable-xhdpi/ic_share_black_18dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_share_black_18dp.png rename to app/src/main/res/drawable-xhdpi/ic_share_black_18dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_share_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_share_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_share_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_share_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_signal_background_connection.png b/app/src/main/res/drawable-xhdpi/ic_signal_background_connection.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_signal_background_connection.png rename to app/src/main/res/drawable-xhdpi/ic_signal_background_connection.png diff --git a/session/src/main/res/drawable-xhdpi/ic_signal_backup.png b/app/src/main/res/drawable-xhdpi/ic_signal_backup.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_signal_backup.png rename to app/src/main/res/drawable-xhdpi/ic_signal_backup.png diff --git a/session/src/main/res/drawable-xhdpi/ic_signal_downloading.png b/app/src/main/res/drawable-xhdpi/ic_signal_downloading.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_signal_downloading.png rename to app/src/main/res/drawable-xhdpi/ic_signal_downloading.png diff --git a/session/src/main/res/drawable-xhdpi/ic_switch_camera_32.png b/app/src/main/res/drawable-xhdpi/ic_switch_camera_32.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_switch_camera_32.png rename to app/src/main/res/drawable-xhdpi/ic_switch_camera_32.png diff --git a/session/src/main/res/drawable-xhdpi/ic_tag_faces_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_tag_faces_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_tag_faces_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_tag_faces_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_text_32.png b/app/src/main/res/drawable-xhdpi/ic_text_32.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_text_32.png rename to app/src/main/res/drawable-xhdpi/ic_text_32.png diff --git a/session/src/main/res/drawable-xhdpi/ic_textsms_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_textsms_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_textsms_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_textsms_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_textsms_white_48dp.png b/app/src/main/res/drawable-xhdpi/ic_textsms_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_textsms_white_48dp.png rename to app/src/main/res/drawable-xhdpi/ic_textsms_white_48dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_timer.png b/app/src/main/res/drawable-xhdpi/ic_timer.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_timer.png rename to app/src/main/res/drawable-xhdpi/ic_timer.png diff --git a/session/src/main/res/drawable-xhdpi/ic_timer_disabled.png b/app/src/main/res/drawable-xhdpi/ic_timer_disabled.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_timer_disabled.png rename to app/src/main/res/drawable-xhdpi/ic_timer_disabled.png diff --git a/session/src/main/res/drawable-xhdpi/ic_timer_off_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_timer_off_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_timer_off_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_timer_off_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_trash_filled_32.png b/app/src/main/res/drawable-xhdpi/ic_trash_filled_32.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_trash_filled_32.png rename to app/src/main/res/drawable-xhdpi/ic_trash_filled_32.png diff --git a/session/src/main/res/drawable-xhdpi/ic_unarchive_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_unarchive_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_unarchive_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_unarchive_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_unarchive_white_36dp.png b/app/src/main/res/drawable-xhdpi/ic_unarchive_white_36dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_unarchive_white_36dp.png rename to app/src/main/res/drawable-xhdpi/ic_unarchive_white_36dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_undo_32.png b/app/src/main/res/drawable-xhdpi/ic_undo_32.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_undo_32.png rename to app/src/main/res/drawable-xhdpi/ic_undo_32.png diff --git a/session/src/main/res/drawable-xhdpi/ic_unidentified_delivery.png b/app/src/main/res/drawable-xhdpi/ic_unidentified_delivery.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_unidentified_delivery.png rename to app/src/main/res/drawable-xhdpi/ic_unidentified_delivery.png diff --git a/session/src/main/res/drawable-xhdpi/ic_unlocked_white_18dp.png b/app/src/main/res/drawable-xhdpi/ic_unlocked_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_unlocked_white_18dp.png rename to app/src/main/res/drawable-xhdpi/ic_unlocked_white_18dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_unlocked_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_unlocked_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_unlocked_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_unlocked_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_video_dark.png b/app/src/main/res/drawable-xhdpi/ic_video_dark.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_video_dark.png rename to app/src/main/res/drawable-xhdpi/ic_video_dark.png diff --git a/session/src/main/res/drawable-xhdpi/ic_video_light.png b/app/src/main/res/drawable-xhdpi/ic_video_light.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_video_light.png rename to app/src/main/res/drawable-xhdpi/ic_video_light.png diff --git a/session/src/main/res/drawable-xhdpi/ic_videocam_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_videocam_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_videocam_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_videocam_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_videocam_white_48dp.png b/app/src/main/res/drawable-xhdpi/ic_videocam_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_videocam_white_48dp.png rename to app/src/main/res/drawable-xhdpi/ic_videocam_white_48dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_view_stream_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_view_stream_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_view_stream_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_view_stream_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_volume_off_grey600_18dp.png b/app/src/main/res/drawable-xhdpi/ic_volume_off_grey600_18dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_volume_off_grey600_18dp.png rename to app/src/main/res/drawable-xhdpi/ic_volume_off_grey600_18dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_volume_off_white_18dp.png b/app/src/main/res/drawable-xhdpi/ic_volume_off_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_volume_off_white_18dp.png rename to app/src/main/res/drawable-xhdpi/ic_volume_off_white_18dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_volume_up_dark.png b/app/src/main/res/drawable-xhdpi/ic_volume_up_dark.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_volume_up_dark.png rename to app/src/main/res/drawable-xhdpi/ic_volume_up_dark.png diff --git a/session/src/main/res/drawable-xhdpi/ic_volume_up_light.png b/app/src/main/res/drawable-xhdpi/ic_volume_up_light.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_volume_up_light.png rename to app/src/main/res/drawable-xhdpi/ic_volume_up_light.png diff --git a/session/src/main/res/drawable-xhdpi/ic_volume_up_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_volume_up_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_volume_up_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_volume_up_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_warning_dark.png b/app/src/main/res/drawable-xhdpi/ic_warning_dark.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_warning_dark.png rename to app/src/main/res/drawable-xhdpi/ic_warning_dark.png diff --git a/session/src/main/res/drawable-xhdpi/ic_warning_light.png b/app/src/main/res/drawable-xhdpi/ic_warning_light.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_warning_light.png rename to app/src/main/res/drawable-xhdpi/ic_warning_light.png diff --git a/session/src/main/res/drawable-xhdpi/ic_wb_sunny_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_wb_sunny_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_wb_sunny_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_wb_sunny_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_work_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_work_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_work_white_24dp.png rename to app/src/main/res/drawable-xhdpi/ic_work_white_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/ic_x_28.png b/app/src/main/res/drawable-xhdpi/ic_x_28.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_x_28.png rename to app/src/main/res/drawable-xhdpi/ic_x_28.png diff --git a/session/src/main/res/drawable-xhdpi/ic_x_circle.png b/app/src/main/res/drawable-xhdpi/ic_x_circle.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/ic_x_circle.png rename to app/src/main/res/drawable-xhdpi/ic_x_circle.png diff --git a/session/src/main/res/drawable-xhdpi/icon_cached.png b/app/src/main/res/drawable-xhdpi/icon_cached.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/icon_cached.png rename to app/src/main/res/drawable-xhdpi/icon_cached.png diff --git a/session/src/main/res/drawable-xhdpi/icon_dialog.png b/app/src/main/res/drawable-xhdpi/icon_dialog.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/icon_dialog.png rename to app/src/main/res/drawable-xhdpi/icon_dialog.png diff --git a/session/src/main/res/drawable-xhdpi/icon_lock.png b/app/src/main/res/drawable-xhdpi/icon_lock.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/icon_lock.png rename to app/src/main/res/drawable-xhdpi/icon_lock.png diff --git a/session/src/main/res/drawable-xhdpi/icon_transparent.png b/app/src/main/res/drawable-xhdpi/icon_transparent.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/icon_transparent.png rename to app/src/main/res/drawable-xhdpi/icon_transparent.png diff --git a/session/src/main/res/drawable-xhdpi/import_database.png b/app/src/main/res/drawable-xhdpi/import_database.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/import_database.png rename to app/src/main/res/drawable-xhdpi/import_database.png diff --git a/session/src/main/res/drawable-xhdpi/inbox_zero.png b/app/src/main/res/drawable-xhdpi/inbox_zero.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/inbox_zero.png rename to app/src/main/res/drawable-xhdpi/inbox_zero.png diff --git a/session/src/main/res/drawable-xhdpi/link_preview_splash.png b/app/src/main/res/drawable-xhdpi/link_preview_splash.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/link_preview_splash.png rename to app/src/main/res/drawable-xhdpi/link_preview_splash.png diff --git a/session/src/main/res/drawable-xhdpi/lockscreen_watermark_dark.png b/app/src/main/res/drawable-xhdpi/lockscreen_watermark_dark.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/lockscreen_watermark_dark.png rename to app/src/main/res/drawable-xhdpi/lockscreen_watermark_dark.png diff --git a/session/src/main/res/drawable-xhdpi/lockscreen_watermark_light.png b/app/src/main/res/drawable-xhdpi/lockscreen_watermark_light.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/lockscreen_watermark_light.png rename to app/src/main/res/drawable-xhdpi/lockscreen_watermark_light.png diff --git a/session/src/main/res/drawable-xhdpi/love_heart.png b/app/src/main/res/drawable-xhdpi/love_heart.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/love_heart.png rename to app/src/main/res/drawable-xhdpi/love_heart.png diff --git a/session/src/main/res/drawable-xhdpi/message_24dp.png b/app/src/main/res/drawable-xhdpi/message_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/message_24dp.png rename to app/src/main/res/drawable-xhdpi/message_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/no_contacts.png b/app/src/main/res/drawable-xhdpi/no_contacts.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/no_contacts.png rename to app/src/main/res/drawable-xhdpi/no_contacts.png diff --git a/session/src/main/res/drawable-xhdpi/notify_panel_notification_icon_bg.png b/app/src/main/res/drawable-xhdpi/notify_panel_notification_icon_bg.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/notify_panel_notification_icon_bg.png rename to app/src/main/res/drawable-xhdpi/notify_panel_notification_icon_bg.png diff --git a/session/src/main/res/drawable-xhdpi/phone_24dp.png b/app/src/main/res/drawable-xhdpi/phone_24dp.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/phone_24dp.png rename to app/src/main/res/drawable-xhdpi/phone_24dp.png diff --git a/session/src/main/res/drawable-xhdpi/poweredby_giphy.png b/app/src/main/res/drawable-xhdpi/poweredby_giphy.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/poweredby_giphy.png rename to app/src/main/res/drawable-xhdpi/poweredby_giphy.png diff --git a/session/src/main/res/drawable-xhdpi/profile_splash.png b/app/src/main/res/drawable-xhdpi/profile_splash.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/profile_splash.png rename to app/src/main/res/drawable-xhdpi/profile_splash.png diff --git a/session/src/main/res/drawable-xhdpi/quick_camera_dark.png b/app/src/main/res/drawable-xhdpi/quick_camera_dark.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/quick_camera_dark.png rename to app/src/main/res/drawable-xhdpi/quick_camera_dark.png diff --git a/session/src/main/res/drawable-xhdpi/quick_camera_exit_fullscreen.png b/app/src/main/res/drawable-xhdpi/quick_camera_exit_fullscreen.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/quick_camera_exit_fullscreen.png rename to app/src/main/res/drawable-xhdpi/quick_camera_exit_fullscreen.png diff --git a/session/src/main/res/drawable-xhdpi/quick_camera_front.png b/app/src/main/res/drawable-xhdpi/quick_camera_front.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/quick_camera_front.png rename to app/src/main/res/drawable-xhdpi/quick_camera_front.png diff --git a/session/src/main/res/drawable-xhdpi/quick_camera_fullscreen.png b/app/src/main/res/drawable-xhdpi/quick_camera_fullscreen.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/quick_camera_fullscreen.png rename to app/src/main/res/drawable-xhdpi/quick_camera_fullscreen.png diff --git a/session/src/main/res/drawable-xhdpi/quick_camera_hide.png b/app/src/main/res/drawable-xhdpi/quick_camera_hide.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/quick_camera_hide.png rename to app/src/main/res/drawable-xhdpi/quick_camera_hide.png diff --git a/session/src/main/res/drawable-xhdpi/quick_camera_light.png b/app/src/main/res/drawable-xhdpi/quick_camera_light.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/quick_camera_light.png rename to app/src/main/res/drawable-xhdpi/quick_camera_light.png diff --git a/session/src/main/res/drawable-xhdpi/quick_camera_rear.png b/app/src/main/res/drawable-xhdpi/quick_camera_rear.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/quick_camera_rear.png rename to app/src/main/res/drawable-xhdpi/quick_camera_rear.png diff --git a/session/src/main/res/drawable-xhdpi/quick_shutter_button.png b/app/src/main/res/drawable-xhdpi/quick_shutter_button.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/quick_shutter_button.png rename to app/src/main/res/drawable-xhdpi/quick_shutter_button.png diff --git a/session/src/main/res/drawable-xhdpi/timer00.png b/app/src/main/res/drawable-xhdpi/timer00.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/timer00.png rename to app/src/main/res/drawable-xhdpi/timer00.png diff --git a/session/src/main/res/drawable-xhdpi/timer05.png b/app/src/main/res/drawable-xhdpi/timer05.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/timer05.png rename to app/src/main/res/drawable-xhdpi/timer05.png diff --git a/session/src/main/res/drawable-xhdpi/timer10.png b/app/src/main/res/drawable-xhdpi/timer10.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/timer10.png rename to app/src/main/res/drawable-xhdpi/timer10.png diff --git a/session/src/main/res/drawable-xhdpi/timer15.png b/app/src/main/res/drawable-xhdpi/timer15.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/timer15.png rename to app/src/main/res/drawable-xhdpi/timer15.png diff --git a/session/src/main/res/drawable-xhdpi/timer20.png b/app/src/main/res/drawable-xhdpi/timer20.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/timer20.png rename to app/src/main/res/drawable-xhdpi/timer20.png diff --git a/session/src/main/res/drawable-xhdpi/timer25.png b/app/src/main/res/drawable-xhdpi/timer25.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/timer25.png rename to app/src/main/res/drawable-xhdpi/timer25.png diff --git a/session/src/main/res/drawable-xhdpi/timer30.png b/app/src/main/res/drawable-xhdpi/timer30.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/timer30.png rename to app/src/main/res/drawable-xhdpi/timer30.png diff --git a/session/src/main/res/drawable-xhdpi/timer35.png b/app/src/main/res/drawable-xhdpi/timer35.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/timer35.png rename to app/src/main/res/drawable-xhdpi/timer35.png diff --git a/session/src/main/res/drawable-xhdpi/timer40.png b/app/src/main/res/drawable-xhdpi/timer40.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/timer40.png rename to app/src/main/res/drawable-xhdpi/timer40.png diff --git a/session/src/main/res/drawable-xhdpi/timer45.png b/app/src/main/res/drawable-xhdpi/timer45.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/timer45.png rename to app/src/main/res/drawable-xhdpi/timer45.png diff --git a/session/src/main/res/drawable-xhdpi/timer50.png b/app/src/main/res/drawable-xhdpi/timer50.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/timer50.png rename to app/src/main/res/drawable-xhdpi/timer50.png diff --git a/session/src/main/res/drawable-xhdpi/timer55.png b/app/src/main/res/drawable-xhdpi/timer55.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/timer55.png rename to app/src/main/res/drawable-xhdpi/timer55.png diff --git a/session/src/main/res/drawable-xhdpi/timer60.png b/app/src/main/res/drawable-xhdpi/timer60.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/timer60.png rename to app/src/main/res/drawable-xhdpi/timer60.png diff --git a/session/src/main/res/drawable-xhdpi/video_splash.png b/app/src/main/res/drawable-xhdpi/video_splash.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/video_splash.png rename to app/src/main/res/drawable-xhdpi/video_splash.png diff --git a/session/src/main/res/drawable-xhdpi/welcome.png b/app/src/main/res/drawable-xhdpi/welcome.png similarity index 100% rename from session/src/main/res/drawable-xhdpi/welcome.png rename to app/src/main/res/drawable-xhdpi/welcome.png diff --git a/session/src/main/res/drawable-xxhdpi/baseline_account_circle_white_24.png b/app/src/main/res/drawable-xxhdpi/baseline_account_circle_white_24.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/baseline_account_circle_white_24.png rename to app/src/main/res/drawable-xxhdpi/baseline_account_circle_white_24.png diff --git a/session/src/main/res/drawable-xxhdpi/baseline_email_white_24.png b/app/src/main/res/drawable-xxhdpi/baseline_email_white_24.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/baseline_email_white_24.png rename to app/src/main/res/drawable-xxhdpi/baseline_email_white_24.png diff --git a/session/src/main/res/drawable-xxhdpi/check.png b/app/src/main/res/drawable-xxhdpi/check.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/check.png rename to app/src/main/res/drawable-xxhdpi/check.png diff --git a/session/src/main/res/drawable-xxhdpi/clear_profile_avatar.png b/app/src/main/res/drawable-xxhdpi/clear_profile_avatar.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/clear_profile_avatar.png rename to app/src/main/res/drawable-xxhdpi/clear_profile_avatar.png diff --git a/session/src/main/res/drawable-xxhdpi/conversation_list_empty_state.png b/app/src/main/res/drawable-xxhdpi/conversation_list_empty_state.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/conversation_list_empty_state.png rename to app/src/main/res/drawable-xxhdpi/conversation_list_empty_state.png diff --git a/session/src/main/res/drawable-xxhdpi/divet_lower_right_dark.png b/app/src/main/res/drawable-xxhdpi/divet_lower_right_dark.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/divet_lower_right_dark.png rename to app/src/main/res/drawable-xxhdpi/divet_lower_right_dark.png diff --git a/session/src/main/res/drawable-xxhdpi/divet_lower_right_light.png b/app/src/main/res/drawable-xxhdpi/divet_lower_right_light.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/divet_lower_right_light.png rename to app/src/main/res/drawable-xxhdpi/divet_lower_right_light.png diff --git a/session/src/main/res/drawable-xxhdpi/empty_inbox_1.png b/app/src/main/res/drawable-xxhdpi/empty_inbox_1.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/empty_inbox_1.png rename to app/src/main/res/drawable-xxhdpi/empty_inbox_1.png diff --git a/session/src/main/res/drawable-xxhdpi/empty_inbox_2.png b/app/src/main/res/drawable-xxhdpi/empty_inbox_2.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/empty_inbox_2.png rename to app/src/main/res/drawable-xxhdpi/empty_inbox_2.png diff --git a/session/src/main/res/drawable-xxhdpi/empty_inbox_3.png b/app/src/main/res/drawable-xxhdpi/empty_inbox_3.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/empty_inbox_3.png rename to app/src/main/res/drawable-xxhdpi/empty_inbox_3.png diff --git a/session/src/main/res/drawable-xxhdpi/empty_inbox_4.png b/app/src/main/res/drawable-xxhdpi/empty_inbox_4.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/empty_inbox_4.png rename to app/src/main/res/drawable-xxhdpi/empty_inbox_4.png diff --git a/session/src/main/res/drawable-xxhdpi/empty_inbox_5.png b/app/src/main/res/drawable-xxhdpi/empty_inbox_5.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/empty_inbox_5.png rename to app/src/main/res/drawable-xxhdpi/empty_inbox_5.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_account_box_dark.png b/app/src/main/res/drawable-xxhdpi/ic_account_box_dark.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_account_box_dark.png rename to app/src/main/res/drawable-xxhdpi/ic_account_box_dark.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_account_box_light.png b/app/src/main/res/drawable-xxhdpi/ic_account_box_light.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_account_box_light.png rename to app/src/main/res/drawable-xxhdpi/ic_account_box_light.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_action_name.png b/app/src/main/res/drawable-xxhdpi/ic_action_name.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_action_name.png rename to app/src/main/res/drawable-xxhdpi/ic_action_name.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_action_warning_red.png b/app/src/main/res/drawable-xxhdpi/ic_action_warning_red.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_action_warning_red.png rename to app/src/main/res/drawable-xxhdpi/ic_action_warning_red.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_add_caption_36.png b/app/src/main/res/drawable-xxhdpi/ic_add_caption_36.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_add_caption_36.png rename to app/src/main/res/drawable-xxhdpi/ic_add_caption_36.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_add_photo.png b/app/src/main/res/drawable-xxhdpi/ic_add_photo.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_add_photo.png rename to app/src/main/res/drawable-xxhdpi/ic_add_photo.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_add_white_original_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_add_white_original_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_add_white_original_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_add_white_original_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_advanced_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_advanced_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_advanced_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_advanced_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_archive_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_archive_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_archive_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_archive_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_arrow_back_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_arrow_back_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_arrow_back_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_arrow_back_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_arrow_right.png b/app/src/main/res/drawable-xxhdpi/ic_arrow_right.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_arrow_right.png rename to app/src/main/res/drawable-xxhdpi/ic_arrow_right.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_arrow_up.png b/app/src/main/res/drawable-xxhdpi/ic_arrow_up.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_arrow_up.png rename to app/src/main/res/drawable-xxhdpi/ic_arrow_up.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_attach_grey600_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_attach_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_attach_grey600_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_attach_grey600_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_attach_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_attach_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_attach_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_attach_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_audio_dark.png b/app/src/main/res/drawable-xxhdpi/ic_audio_dark.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_audio_dark.png rename to app/src/main/res/drawable-xxhdpi/ic_audio_dark.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_audio_light.png b/app/src/main/res/drawable-xxhdpi/ic_audio_light.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_audio_light.png rename to app/src/main/res/drawable-xxhdpi/ic_audio_light.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_backspace_grey600_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_backspace_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_backspace_grey600_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_backspace_grey600_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_block_grey600_18dp.png b/app/src/main/res/drawable-xxhdpi/ic_block_grey600_18dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_block_grey600_18dp.png rename to app/src/main/res/drawable-xxhdpi/ic_block_grey600_18dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_block_white_18dp.png b/app/src/main/res/drawable-xxhdpi/ic_block_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_block_white_18dp.png rename to app/src/main/res/drawable-xxhdpi/ic_block_white_18dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_block_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_block_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_block_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_block_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_bluetooth_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_bluetooth_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_bluetooth_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_bluetooth_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_brightness_6_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_brightness_6_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_brightness_6_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_brightness_6_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_broken_link.png b/app/src/main/res/drawable-xxhdpi/ic_broken_link.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_broken_link.png rename to app/src/main/res/drawable-xxhdpi/ic_broken_link.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_brush_highlight_32.png b/app/src/main/res/drawable-xxhdpi/ic_brush_highlight_32.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_brush_highlight_32.png rename to app/src/main/res/drawable-xxhdpi/ic_brush_highlight_32.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_brush_marker_32.png b/app/src/main/res/drawable-xxhdpi/ic_brush_marker_32.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_brush_marker_32.png rename to app/src/main/res/drawable-xxhdpi/ic_brush_marker_32.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_call_end_grey600_32dp.png b/app/src/main/res/drawable-xxhdpi/ic_call_end_grey600_32dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_call_end_grey600_32dp.png rename to app/src/main/res/drawable-xxhdpi/ic_call_end_grey600_32dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_call_end_white_48dp.png b/app/src/main/res/drawable-xxhdpi/ic_call_end_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_call_end_white_48dp.png rename to app/src/main/res/drawable-xxhdpi/ic_call_end_white_48dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_call_made_grey600_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_call_made_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_call_made_grey600_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_call_made_grey600_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_call_missed_grey600_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_call_missed_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_call_missed_grey600_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_call_missed_grey600_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_call_received_grey600_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_call_received_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_call_received_grey600_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_call_received_grey600_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_call_secure_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_call_secure_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_call_secure_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_call_secure_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_call_split_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_call_split_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_call_split_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_call_split_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_call_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_call_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_call_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_call_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_camera_alt_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_camera_alt_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_camera_alt_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_camera_alt_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_camera_filled_24.png b/app/src/main/res/drawable-xxhdpi/ic_camera_filled_24.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_camera_filled_24.png rename to app/src/main/res/drawable-xxhdpi/ic_camera_filled_24.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_camera_shutter.png b/app/src/main/res/drawable-xxhdpi/ic_camera_shutter.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_camera_shutter.png rename to app/src/main/res/drawable-xxhdpi/ic_camera_shutter.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_camera_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_camera_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_camera_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_camera_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_caption_28.png b/app/src/main/res/drawable-xxhdpi/ic_caption_28.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_caption_28.png rename to app/src/main/res/drawable-xxhdpi/ic_caption_28.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_check_circle_32.png b/app/src/main/res/drawable-xxhdpi/ic_check_circle_32.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_check_circle_32.png rename to app/src/main/res/drawable-xxhdpi/ic_check_circle_32.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_check_circle_white_18dp.png b/app/src/main/res/drawable-xxhdpi/ic_check_circle_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_check_circle_white_18dp.png rename to app/src/main/res/drawable-xxhdpi/ic_check_circle_white_18dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_check_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_check_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_check_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_check_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_check_white_48dp.png b/app/src/main/res/drawable-xxhdpi/ic_check_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_check_white_48dp.png rename to app/src/main/res/drawable-xxhdpi/ic_check_white_48dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_circle_fill_white_48dp.png b/app/src/main/res/drawable-xxhdpi/ic_circle_fill_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_circle_fill_white_48dp.png rename to app/src/main/res/drawable-xxhdpi/ic_circle_fill_white_48dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_clear_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_clear_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_clear_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_clear_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_close_grey600_32dp.png b/app/src/main/res/drawable-xxhdpi/ic_close_grey600_32dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_close_grey600_32dp.png rename to app/src/main/res/drawable-xxhdpi/ic_close_grey600_32dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_close_white_18dp.png b/app/src/main/res/drawable-xxhdpi/ic_close_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_close_white_18dp.png rename to app/src/main/res/drawable-xxhdpi/ic_close_white_18dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_close_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_close_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_close_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_close_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_close_white_48dp.png b/app/src/main/res/drawable-xxhdpi/ic_close_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_close_white_48dp.png rename to app/src/main/res/drawable-xxhdpi/ic_close_white_48dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_contact_picture.png b/app/src/main/res/drawable-xxhdpi/ic_contact_picture.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_contact_picture.png rename to app/src/main/res/drawable-xxhdpi/ic_contact_picture.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_contact_picture_large.png b/app/src/main/res/drawable-xxhdpi/ic_contact_picture_large.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_contact_picture_large.png rename to app/src/main/res/drawable-xxhdpi/ic_contact_picture_large.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_contacts_white_48dp.png b/app/src/main/res/drawable-xxhdpi/ic_contacts_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_contacts_white_48dp.png rename to app/src/main/res/drawable-xxhdpi/ic_contacts_white_48dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_content_copy_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_content_copy_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_content_copy_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_content_copy_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_create_album_filled_32.png b/app/src/main/res/drawable-xxhdpi/ic_create_album_filled_32.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_create_album_filled_32.png rename to app/src/main/res/drawable-xxhdpi/ic_create_album_filled_32.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_create_album_outline_32.png b/app/src/main/res/drawable-xxhdpi/ic_create_album_outline_32.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_create_album_outline_32.png rename to app/src/main/res/drawable-xxhdpi/ic_create_album_outline_32.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_create_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_create_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_create_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_create_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_crop_32.png b/app/src/main/res/drawable-xxhdpi/ic_crop_32.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_crop_32.png rename to app/src/main/res/drawable-xxhdpi/ic_crop_32.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_crop_lock_32.png b/app/src/main/res/drawable-xxhdpi/ic_crop_lock_32.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_crop_lock_32.png rename to app/src/main/res/drawable-xxhdpi/ic_crop_lock_32.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_crop_unlock_32.png b/app/src/main/res/drawable-xxhdpi/ic_crop_unlock_32.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_crop_unlock_32.png rename to app/src/main/res/drawable-xxhdpi/ic_crop_unlock_32.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_dashboard_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_dashboard_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_dashboard_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_dashboard_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_delivery_status_delivered.png b/app/src/main/res/drawable-xxhdpi/ic_delivery_status_delivered.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_delivery_status_delivered.png rename to app/src/main/res/drawable-xxhdpi/ic_delivery_status_delivered.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_delivery_status_read.png b/app/src/main/res/drawable-xxhdpi/ic_delivery_status_read.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_delivery_status_read.png rename to app/src/main/res/drawable-xxhdpi/ic_delivery_status_read.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_delivery_status_sending.png b/app/src/main/res/drawable-xxhdpi/ic_delivery_status_sending.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_delivery_status_sending.png rename to app/src/main/res/drawable-xxhdpi/ic_delivery_status_sending.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_delivery_status_sent.png b/app/src/main/res/drawable-xxhdpi/ic_delivery_status_sent.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_delivery_status_sent.png rename to app/src/main/res/drawable-xxhdpi/ic_delivery_status_sent.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_devices_white.png b/app/src/main/res/drawable-xxhdpi/ic_devices_white.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_devices_white.png rename to app/src/main/res/drawable-xxhdpi/ic_devices_white.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_dialpad_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_dialpad_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_dialpad_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_dialpad_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_document_large_dark.png b/app/src/main/res/drawable-xxhdpi/ic_document_large_dark.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_document_large_dark.png rename to app/src/main/res/drawable-xxhdpi/ic_document_large_dark.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_document_large_light.png b/app/src/main/res/drawable-xxhdpi/ic_document_large_light.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_document_large_light.png rename to app/src/main/res/drawable-xxhdpi/ic_document_large_light.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_document_small_dark.png b/app/src/main/res/drawable-xxhdpi/ic_document_small_dark.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_document_small_dark.png rename to app/src/main/res/drawable-xxhdpi/ic_document_small_dark.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_document_small_light.png b/app/src/main/res/drawable-xxhdpi/ic_document_small_light.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_document_small_light.png rename to app/src/main/res/drawable-xxhdpi/ic_document_small_light.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_download_circle_fill_white_48dp.png b/app/src/main/res/drawable-xxhdpi/ic_download_circle_fill_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_download_circle_fill_white_48dp.png rename to app/src/main/res/drawable-xxhdpi/ic_download_circle_fill_white_48dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_emoji_32.png b/app/src/main/res/drawable-xxhdpi/ic_emoji_32.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_emoji_32.png rename to app/src/main/res/drawable-xxhdpi/ic_emoji_32.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_error.png b/app/src/main/res/drawable-xxhdpi/ic_error.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_error.png rename to app/src/main/res/drawable-xxhdpi/ic_error.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_error_white_18dp.png b/app/src/main/res/drawable-xxhdpi/ic_error_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_error_white_18dp.png rename to app/src/main/res/drawable-xxhdpi/ic_error_white_18dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_face_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_face_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_face_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_face_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_favorite_grey600_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_favorite_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_favorite_grey600_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_favorite_grey600_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_file_download_white_36dp.png b/app/src/main/res/drawable-xxhdpi/ic_file_download_white_36dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_file_download_white_36dp.png rename to app/src/main/res/drawable-xxhdpi/ic_file_download_white_36dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_fingerprint_white_48dp.png b/app/src/main/res/drawable-xxhdpi/ic_fingerprint_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_fingerprint_white_48dp.png rename to app/src/main/res/drawable-xxhdpi/ic_fingerprint_white_48dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_flip_32.png b/app/src/main/res/drawable-xxhdpi/ic_flip_32.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_flip_32.png rename to app/src/main/res/drawable-xxhdpi/ic_flip_32.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_forum_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_forum_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_forum_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_forum_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_gif_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_gif_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_gif_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_gif_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_group_grey600_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_group_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_group_grey600_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_group_grey600_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_group_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_group_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_group_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_group_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_headset_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_headset_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_headset_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_headset_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_image_dark.png b/app/src/main/res/drawable-xxhdpi/ic_image_dark.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_image_dark.png rename to app/src/main/res/drawable-xxhdpi/ic_image_dark.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_image_light.png b/app/src/main/res/drawable-xxhdpi/ic_image_light.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_image_light.png rename to app/src/main/res/drawable-xxhdpi/ic_image_light.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_image_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_image_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_image_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_image_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_info_outline_dark.png b/app/src/main/res/drawable-xxhdpi/ic_info_outline_dark.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_info_outline_dark.png rename to app/src/main/res/drawable-xxhdpi/ic_info_outline_dark.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_info_outline_light.png b/app/src/main/res/drawable-xxhdpi/ic_info_outline_light.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_info_outline_light.png rename to app/src/main/res/drawable-xxhdpi/ic_info_outline_light.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_info_outline_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_info_outline_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_info_outline_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_info_outline_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_info_white_18dp.png b/app/src/main/res/drawable-xxhdpi/ic_info_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_info_white_18dp.png rename to app/src/main/res/drawable-xxhdpi/ic_info_white_18dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_insert_drive_file_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_insert_drive_file_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_insert_drive_file_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_insert_drive_file_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_keyboard_arrow_left_grey600_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_keyboard_arrow_left_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_keyboard_arrow_left_grey600_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_keyboard_arrow_left_grey600_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_keyboard_grey600_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_keyboard_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_keyboard_grey600_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_keyboard_grey600_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_keyboard_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_keyboard_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_keyboard_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_keyboard_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_laptop_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_laptop_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_laptop_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_laptop_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_launch_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_launch_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_launch_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_launch_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_local_dining_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_local_dining_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_local_dining_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_local_dining_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_location_on_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_location_on_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_location_on_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_location_on_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_lock_white_18dp.png b/app/src/main/res/drawable-xxhdpi/ic_lock_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_lock_white_18dp.png rename to app/src/main/res/drawable-xxhdpi/ic_lock_white_18dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_lock_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_lock_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_lock_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_lock_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_lock_white_48dp.png b/app/src/main/res/drawable-xxhdpi/ic_lock_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_lock_white_48dp.png rename to app/src/main/res/drawable-xxhdpi/ic_lock_white_48dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_menu_lock_dark.png b/app/src/main/res/drawable-xxhdpi/ic_menu_lock_dark.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_menu_lock_dark.png rename to app/src/main/res/drawable-xxhdpi/ic_menu_lock_dark.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_menu_remove_holo_light.png b/app/src/main/res/drawable-xxhdpi/ic_menu_remove_holo_light.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_menu_remove_holo_light.png rename to app/src/main/res/drawable-xxhdpi/ic_menu_remove_holo_light.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_menu_search_holo_light.png b/app/src/main/res/drawable-xxhdpi/ic_menu_search_holo_light.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_menu_search_holo_light.png rename to app/src/main/res/drawable-xxhdpi/ic_menu_search_holo_light.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_message_black_18dp.png b/app/src/main/res/drawable-xxhdpi/ic_message_black_18dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_message_black_18dp.png rename to app/src/main/res/drawable-xxhdpi/ic_message_black_18dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_message_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_message_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_message_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_message_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_mic_grey600_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_mic_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_mic_grey600_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_mic_grey600_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_mic_off_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_mic_off_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_mic_off_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_mic_off_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_mic_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_mic_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_mic_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_mic_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_mic_white_48dp.png b/app/src/main/res/drawable-xxhdpi/ic_mic_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_mic_white_48dp.png rename to app/src/main/res/drawable-xxhdpi/ic_mic_white_48dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_missing_thumbnail_picture.png b/app/src/main/res/drawable-xxhdpi/ic_missing_thumbnail_picture.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_missing_thumbnail_picture.png rename to app/src/main/res/drawable-xxhdpi/ic_missing_thumbnail_picture.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_mood_grey600_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_mood_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_mood_grey600_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_mood_grey600_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_mood_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_mood_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_mood_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_mood_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_movie_creation_dark.png b/app/src/main/res/drawable-xxhdpi/ic_movie_creation_dark.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_movie_creation_dark.png rename to app/src/main/res/drawable-xxhdpi/ic_movie_creation_dark.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_movie_creation_light.png b/app/src/main/res/drawable-xxhdpi/ic_movie_creation_light.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_movie_creation_light.png rename to app/src/main/res/drawable-xxhdpi/ic_movie_creation_light.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_note_to_self.png b/app/src/main/res/drawable-xxhdpi/ic_note_to_self.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_note_to_self.png rename to app/src/main/res/drawable-xxhdpi/ic_note_to_self.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_notification.png b/app/src/main/res/drawable-xxhdpi/ic_notification.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_notification.png rename to app/src/main/res/drawable-xxhdpi/ic_notification.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_notifications_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_notifications_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_notifications_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_notifications_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_pause_circle_fill_white_48dp.png b/app/src/main/res/drawable-xxhdpi/ic_pause_circle_fill_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_pause_circle_fill_white_48dp.png rename to app/src/main/res/drawable-xxhdpi/ic_pause_circle_fill_white_48dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_person_add_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_person_add_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_person_add_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_person_add_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_person_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_person_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_person_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_person_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_pets_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_pets_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_pets_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_pets_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_phone_grey600_32dp.png b/app/src/main/res/drawable-xxhdpi/ic_phone_grey600_32dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_phone_grey600_32dp.png rename to app/src/main/res/drawable-xxhdpi/ic_phone_grey600_32dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_photo_camera_dark.png b/app/src/main/res/drawable-xxhdpi/ic_photo_camera_dark.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_photo_camera_dark.png rename to app/src/main/res/drawable-xxhdpi/ic_photo_camera_dark.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_photo_camera_light.png b/app/src/main/res/drawable-xxhdpi/ic_photo_camera_light.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_photo_camera_light.png rename to app/src/main/res/drawable-xxhdpi/ic_photo_camera_light.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_photo_camera_white_48dp.png b/app/src/main/res/drawable-xxhdpi/ic_photo_camera_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_photo_camera_white_48dp.png rename to app/src/main/res/drawable-xxhdpi/ic_photo_camera_white_48dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_photo_library_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_photo_library_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_photo_library_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_photo_library_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_play_circle_fill_white_48dp.png b/app/src/main/res/drawable-xxhdpi/ic_play_circle_fill_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_play_circle_fill_white_48dp.png rename to app/src/main/res/drawable-xxhdpi/ic_play_circle_fill_white_48dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_plus_28.png b/app/src/main/res/drawable-xxhdpi/ic_plus_28.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_plus_28.png rename to app/src/main/res/drawable-xxhdpi/ic_plus_28.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_profile_camera.png b/app/src/main/res/drawable-xxhdpi/ic_profile_camera.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_profile_camera.png rename to app/src/main/res/drawable-xxhdpi/ic_profile_camera.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_profile_default.png b/app/src/main/res/drawable-xxhdpi/ic_profile_default.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_profile_default.png rename to app/src/main/res/drawable-xxhdpi/ic_profile_default.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_refresh_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_refresh_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_refresh_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_refresh_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_reply.png b/app/src/main/res/drawable-xxhdpi/ic_reply.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_reply.png rename to app/src/main/res/drawable-xxhdpi/ic_reply.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_reply_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_reply_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_reply_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_reply_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_reply_white_36dp.png b/app/src/main/res/drawable-xxhdpi/ic_reply_white_36dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_reply_white_36dp.png rename to app/src/main/res/drawable-xxhdpi/ic_reply_white_36dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_restore_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_restore_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_restore_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_restore_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_rotate_32.png b/app/src/main/res/drawable-xxhdpi/ic_rotate_32.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_rotate_32.png rename to app/src/main/res/drawable-xxhdpi/ic_rotate_32.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_scribble_save.png b/app/src/main/res/drawable-xxhdpi/ic_scribble_save.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_scribble_save.png rename to app/src/main/res/drawable-xxhdpi/ic_scribble_save.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_scroll_down.png b/app/src/main/res/drawable-xxhdpi/ic_scroll_down.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_scroll_down.png rename to app/src/main/res/drawable-xxhdpi/ic_scroll_down.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_search_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_search_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_search_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_search_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_security_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_security_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_security_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_security_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_select_all_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_select_all_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_select_all_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_select_all_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_select_off.png b/app/src/main/res/drawable-xxhdpi/ic_select_off.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_select_off.png rename to app/src/main/res/drawable-xxhdpi/ic_select_off.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_select_on.png b/app/src/main/res/drawable-xxhdpi/ic_select_on.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_select_on.png rename to app/src/main/res/drawable-xxhdpi/ic_select_on.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_send_push.png b/app/src/main/res/drawable-xxhdpi/ic_send_push.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_send_push.png rename to app/src/main/res/drawable-xxhdpi/ic_send_push.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_send_push_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_send_push_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_send_push_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_send_push_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_send_sms_insecure.png b/app/src/main/res/drawable-xxhdpi/ic_send_sms_insecure.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_send_sms_insecure.png rename to app/src/main/res/drawable-xxhdpi/ic_send_sms_insecure.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_send_sms_insecure_dark.png b/app/src/main/res/drawable-xxhdpi/ic_send_sms_insecure_dark.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_send_sms_insecure_dark.png rename to app/src/main/res/drawable-xxhdpi/ic_send_sms_insecure_dark.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_send_sms_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_send_sms_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_send_sms_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_send_sms_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_share_black_18dp.png b/app/src/main/res/drawable-xxhdpi/ic_share_black_18dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_share_black_18dp.png rename to app/src/main/res/drawable-xxhdpi/ic_share_black_18dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_signal_background_connection.png b/app/src/main/res/drawable-xxhdpi/ic_signal_background_connection.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_signal_background_connection.png rename to app/src/main/res/drawable-xxhdpi/ic_signal_background_connection.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_signal_backup.png b/app/src/main/res/drawable-xxhdpi/ic_signal_backup.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_signal_backup.png rename to app/src/main/res/drawable-xxhdpi/ic_signal_backup.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_signal_downloading.png b/app/src/main/res/drawable-xxhdpi/ic_signal_downloading.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_signal_downloading.png rename to app/src/main/res/drawable-xxhdpi/ic_signal_downloading.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_switch_camera_32.png b/app/src/main/res/drawable-xxhdpi/ic_switch_camera_32.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_switch_camera_32.png rename to app/src/main/res/drawable-xxhdpi/ic_switch_camera_32.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_tag_faces_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_tag_faces_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_tag_faces_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_tag_faces_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_text_32.png b/app/src/main/res/drawable-xxhdpi/ic_text_32.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_text_32.png rename to app/src/main/res/drawable-xxhdpi/ic_text_32.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_textsms_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_textsms_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_textsms_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_textsms_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_textsms_white_48dp.png b/app/src/main/res/drawable-xxhdpi/ic_textsms_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_textsms_white_48dp.png rename to app/src/main/res/drawable-xxhdpi/ic_textsms_white_48dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_timer.png b/app/src/main/res/drawable-xxhdpi/ic_timer.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_timer.png rename to app/src/main/res/drawable-xxhdpi/ic_timer.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_timer_disabled.png b/app/src/main/res/drawable-xxhdpi/ic_timer_disabled.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_timer_disabled.png rename to app/src/main/res/drawable-xxhdpi/ic_timer_disabled.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_timer_off_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_timer_off_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_timer_off_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_timer_off_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_trash_filled_32.png b/app/src/main/res/drawable-xxhdpi/ic_trash_filled_32.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_trash_filled_32.png rename to app/src/main/res/drawable-xxhdpi/ic_trash_filled_32.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_unarchive_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_unarchive_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_unarchive_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_unarchive_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_unarchive_white_36dp.png b/app/src/main/res/drawable-xxhdpi/ic_unarchive_white_36dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_unarchive_white_36dp.png rename to app/src/main/res/drawable-xxhdpi/ic_unarchive_white_36dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_undo_32.png b/app/src/main/res/drawable-xxhdpi/ic_undo_32.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_undo_32.png rename to app/src/main/res/drawable-xxhdpi/ic_undo_32.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_unidentified_delivery.png b/app/src/main/res/drawable-xxhdpi/ic_unidentified_delivery.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_unidentified_delivery.png rename to app/src/main/res/drawable-xxhdpi/ic_unidentified_delivery.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_unlocked_white_18dp.png b/app/src/main/res/drawable-xxhdpi/ic_unlocked_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_unlocked_white_18dp.png rename to app/src/main/res/drawable-xxhdpi/ic_unlocked_white_18dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_unlocked_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_unlocked_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_unlocked_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_unlocked_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_video_dark.png b/app/src/main/res/drawable-xxhdpi/ic_video_dark.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_video_dark.png rename to app/src/main/res/drawable-xxhdpi/ic_video_dark.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_video_light.png b/app/src/main/res/drawable-xxhdpi/ic_video_light.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_video_light.png rename to app/src/main/res/drawable-xxhdpi/ic_video_light.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_videocam_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_videocam_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_videocam_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_videocam_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_videocam_white_48dp.png b/app/src/main/res/drawable-xxhdpi/ic_videocam_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_videocam_white_48dp.png rename to app/src/main/res/drawable-xxhdpi/ic_videocam_white_48dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_view_stream_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_view_stream_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_view_stream_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_view_stream_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_volume_off_grey600_18dp.png b/app/src/main/res/drawable-xxhdpi/ic_volume_off_grey600_18dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_volume_off_grey600_18dp.png rename to app/src/main/res/drawable-xxhdpi/ic_volume_off_grey600_18dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_volume_off_white_18dp.png b/app/src/main/res/drawable-xxhdpi/ic_volume_off_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_volume_off_white_18dp.png rename to app/src/main/res/drawable-xxhdpi/ic_volume_off_white_18dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_volume_up_dark.png b/app/src/main/res/drawable-xxhdpi/ic_volume_up_dark.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_volume_up_dark.png rename to app/src/main/res/drawable-xxhdpi/ic_volume_up_dark.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_volume_up_light.png b/app/src/main/res/drawable-xxhdpi/ic_volume_up_light.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_volume_up_light.png rename to app/src/main/res/drawable-xxhdpi/ic_volume_up_light.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_volume_up_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_volume_up_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_volume_up_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_volume_up_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_warning_dark.png b/app/src/main/res/drawable-xxhdpi/ic_warning_dark.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_warning_dark.png rename to app/src/main/res/drawable-xxhdpi/ic_warning_dark.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_warning_light.png b/app/src/main/res/drawable-xxhdpi/ic_warning_light.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_warning_light.png rename to app/src/main/res/drawable-xxhdpi/ic_warning_light.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_wb_sunny_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_wb_sunny_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_wb_sunny_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_wb_sunny_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_work_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_work_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_work_white_24dp.png rename to app/src/main/res/drawable-xxhdpi/ic_work_white_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_x_28.png b/app/src/main/res/drawable-xxhdpi/ic_x_28.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_x_28.png rename to app/src/main/res/drawable-xxhdpi/ic_x_28.png diff --git a/session/src/main/res/drawable-xxhdpi/ic_x_circle.png b/app/src/main/res/drawable-xxhdpi/ic_x_circle.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/ic_x_circle.png rename to app/src/main/res/drawable-xxhdpi/ic_x_circle.png diff --git a/session/src/main/res/drawable-xxhdpi/icon_cached.png b/app/src/main/res/drawable-xxhdpi/icon_cached.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/icon_cached.png rename to app/src/main/res/drawable-xxhdpi/icon_cached.png diff --git a/session/src/main/res/drawable-xxhdpi/icon_dialog.png b/app/src/main/res/drawable-xxhdpi/icon_dialog.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/icon_dialog.png rename to app/src/main/res/drawable-xxhdpi/icon_dialog.png diff --git a/session/src/main/res/drawable-xxhdpi/icon_transparent.png b/app/src/main/res/drawable-xxhdpi/icon_transparent.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/icon_transparent.png rename to app/src/main/res/drawable-xxhdpi/icon_transparent.png diff --git a/session/src/main/res/drawable-xxhdpi/inbox_zero.png b/app/src/main/res/drawable-xxhdpi/inbox_zero.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/inbox_zero.png rename to app/src/main/res/drawable-xxhdpi/inbox_zero.png diff --git a/session/src/main/res/drawable-xxhdpi/link_preview_splash.png b/app/src/main/res/drawable-xxhdpi/link_preview_splash.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/link_preview_splash.png rename to app/src/main/res/drawable-xxhdpi/link_preview_splash.png diff --git a/session/src/main/res/drawable-xxhdpi/lockscreen_watermark_dark.png b/app/src/main/res/drawable-xxhdpi/lockscreen_watermark_dark.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/lockscreen_watermark_dark.png rename to app/src/main/res/drawable-xxhdpi/lockscreen_watermark_dark.png diff --git a/session/src/main/res/drawable-xxhdpi/lockscreen_watermark_light.png b/app/src/main/res/drawable-xxhdpi/lockscreen_watermark_light.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/lockscreen_watermark_light.png rename to app/src/main/res/drawable-xxhdpi/lockscreen_watermark_light.png diff --git a/session/src/main/res/drawable-xxhdpi/love_heart.png b/app/src/main/res/drawable-xxhdpi/love_heart.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/love_heart.png rename to app/src/main/res/drawable-xxhdpi/love_heart.png diff --git a/session/src/main/res/drawable-xxhdpi/message_24dp.png b/app/src/main/res/drawable-xxhdpi/message_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/message_24dp.png rename to app/src/main/res/drawable-xxhdpi/message_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/no_contacts.png b/app/src/main/res/drawable-xxhdpi/no_contacts.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/no_contacts.png rename to app/src/main/res/drawable-xxhdpi/no_contacts.png diff --git a/session/src/main/res/drawable-xxhdpi/phone_24dp.png b/app/src/main/res/drawable-xxhdpi/phone_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/phone_24dp.png rename to app/src/main/res/drawable-xxhdpi/phone_24dp.png diff --git a/session/src/main/res/drawable-xxhdpi/poweredby_giphy.png b/app/src/main/res/drawable-xxhdpi/poweredby_giphy.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/poweredby_giphy.png rename to app/src/main/res/drawable-xxhdpi/poweredby_giphy.png diff --git a/session/src/main/res/drawable-xxhdpi/profile_splash.png b/app/src/main/res/drawable-xxhdpi/profile_splash.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/profile_splash.png rename to app/src/main/res/drawable-xxhdpi/profile_splash.png diff --git a/session/src/main/res/drawable-xxhdpi/quick_camera_dark.png b/app/src/main/res/drawable-xxhdpi/quick_camera_dark.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/quick_camera_dark.png rename to app/src/main/res/drawable-xxhdpi/quick_camera_dark.png diff --git a/session/src/main/res/drawable-xxhdpi/quick_camera_exit_fullscreen.png b/app/src/main/res/drawable-xxhdpi/quick_camera_exit_fullscreen.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/quick_camera_exit_fullscreen.png rename to app/src/main/res/drawable-xxhdpi/quick_camera_exit_fullscreen.png diff --git a/session/src/main/res/drawable-xxhdpi/quick_camera_front.png b/app/src/main/res/drawable-xxhdpi/quick_camera_front.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/quick_camera_front.png rename to app/src/main/res/drawable-xxhdpi/quick_camera_front.png diff --git a/session/src/main/res/drawable-xxhdpi/quick_camera_fullscreen.png b/app/src/main/res/drawable-xxhdpi/quick_camera_fullscreen.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/quick_camera_fullscreen.png rename to app/src/main/res/drawable-xxhdpi/quick_camera_fullscreen.png diff --git a/session/src/main/res/drawable-xxhdpi/quick_camera_hide.png b/app/src/main/res/drawable-xxhdpi/quick_camera_hide.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/quick_camera_hide.png rename to app/src/main/res/drawable-xxhdpi/quick_camera_hide.png diff --git a/session/src/main/res/drawable-xxhdpi/quick_camera_light.png b/app/src/main/res/drawable-xxhdpi/quick_camera_light.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/quick_camera_light.png rename to app/src/main/res/drawable-xxhdpi/quick_camera_light.png diff --git a/session/src/main/res/drawable-xxhdpi/quick_camera_rear.png b/app/src/main/res/drawable-xxhdpi/quick_camera_rear.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/quick_camera_rear.png rename to app/src/main/res/drawable-xxhdpi/quick_camera_rear.png diff --git a/session/src/main/res/drawable-xxhdpi/quick_shutter_button.png b/app/src/main/res/drawable-xxhdpi/quick_shutter_button.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/quick_shutter_button.png rename to app/src/main/res/drawable-xxhdpi/quick_shutter_button.png diff --git a/session/src/main/res/drawable-xxhdpi/splash_logo.png b/app/src/main/res/drawable-xxhdpi/splash_logo.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/splash_logo.png rename to app/src/main/res/drawable-xxhdpi/splash_logo.png diff --git a/session/src/main/res/drawable-xxhdpi/timer00.png b/app/src/main/res/drawable-xxhdpi/timer00.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/timer00.png rename to app/src/main/res/drawable-xxhdpi/timer00.png diff --git a/session/src/main/res/drawable-xxhdpi/timer05.png b/app/src/main/res/drawable-xxhdpi/timer05.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/timer05.png rename to app/src/main/res/drawable-xxhdpi/timer05.png diff --git a/session/src/main/res/drawable-xxhdpi/timer10.png b/app/src/main/res/drawable-xxhdpi/timer10.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/timer10.png rename to app/src/main/res/drawable-xxhdpi/timer10.png diff --git a/session/src/main/res/drawable-xxhdpi/timer15.png b/app/src/main/res/drawable-xxhdpi/timer15.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/timer15.png rename to app/src/main/res/drawable-xxhdpi/timer15.png diff --git a/session/src/main/res/drawable-xxhdpi/timer20.png b/app/src/main/res/drawable-xxhdpi/timer20.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/timer20.png rename to app/src/main/res/drawable-xxhdpi/timer20.png diff --git a/session/src/main/res/drawable-xxhdpi/timer25.png b/app/src/main/res/drawable-xxhdpi/timer25.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/timer25.png rename to app/src/main/res/drawable-xxhdpi/timer25.png diff --git a/session/src/main/res/drawable-xxhdpi/timer30.png b/app/src/main/res/drawable-xxhdpi/timer30.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/timer30.png rename to app/src/main/res/drawable-xxhdpi/timer30.png diff --git a/session/src/main/res/drawable-xxhdpi/timer35.png b/app/src/main/res/drawable-xxhdpi/timer35.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/timer35.png rename to app/src/main/res/drawable-xxhdpi/timer35.png diff --git a/session/src/main/res/drawable-xxhdpi/timer40.png b/app/src/main/res/drawable-xxhdpi/timer40.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/timer40.png rename to app/src/main/res/drawable-xxhdpi/timer40.png diff --git a/session/src/main/res/drawable-xxhdpi/timer45.png b/app/src/main/res/drawable-xxhdpi/timer45.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/timer45.png rename to app/src/main/res/drawable-xxhdpi/timer45.png diff --git a/session/src/main/res/drawable-xxhdpi/timer50.png b/app/src/main/res/drawable-xxhdpi/timer50.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/timer50.png rename to app/src/main/res/drawable-xxhdpi/timer50.png diff --git a/session/src/main/res/drawable-xxhdpi/timer55.png b/app/src/main/res/drawable-xxhdpi/timer55.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/timer55.png rename to app/src/main/res/drawable-xxhdpi/timer55.png diff --git a/session/src/main/res/drawable-xxhdpi/timer60.png b/app/src/main/res/drawable-xxhdpi/timer60.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/timer60.png rename to app/src/main/res/drawable-xxhdpi/timer60.png diff --git a/session/src/main/res/drawable-xxhdpi/video_splash.png b/app/src/main/res/drawable-xxhdpi/video_splash.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/video_splash.png rename to app/src/main/res/drawable-xxhdpi/video_splash.png diff --git a/session/src/main/res/drawable-xxhdpi/welcome.png b/app/src/main/res/drawable-xxhdpi/welcome.png similarity index 100% rename from session/src/main/res/drawable-xxhdpi/welcome.png rename to app/src/main/res/drawable-xxhdpi/welcome.png diff --git a/session/src/main/res/drawable-xxxhdpi/baseline_account_circle_white_24.png b/app/src/main/res/drawable-xxxhdpi/baseline_account_circle_white_24.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/baseline_account_circle_white_24.png rename to app/src/main/res/drawable-xxxhdpi/baseline_account_circle_white_24.png diff --git a/session/src/main/res/drawable-xxxhdpi/baseline_email_white_24.png b/app/src/main/res/drawable-xxxhdpi/baseline_email_white_24.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/baseline_email_white_24.png rename to app/src/main/res/drawable-xxxhdpi/baseline_email_white_24.png diff --git a/session/src/main/res/drawable-xxxhdpi/clear_profile_avatar.png b/app/src/main/res/drawable-xxxhdpi/clear_profile_avatar.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/clear_profile_avatar.png rename to app/src/main/res/drawable-xxxhdpi/clear_profile_avatar.png diff --git a/session/src/main/res/drawable-xxxhdpi/conversation_list_empty_state.png b/app/src/main/res/drawable-xxxhdpi/conversation_list_empty_state.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/conversation_list_empty_state.png rename to app/src/main/res/drawable-xxxhdpi/conversation_list_empty_state.png diff --git a/session/src/main/res/drawable-xxxhdpi/empty_inbox_1.png b/app/src/main/res/drawable-xxxhdpi/empty_inbox_1.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/empty_inbox_1.png rename to app/src/main/res/drawable-xxxhdpi/empty_inbox_1.png diff --git a/session/src/main/res/drawable-xxxhdpi/empty_inbox_2.png b/app/src/main/res/drawable-xxxhdpi/empty_inbox_2.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/empty_inbox_2.png rename to app/src/main/res/drawable-xxxhdpi/empty_inbox_2.png diff --git a/session/src/main/res/drawable-xxxhdpi/empty_inbox_3.png b/app/src/main/res/drawable-xxxhdpi/empty_inbox_3.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/empty_inbox_3.png rename to app/src/main/res/drawable-xxxhdpi/empty_inbox_3.png diff --git a/session/src/main/res/drawable-xxxhdpi/empty_inbox_4.png b/app/src/main/res/drawable-xxxhdpi/empty_inbox_4.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/empty_inbox_4.png rename to app/src/main/res/drawable-xxxhdpi/empty_inbox_4.png diff --git a/session/src/main/res/drawable-xxxhdpi/empty_inbox_5.png b/app/src/main/res/drawable-xxxhdpi/empty_inbox_5.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/empty_inbox_5.png rename to app/src/main/res/drawable-xxxhdpi/empty_inbox_5.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_add_caption_36.png b/app/src/main/res/drawable-xxxhdpi/ic_add_caption_36.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_add_caption_36.png rename to app/src/main/res/drawable-xxxhdpi/ic_add_caption_36.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_add_photo.png b/app/src/main/res/drawable-xxxhdpi/ic_add_photo.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_add_photo.png rename to app/src/main/res/drawable-xxxhdpi/ic_add_photo.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_add_white_original_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_add_white_original_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_add_white_original_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_add_white_original_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_advanced_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_advanced_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_advanced_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_advanced_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_archive_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_archive_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_archive_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_archive_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_archive_white_36dp.png b/app/src/main/res/drawable-xxxhdpi/ic_archive_white_36dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_archive_white_36dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_archive_white_36dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_arrow_back_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_arrow_back_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_arrow_back_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_arrow_back_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_arrow_forward_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_arrow_forward_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_arrow_forward_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_arrow_forward_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_arrow_right.png b/app/src/main/res/drawable-xxxhdpi/ic_arrow_right.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_arrow_right.png rename to app/src/main/res/drawable-xxxhdpi/ic_arrow_right.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_arrow_up.png b/app/src/main/res/drawable-xxxhdpi/ic_arrow_up.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_arrow_up.png rename to app/src/main/res/drawable-xxxhdpi/ic_arrow_up.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_block_grey600_18dp.png b/app/src/main/res/drawable-xxxhdpi/ic_block_grey600_18dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_block_grey600_18dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_block_grey600_18dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_block_white_18dp.png b/app/src/main/res/drawable-xxxhdpi/ic_block_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_block_white_18dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_block_white_18dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_block_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_block_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_block_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_block_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_bluetooth_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_bluetooth_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_bluetooth_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_bluetooth_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_brightness_6_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_brightness_6_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_brightness_6_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_brightness_6_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_broken_link.png b/app/src/main/res/drawable-xxxhdpi/ic_broken_link.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_broken_link.png rename to app/src/main/res/drawable-xxxhdpi/ic_broken_link.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_brush_highlight_32.png b/app/src/main/res/drawable-xxxhdpi/ic_brush_highlight_32.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_brush_highlight_32.png rename to app/src/main/res/drawable-xxxhdpi/ic_brush_highlight_32.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_brush_marker_32.png b/app/src/main/res/drawable-xxxhdpi/ic_brush_marker_32.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_brush_marker_32.png rename to app/src/main/res/drawable-xxxhdpi/ic_brush_marker_32.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_call_end_grey600_32dp.png b/app/src/main/res/drawable-xxxhdpi/ic_call_end_grey600_32dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_call_end_grey600_32dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_call_end_grey600_32dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_call_end_white_48dp.png b/app/src/main/res/drawable-xxxhdpi/ic_call_end_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_call_end_white_48dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_call_end_white_48dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_camera_alt_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_camera_alt_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_camera_alt_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_camera_alt_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_camera_filled_24.png b/app/src/main/res/drawable-xxxhdpi/ic_camera_filled_24.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_camera_filled_24.png rename to app/src/main/res/drawable-xxxhdpi/ic_camera_filled_24.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_camera_shutter.png b/app/src/main/res/drawable-xxxhdpi/ic_camera_shutter.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_camera_shutter.png rename to app/src/main/res/drawable-xxxhdpi/ic_camera_shutter.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_camera_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_camera_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_camera_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_camera_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_caption_28.png b/app/src/main/res/drawable-xxxhdpi/ic_caption_28.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_caption_28.png rename to app/src/main/res/drawable-xxxhdpi/ic_caption_28.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_check_circle_32.png b/app/src/main/res/drawable-xxxhdpi/ic_check_circle_32.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_check_circle_32.png rename to app/src/main/res/drawable-xxxhdpi/ic_check_circle_32.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_check_circle_white_18dp.png b/app/src/main/res/drawable-xxxhdpi/ic_check_circle_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_check_circle_white_18dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_check_circle_white_18dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_check_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_check_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_check_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_check_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_check_white_48dp.png b/app/src/main/res/drawable-xxxhdpi/ic_check_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_check_white_48dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_check_white_48dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_circle_fill_white_48dp.png b/app/src/main/res/drawable-xxxhdpi/ic_circle_fill_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_circle_fill_white_48dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_circle_fill_white_48dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_clear_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_clear_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_clear_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_clear_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_close_grey600_32dp.png b/app/src/main/res/drawable-xxxhdpi/ic_close_grey600_32dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_close_grey600_32dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_close_grey600_32dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_close_white_18dp.png b/app/src/main/res/drawable-xxxhdpi/ic_close_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_close_white_18dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_close_white_18dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_close_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_close_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_close_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_close_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_close_white_48dp.png b/app/src/main/res/drawable-xxxhdpi/ic_close_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_close_white_48dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_close_white_48dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_contact_picture_large.png b/app/src/main/res/drawable-xxxhdpi/ic_contact_picture_large.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_contact_picture_large.png rename to app/src/main/res/drawable-xxxhdpi/ic_contact_picture_large.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_contacts_white_48dp.png b/app/src/main/res/drawable-xxxhdpi/ic_contacts_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_contacts_white_48dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_contacts_white_48dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_content_copy_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_content_copy_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_content_copy_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_content_copy_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_create_album_filled_32.png b/app/src/main/res/drawable-xxxhdpi/ic_create_album_filled_32.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_create_album_filled_32.png rename to app/src/main/res/drawable-xxxhdpi/ic_create_album_filled_32.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_create_album_outline_32.png b/app/src/main/res/drawable-xxxhdpi/ic_create_album_outline_32.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_create_album_outline_32.png rename to app/src/main/res/drawable-xxxhdpi/ic_create_album_outline_32.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_crop_32.png b/app/src/main/res/drawable-xxxhdpi/ic_crop_32.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_crop_32.png rename to app/src/main/res/drawable-xxxhdpi/ic_crop_32.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_crop_lock_32.png b/app/src/main/res/drawable-xxxhdpi/ic_crop_lock_32.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_crop_lock_32.png rename to app/src/main/res/drawable-xxxhdpi/ic_crop_lock_32.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_crop_unlock_32.png b/app/src/main/res/drawable-xxxhdpi/ic_crop_unlock_32.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_crop_unlock_32.png rename to app/src/main/res/drawable-xxxhdpi/ic_crop_unlock_32.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_dashboard_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_dashboard_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_dashboard_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_dashboard_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_delete_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_delete_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_delete_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_delete_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_delivery_status_delivered.png b/app/src/main/res/drawable-xxxhdpi/ic_delivery_status_delivered.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_delivery_status_delivered.png rename to app/src/main/res/drawable-xxxhdpi/ic_delivery_status_delivered.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_delivery_status_read.png b/app/src/main/res/drawable-xxxhdpi/ic_delivery_status_read.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_delivery_status_read.png rename to app/src/main/res/drawable-xxxhdpi/ic_delivery_status_read.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_delivery_status_sending.png b/app/src/main/res/drawable-xxxhdpi/ic_delivery_status_sending.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_delivery_status_sending.png rename to app/src/main/res/drawable-xxxhdpi/ic_delivery_status_sending.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_delivery_status_sent.png b/app/src/main/res/drawable-xxxhdpi/ic_delivery_status_sent.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_delivery_status_sent.png rename to app/src/main/res/drawable-xxxhdpi/ic_delivery_status_sent.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_devices_white.png b/app/src/main/res/drawable-xxxhdpi/ic_devices_white.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_devices_white.png rename to app/src/main/res/drawable-xxxhdpi/ic_devices_white.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_dialpad_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_dialpad_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_dialpad_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_dialpad_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_document_large_dark.png b/app/src/main/res/drawable-xxxhdpi/ic_document_large_dark.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_document_large_dark.png rename to app/src/main/res/drawable-xxxhdpi/ic_document_large_dark.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_document_large_light.png b/app/src/main/res/drawable-xxxhdpi/ic_document_large_light.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_document_large_light.png rename to app/src/main/res/drawable-xxxhdpi/ic_document_large_light.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_document_small_dark.png b/app/src/main/res/drawable-xxxhdpi/ic_document_small_dark.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_document_small_dark.png rename to app/src/main/res/drawable-xxxhdpi/ic_document_small_dark.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_document_small_light.png b/app/src/main/res/drawable-xxxhdpi/ic_document_small_light.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_document_small_light.png rename to app/src/main/res/drawable-xxxhdpi/ic_document_small_light.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_download_circle_fill_white_48dp.png b/app/src/main/res/drawable-xxxhdpi/ic_download_circle_fill_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_download_circle_fill_white_48dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_download_circle_fill_white_48dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_emoji_32.png b/app/src/main/res/drawable-xxxhdpi/ic_emoji_32.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_emoji_32.png rename to app/src/main/res/drawable-xxxhdpi/ic_emoji_32.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_error.png b/app/src/main/res/drawable-xxxhdpi/ic_error.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_error.png rename to app/src/main/res/drawable-xxxhdpi/ic_error.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_face_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_face_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_face_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_face_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_favorite_grey600_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_favorite_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_favorite_grey600_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_favorite_grey600_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_file_download_white_36dp.png b/app/src/main/res/drawable-xxxhdpi/ic_file_download_white_36dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_file_download_white_36dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_file_download_white_36dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_fingerprint_white_48dp.png b/app/src/main/res/drawable-xxxhdpi/ic_fingerprint_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_fingerprint_white_48dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_fingerprint_white_48dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_flip_32.png b/app/src/main/res/drawable-xxxhdpi/ic_flip_32.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_flip_32.png rename to app/src/main/res/drawable-xxxhdpi/ic_flip_32.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_forum_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_forum_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_forum_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_forum_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_gif_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_gif_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_gif_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_gif_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_headset_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_headset_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_headset_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_headset_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_image_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_image_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_image_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_image_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_info_white_18dp.png b/app/src/main/res/drawable-xxxhdpi/ic_info_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_info_white_18dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_info_white_18dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_insert_drive_file_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_insert_drive_file_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_insert_drive_file_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_insert_drive_file_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_keyboard_arrow_left_grey600_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_keyboard_arrow_left_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_keyboard_arrow_left_grey600_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_keyboard_arrow_left_grey600_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_keyboard_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_keyboard_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_keyboard_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_keyboard_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_laptop_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_laptop_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_laptop_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_laptop_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_launch_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_launch_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_launch_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_launch_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_local_dining_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_local_dining_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_local_dining_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_local_dining_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_location_on_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_location_on_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_location_on_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_location_on_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_lock_white_48dp.png b/app/src/main/res/drawable-xxxhdpi/ic_lock_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_lock_white_48dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_lock_white_48dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_menu_lock_dark.png b/app/src/main/res/drawable-xxxhdpi/ic_menu_lock_dark.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_menu_lock_dark.png rename to app/src/main/res/drawable-xxxhdpi/ic_menu_lock_dark.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_message_black_18dp.png b/app/src/main/res/drawable-xxxhdpi/ic_message_black_18dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_message_black_18dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_message_black_18dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_message_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_message_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_message_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_message_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_mic_grey600_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_mic_grey600_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_mic_grey600_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_mic_grey600_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_mic_off_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_mic_off_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_mic_off_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_mic_off_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_mic_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_mic_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_mic_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_mic_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_mic_white_48dp.png b/app/src/main/res/drawable-xxxhdpi/ic_mic_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_mic_white_48dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_mic_white_48dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_note_to_self.png b/app/src/main/res/drawable-xxxhdpi/ic_note_to_self.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_note_to_self.png rename to app/src/main/res/drawable-xxxhdpi/ic_note_to_self.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_notifications_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_notifications_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_notifications_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_notifications_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_pause_circle_fill_white_48dp.png b/app/src/main/res/drawable-xxxhdpi/ic_pause_circle_fill_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_pause_circle_fill_white_48dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_pause_circle_fill_white_48dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_person_add_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_person_add_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_person_add_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_person_add_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_person_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_person_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_person_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_person_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_pets_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_pets_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_pets_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_pets_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_phone_grey600_32dp.png b/app/src/main/res/drawable-xxxhdpi/ic_phone_grey600_32dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_phone_grey600_32dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_phone_grey600_32dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_photo_camera_dark.png b/app/src/main/res/drawable-xxxhdpi/ic_photo_camera_dark.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_photo_camera_dark.png rename to app/src/main/res/drawable-xxxhdpi/ic_photo_camera_dark.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_photo_camera_light.png b/app/src/main/res/drawable-xxxhdpi/ic_photo_camera_light.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_photo_camera_light.png rename to app/src/main/res/drawable-xxxhdpi/ic_photo_camera_light.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_photo_camera_white_48dp.png b/app/src/main/res/drawable-xxxhdpi/ic_photo_camera_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_photo_camera_white_48dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_photo_camera_white_48dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_photo_library_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_photo_library_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_photo_library_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_photo_library_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_play_circle_fill_white_48dp.png b/app/src/main/res/drawable-xxxhdpi/ic_play_circle_fill_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_play_circle_fill_white_48dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_play_circle_fill_white_48dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_profile_camera.png b/app/src/main/res/drawable-xxxhdpi/ic_profile_camera.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_profile_camera.png rename to app/src/main/res/drawable-xxxhdpi/ic_profile_camera.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_profile_default.png b/app/src/main/res/drawable-xxxhdpi/ic_profile_default.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_profile_default.png rename to app/src/main/res/drawable-xxxhdpi/ic_profile_default.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_reply_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_reply_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_reply_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_reply_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_reply_white_36dp.png b/app/src/main/res/drawable-xxxhdpi/ic_reply_white_36dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_reply_white_36dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_reply_white_36dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_restore_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_restore_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_restore_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_restore_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_rotate_32.png b/app/src/main/res/drawable-xxxhdpi/ic_rotate_32.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_rotate_32.png rename to app/src/main/res/drawable-xxxhdpi/ic_rotate_32.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_scribble_save.png b/app/src/main/res/drawable-xxxhdpi/ic_scribble_save.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_scribble_save.png rename to app/src/main/res/drawable-xxxhdpi/ic_scribble_save.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_scroll_down.png b/app/src/main/res/drawable-xxxhdpi/ic_scroll_down.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_scroll_down.png rename to app/src/main/res/drawable-xxxhdpi/ic_scroll_down.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_security_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_security_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_security_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_security_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_select_off.png b/app/src/main/res/drawable-xxxhdpi/ic_select_off.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_select_off.png rename to app/src/main/res/drawable-xxxhdpi/ic_select_off.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_select_on.png b/app/src/main/res/drawable-xxxhdpi/ic_select_on.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_select_on.png rename to app/src/main/res/drawable-xxxhdpi/ic_select_on.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_send_push_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_send_push_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_send_push_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_send_push_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_send_sms_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_send_sms_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_send_sms_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_send_sms_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_share_black_18dp.png b/app/src/main/res/drawable-xxxhdpi/ic_share_black_18dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_share_black_18dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_share_black_18dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_share_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_share_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_share_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_share_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_signal_background_connection.png b/app/src/main/res/drawable-xxxhdpi/ic_signal_background_connection.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_signal_background_connection.png rename to app/src/main/res/drawable-xxxhdpi/ic_signal_background_connection.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_signal_backup.png b/app/src/main/res/drawable-xxxhdpi/ic_signal_backup.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_signal_backup.png rename to app/src/main/res/drawable-xxxhdpi/ic_signal_backup.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_signal_downloading.png b/app/src/main/res/drawable-xxxhdpi/ic_signal_downloading.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_signal_downloading.png rename to app/src/main/res/drawable-xxxhdpi/ic_signal_downloading.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_switch_camera_32.png b/app/src/main/res/drawable-xxxhdpi/ic_switch_camera_32.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_switch_camera_32.png rename to app/src/main/res/drawable-xxxhdpi/ic_switch_camera_32.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_tag_faces_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_tag_faces_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_tag_faces_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_tag_faces_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_text_32.png b/app/src/main/res/drawable-xxxhdpi/ic_text_32.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_text_32.png rename to app/src/main/res/drawable-xxxhdpi/ic_text_32.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_textsms_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_textsms_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_textsms_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_textsms_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_textsms_white_48dp.png b/app/src/main/res/drawable-xxxhdpi/ic_textsms_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_textsms_white_48dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_textsms_white_48dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_timer.png b/app/src/main/res/drawable-xxxhdpi/ic_timer.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_timer.png rename to app/src/main/res/drawable-xxxhdpi/ic_timer.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_timer_disabled.png b/app/src/main/res/drawable-xxxhdpi/ic_timer_disabled.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_timer_disabled.png rename to app/src/main/res/drawable-xxxhdpi/ic_timer_disabled.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_timer_off_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_timer_off_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_timer_off_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_timer_off_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_trash_filled_32.png b/app/src/main/res/drawable-xxxhdpi/ic_trash_filled_32.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_trash_filled_32.png rename to app/src/main/res/drawable-xxxhdpi/ic_trash_filled_32.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_unarchive_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_unarchive_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_unarchive_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_unarchive_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_unarchive_white_36dp.png b/app/src/main/res/drawable-xxxhdpi/ic_unarchive_white_36dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_unarchive_white_36dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_unarchive_white_36dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_undo_32.png b/app/src/main/res/drawable-xxxhdpi/ic_undo_32.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_undo_32.png rename to app/src/main/res/drawable-xxxhdpi/ic_undo_32.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_unidentified_delivery.png b/app/src/main/res/drawable-xxxhdpi/ic_unidentified_delivery.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_unidentified_delivery.png rename to app/src/main/res/drawable-xxxhdpi/ic_unidentified_delivery.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_unlocked_white_18dp.png b/app/src/main/res/drawable-xxxhdpi/ic_unlocked_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_unlocked_white_18dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_unlocked_white_18dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_videocam_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_videocam_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_videocam_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_videocam_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_videocam_white_48dp.png b/app/src/main/res/drawable-xxxhdpi/ic_videocam_white_48dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_videocam_white_48dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_videocam_white_48dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_view_stream_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_view_stream_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_view_stream_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_view_stream_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_volume_off_grey600_18dp.png b/app/src/main/res/drawable-xxxhdpi/ic_volume_off_grey600_18dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_volume_off_grey600_18dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_volume_off_grey600_18dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_volume_off_white_18dp.png b/app/src/main/res/drawable-xxxhdpi/ic_volume_off_white_18dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_volume_off_white_18dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_volume_off_white_18dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_volume_up_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_volume_up_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_volume_up_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_volume_up_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_wb_sunny_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_wb_sunny_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_wb_sunny_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_wb_sunny_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_work_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_work_white_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_work_white_24dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_work_white_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_x_28.png b/app/src/main/res/drawable-xxxhdpi/ic_x_28.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_x_28.png rename to app/src/main/res/drawable-xxxhdpi/ic_x_28.png diff --git a/session/src/main/res/drawable-xxxhdpi/ic_x_circle.png b/app/src/main/res/drawable-xxxhdpi/ic_x_circle.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/ic_x_circle.png rename to app/src/main/res/drawable-xxxhdpi/ic_x_circle.png diff --git a/session/src/main/res/drawable-xxxhdpi/icon_cached.png b/app/src/main/res/drawable-xxxhdpi/icon_cached.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/icon_cached.png rename to app/src/main/res/drawable-xxxhdpi/icon_cached.png diff --git a/session/src/main/res/drawable-xxxhdpi/icon_transparent.png b/app/src/main/res/drawable-xxxhdpi/icon_transparent.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/icon_transparent.png rename to app/src/main/res/drawable-xxxhdpi/icon_transparent.png diff --git a/session/src/main/res/drawable-xxxhdpi/inbox_zero.png b/app/src/main/res/drawable-xxxhdpi/inbox_zero.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/inbox_zero.png rename to app/src/main/res/drawable-xxxhdpi/inbox_zero.png diff --git a/session/src/main/res/drawable-xxxhdpi/link_preview_splash.png b/app/src/main/res/drawable-xxxhdpi/link_preview_splash.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/link_preview_splash.png rename to app/src/main/res/drawable-xxxhdpi/link_preview_splash.png diff --git a/session/src/main/res/drawable-xxxhdpi/love_heart.png b/app/src/main/res/drawable-xxxhdpi/love_heart.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/love_heart.png rename to app/src/main/res/drawable-xxxhdpi/love_heart.png diff --git a/session/src/main/res/drawable-xxxhdpi/message_24dp.png b/app/src/main/res/drawable-xxxhdpi/message_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/message_24dp.png rename to app/src/main/res/drawable-xxxhdpi/message_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/no_contacts.png b/app/src/main/res/drawable-xxxhdpi/no_contacts.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/no_contacts.png rename to app/src/main/res/drawable-xxxhdpi/no_contacts.png diff --git a/session/src/main/res/drawable-xxxhdpi/phone_24dp.png b/app/src/main/res/drawable-xxxhdpi/phone_24dp.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/phone_24dp.png rename to app/src/main/res/drawable-xxxhdpi/phone_24dp.png diff --git a/session/src/main/res/drawable-xxxhdpi/poweredby_giphy.png b/app/src/main/res/drawable-xxxhdpi/poweredby_giphy.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/poweredby_giphy.png rename to app/src/main/res/drawable-xxxhdpi/poweredby_giphy.png diff --git a/session/src/main/res/drawable-xxxhdpi/profile_splash.png b/app/src/main/res/drawable-xxxhdpi/profile_splash.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/profile_splash.png rename to app/src/main/res/drawable-xxxhdpi/profile_splash.png diff --git a/session/src/main/res/drawable-xxxhdpi/timer00.png b/app/src/main/res/drawable-xxxhdpi/timer00.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/timer00.png rename to app/src/main/res/drawable-xxxhdpi/timer00.png diff --git a/session/src/main/res/drawable-xxxhdpi/timer05.png b/app/src/main/res/drawable-xxxhdpi/timer05.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/timer05.png rename to app/src/main/res/drawable-xxxhdpi/timer05.png diff --git a/session/src/main/res/drawable-xxxhdpi/timer10.png b/app/src/main/res/drawable-xxxhdpi/timer10.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/timer10.png rename to app/src/main/res/drawable-xxxhdpi/timer10.png diff --git a/session/src/main/res/drawable-xxxhdpi/timer15.png b/app/src/main/res/drawable-xxxhdpi/timer15.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/timer15.png rename to app/src/main/res/drawable-xxxhdpi/timer15.png diff --git a/session/src/main/res/drawable-xxxhdpi/timer20.png b/app/src/main/res/drawable-xxxhdpi/timer20.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/timer20.png rename to app/src/main/res/drawable-xxxhdpi/timer20.png diff --git a/session/src/main/res/drawable-xxxhdpi/timer25.png b/app/src/main/res/drawable-xxxhdpi/timer25.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/timer25.png rename to app/src/main/res/drawable-xxxhdpi/timer25.png diff --git a/session/src/main/res/drawable-xxxhdpi/timer30.png b/app/src/main/res/drawable-xxxhdpi/timer30.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/timer30.png rename to app/src/main/res/drawable-xxxhdpi/timer30.png diff --git a/session/src/main/res/drawable-xxxhdpi/timer35.png b/app/src/main/res/drawable-xxxhdpi/timer35.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/timer35.png rename to app/src/main/res/drawable-xxxhdpi/timer35.png diff --git a/session/src/main/res/drawable-xxxhdpi/timer40.png b/app/src/main/res/drawable-xxxhdpi/timer40.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/timer40.png rename to app/src/main/res/drawable-xxxhdpi/timer40.png diff --git a/session/src/main/res/drawable-xxxhdpi/timer45.png b/app/src/main/res/drawable-xxxhdpi/timer45.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/timer45.png rename to app/src/main/res/drawable-xxxhdpi/timer45.png diff --git a/session/src/main/res/drawable-xxxhdpi/timer50.png b/app/src/main/res/drawable-xxxhdpi/timer50.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/timer50.png rename to app/src/main/res/drawable-xxxhdpi/timer50.png diff --git a/session/src/main/res/drawable-xxxhdpi/timer55.png b/app/src/main/res/drawable-xxxhdpi/timer55.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/timer55.png rename to app/src/main/res/drawable-xxxhdpi/timer55.png diff --git a/session/src/main/res/drawable-xxxhdpi/timer60.png b/app/src/main/res/drawable-xxxhdpi/timer60.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/timer60.png rename to app/src/main/res/drawable-xxxhdpi/timer60.png diff --git a/session/src/main/res/drawable-xxxhdpi/video_splash.png b/app/src/main/res/drawable-xxxhdpi/video_splash.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/video_splash.png rename to app/src/main/res/drawable-xxxhdpi/video_splash.png diff --git a/session/src/main/res/drawable-xxxhdpi/welcome.png b/app/src/main/res/drawable-xxxhdpi/welcome.png similarity index 100% rename from session/src/main/res/drawable-xxxhdpi/welcome.png rename to app/src/main/res/drawable-xxxhdpi/welcome.png diff --git a/session/src/main/res/drawable/accent_dot.xml b/app/src/main/res/drawable/accent_dot.xml similarity index 100% rename from session/src/main/res/drawable/accent_dot.xml rename to app/src/main/res/drawable/accent_dot.xml diff --git a/session/src/main/res/drawable/archived_indicator_background.xml b/app/src/main/res/drawable/archived_indicator_background.xml similarity index 100% rename from session/src/main/res/drawable/archived_indicator_background.xml rename to app/src/main/res/drawable/archived_indicator_background.xml diff --git a/session/src/main/res/drawable/avatar_gradient_dark.xml b/app/src/main/res/drawable/avatar_gradient_dark.xml similarity index 100% rename from session/src/main/res/drawable/avatar_gradient_dark.xml rename to app/src/main/res/drawable/avatar_gradient_dark.xml diff --git a/session/src/main/res/drawable/avatar_gradient_light.xml b/app/src/main/res/drawable/avatar_gradient_light.xml similarity index 100% rename from session/src/main/res/drawable/avatar_gradient_light.xml rename to app/src/main/res/drawable/avatar_gradient_light.xml diff --git a/session/src/main/res/drawable/background_pattern.png b/app/src/main/res/drawable/background_pattern.png similarity index 100% rename from session/src/main/res/drawable/background_pattern.png rename to app/src/main/res/drawable/background_pattern.png diff --git a/session/src/main/res/drawable/background_pattern_repeat.xml b/app/src/main/res/drawable/background_pattern_repeat.xml similarity index 100% rename from session/src/main/res/drawable/background_pattern_repeat.xml rename to app/src/main/res/drawable/background_pattern_repeat.xml diff --git a/session/src/main/res/drawable/circle_alpha.xml b/app/src/main/res/drawable/circle_alpha.xml similarity index 100% rename from session/src/main/res/drawable/circle_alpha.xml rename to app/src/main/res/drawable/circle_alpha.xml diff --git a/session/src/main/res/drawable/circle_tintable.xml b/app/src/main/res/drawable/circle_tintable.xml similarity index 100% rename from session/src/main/res/drawable/circle_tintable.xml rename to app/src/main/res/drawable/circle_tintable.xml diff --git a/session/src/main/res/drawable/circle_tintable_4dp_inset.xml b/app/src/main/res/drawable/circle_tintable_4dp_inset.xml similarity index 100% rename from session/src/main/res/drawable/circle_tintable_4dp_inset.xml rename to app/src/main/res/drawable/circle_tintable_4dp_inset.xml diff --git a/session/src/main/res/drawable/circle_touch_highlight_background.xml b/app/src/main/res/drawable/circle_touch_highlight_background.xml similarity index 100% rename from session/src/main/res/drawable/circle_touch_highlight_background.xml rename to app/src/main/res/drawable/circle_touch_highlight_background.xml diff --git a/session/src/main/res/drawable/circle_white.xml b/app/src/main/res/drawable/circle_white.xml similarity index 100% rename from session/src/main/res/drawable/circle_white.xml rename to app/src/main/res/drawable/circle_white.xml diff --git a/session/src/main/res/drawable/clickable_card_dark.xml b/app/src/main/res/drawable/clickable_card_dark.xml similarity index 100% rename from session/src/main/res/drawable/clickable_card_dark.xml rename to app/src/main/res/drawable/clickable_card_dark.xml diff --git a/session/src/main/res/drawable/clickable_card_light.xml b/app/src/main/res/drawable/clickable_card_light.xml similarity index 100% rename from session/src/main/res/drawable/clickable_card_light.xml rename to app/src/main/res/drawable/clickable_card_light.xml diff --git a/session/src/main/res/drawable/colorpickerpreference_pref_swatch.xml b/app/src/main/res/drawable/colorpickerpreference_pref_swatch.xml similarity index 100% rename from session/src/main/res/drawable/colorpickerpreference_pref_swatch.xml rename to app/src/main/res/drawable/colorpickerpreference_pref_swatch.xml diff --git a/session/src/main/res/drawable/compose_background_camera.xml b/app/src/main/res/drawable/compose_background_camera.xml similarity index 100% rename from session/src/main/res/drawable/compose_background_camera.xml rename to app/src/main/res/drawable/compose_background_camera.xml diff --git a/session/src/main/res/drawable/compose_background_dark.xml b/app/src/main/res/drawable/compose_background_dark.xml similarity index 100% rename from session/src/main/res/drawable/compose_background_dark.xml rename to app/src/main/res/drawable/compose_background_dark.xml diff --git a/session/src/main/res/drawable/compose_background_light.xml b/app/src/main/res/drawable/compose_background_light.xml similarity index 100% rename from session/src/main/res/drawable/compose_background_light.xml rename to app/src/main/res/drawable/compose_background_light.xml diff --git a/session/src/main/res/drawable/compose_divider_background.xml b/app/src/main/res/drawable/compose_divider_background.xml similarity index 100% rename from session/src/main/res/drawable/compose_divider_background.xml rename to app/src/main/res/drawable/compose_divider_background.xml diff --git a/session/src/main/res/drawable/contact_list_divider_dark.xml b/app/src/main/res/drawable/contact_list_divider_dark.xml similarity index 100% rename from session/src/main/res/drawable/contact_list_divider_dark.xml rename to app/src/main/res/drawable/contact_list_divider_dark.xml diff --git a/session/src/main/res/drawable/contact_list_divider_light.xml b/app/src/main/res/drawable/contact_list_divider_light.xml similarity index 100% rename from session/src/main/res/drawable/contact_list_divider_light.xml rename to app/src/main/res/drawable/contact_list_divider_light.xml diff --git a/session/src/main/res/drawable/contact_photo_background.xml b/app/src/main/res/drawable/contact_photo_background.xml similarity index 100% rename from session/src/main/res/drawable/contact_photo_background.xml rename to app/src/main/res/drawable/contact_photo_background.xml diff --git a/session/src/main/res/drawable/conversation_attachment_close_circle.xml b/app/src/main/res/drawable/conversation_attachment_close_circle.xml similarity index 100% rename from session/src/main/res/drawable/conversation_attachment_close_circle.xml rename to app/src/main/res/drawable/conversation_attachment_close_circle.xml diff --git a/session/src/main/res/drawable/conversation_attachment_edit.xml b/app/src/main/res/drawable/conversation_attachment_edit.xml similarity index 100% rename from session/src/main/res/drawable/conversation_attachment_edit.xml rename to app/src/main/res/drawable/conversation_attachment_edit.xml diff --git a/session/src/main/res/drawable/conversation_home_touch_highlight.xml b/app/src/main/res/drawable/conversation_home_touch_highlight.xml similarity index 100% rename from session/src/main/res/drawable/conversation_home_touch_highlight.xml rename to app/src/main/res/drawable/conversation_home_touch_highlight.xml diff --git a/session/src/main/res/drawable/conversation_item_background.xml b/app/src/main/res/drawable/conversation_item_background.xml similarity index 100% rename from session/src/main/res/drawable/conversation_item_background.xml rename to app/src/main/res/drawable/conversation_item_background.xml diff --git a/session/src/main/res/drawable/conversation_item_background_animated.xml b/app/src/main/res/drawable/conversation_item_background_animated.xml similarity index 100% rename from session/src/main/res/drawable/conversation_item_background_animated.xml rename to app/src/main/res/drawable/conversation_item_background_animated.xml diff --git a/session/src/main/res/drawable/conversation_item_sent_indicator_text_shape.xml b/app/src/main/res/drawable/conversation_item_sent_indicator_text_shape.xml similarity index 100% rename from session/src/main/res/drawable/conversation_item_sent_indicator_text_shape.xml rename to app/src/main/res/drawable/conversation_item_sent_indicator_text_shape.xml diff --git a/session/src/main/res/drawable/conversation_item_sent_indicator_text_shape_dark.xml b/app/src/main/res/drawable/conversation_item_sent_indicator_text_shape_dark.xml similarity index 100% rename from session/src/main/res/drawable/conversation_item_sent_indicator_text_shape_dark.xml rename to app/src/main/res/drawable/conversation_item_sent_indicator_text_shape_dark.xml diff --git a/session/src/main/res/drawable/conversation_list_divider_shape.xml b/app/src/main/res/drawable/conversation_list_divider_shape.xml similarity index 100% rename from session/src/main/res/drawable/conversation_list_divider_shape.xml rename to app/src/main/res/drawable/conversation_list_divider_shape.xml diff --git a/session/src/main/res/drawable/conversation_list_divider_shape_dark.xml b/app/src/main/res/drawable/conversation_list_divider_shape_dark.xml similarity index 100% rename from session/src/main/res/drawable/conversation_list_divider_shape_dark.xml rename to app/src/main/res/drawable/conversation_list_divider_shape_dark.xml diff --git a/session/src/main/res/drawable/conversation_list_item_background.xml b/app/src/main/res/drawable/conversation_list_item_background.xml similarity index 100% rename from session/src/main/res/drawable/conversation_list_item_background.xml rename to app/src/main/res/drawable/conversation_list_item_background.xml diff --git a/session/src/main/res/drawable/conversation_list_item_background_dark.xml b/app/src/main/res/drawable/conversation_list_item_background_dark.xml similarity index 100% rename from session/src/main/res/drawable/conversation_list_item_background_dark.xml rename to app/src/main/res/drawable/conversation_list_item_background_dark.xml diff --git a/session/src/main/res/drawable/conversation_view_background.xml b/app/src/main/res/drawable/conversation_view_background.xml similarity index 100% rename from session/src/main/res/drawable/conversation_view_background.xml rename to app/src/main/res/drawable/conversation_view_background.xml diff --git a/session/src/main/res/drawable/default_bottom_sheet_background.xml b/app/src/main/res/drawable/default_bottom_sheet_background.xml similarity index 100% rename from session/src/main/res/drawable/default_bottom_sheet_background.xml rename to app/src/main/res/drawable/default_bottom_sheet_background.xml diff --git a/session/src/main/res/drawable/default_bottom_sheet_background_inset.xml b/app/src/main/res/drawable/default_bottom_sheet_background_inset.xml similarity index 100% rename from session/src/main/res/drawable/default_bottom_sheet_background_inset.xml rename to app/src/main/res/drawable/default_bottom_sheet_background_inset.xml diff --git a/session/src/main/res/drawable/default_dialog_background.xml b/app/src/main/res/drawable/default_dialog_background.xml similarity index 100% rename from session/src/main/res/drawable/default_dialog_background.xml rename to app/src/main/res/drawable/default_dialog_background.xml diff --git a/session/src/main/res/drawable/default_dialog_background_inset.xml b/app/src/main/res/drawable/default_dialog_background_inset.xml similarity index 100% rename from session/src/main/res/drawable/default_dialog_background_inset.xml rename to app/src/main/res/drawable/default_dialog_background_inset.xml diff --git a/session/src/main/res/drawable/default_session_background.xml b/app/src/main/res/drawable/default_session_background.xml similarity index 100% rename from session/src/main/res/drawable/default_session_background.xml rename to app/src/main/res/drawable/default_session_background.xml diff --git a/session/src/main/res/drawable/default_session_progress.xml b/app/src/main/res/drawable/default_session_progress.xml similarity index 100% rename from session/src/main/res/drawable/default_session_progress.xml rename to app/src/main/res/drawable/default_session_progress.xml diff --git a/session/src/main/res/drawable/destructive_dialog_button_background.xml b/app/src/main/res/drawable/destructive_dialog_button_background.xml similarity index 100% rename from session/src/main/res/drawable/destructive_dialog_button_background.xml rename to app/src/main/res/drawable/destructive_dialog_button_background.xml diff --git a/session/src/main/res/drawable/dialog_background.xml b/app/src/main/res/drawable/dialog_background.xml similarity index 100% rename from session/src/main/res/drawable/dialog_background.xml rename to app/src/main/res/drawable/dialog_background.xml diff --git a/session/src/main/res/drawable/dismiss_background.xml b/app/src/main/res/drawable/dismiss_background.xml similarity index 100% rename from session/src/main/res/drawable/dismiss_background.xml rename to app/src/main/res/drawable/dismiss_background.xml diff --git a/session/src/main/res/drawable/emoji_variation_selector_background_dark.xml b/app/src/main/res/drawable/emoji_variation_selector_background_dark.xml similarity index 100% rename from session/src/main/res/drawable/emoji_variation_selector_background_dark.xml rename to app/src/main/res/drawable/emoji_variation_selector_background_dark.xml diff --git a/session/src/main/res/drawable/emoji_variation_selector_background_light.xml b/app/src/main/res/drawable/emoji_variation_selector_background_light.xml similarity index 100% rename from session/src/main/res/drawable/emoji_variation_selector_background_light.xml rename to app/src/main/res/drawable/emoji_variation_selector_background_light.xml diff --git a/session/src/main/res/drawable/error_round.xml b/app/src/main/res/drawable/error_round.xml similarity index 100% rename from session/src/main/res/drawable/error_round.xml rename to app/src/main/res/drawable/error_round.xml diff --git a/session/src/main/res/drawable/fake_chat_view_incoming_message_background.xml b/app/src/main/res/drawable/fake_chat_view_incoming_message_background.xml similarity index 100% rename from session/src/main/res/drawable/fake_chat_view_incoming_message_background.xml rename to app/src/main/res/drawable/fake_chat_view_incoming_message_background.xml diff --git a/session/src/main/res/drawable/fake_chat_view_outgoing_message_background.xml b/app/src/main/res/drawable/fake_chat_view_outgoing_message_background.xml similarity index 100% rename from session/src/main/res/drawable/fake_chat_view_outgoing_message_background.xml rename to app/src/main/res/drawable/fake_chat_view_outgoing_message_background.xml diff --git a/session/src/main/res/drawable/home_activity_gradient.xml b/app/src/main/res/drawable/home_activity_gradient.xml similarity index 100% rename from session/src/main/res/drawable/home_activity_gradient.xml rename to app/src/main/res/drawable/home_activity_gradient.xml diff --git a/session/src/main/res/drawable/ic_advanced_24dp.xml b/app/src/main/res/drawable/ic_advanced_24dp.xml similarity index 100% rename from session/src/main/res/drawable/ic_advanced_24dp.xml rename to app/src/main/res/drawable/ic_advanced_24dp.xml diff --git a/session/src/main/res/drawable/ic_arrow_down.xml b/app/src/main/res/drawable/ic_arrow_down.xml similarity index 100% rename from session/src/main/res/drawable/ic_arrow_down.xml rename to app/src/main/res/drawable/ic_arrow_down.xml diff --git a/session/src/main/res/drawable/ic_arrow_down_circle_filled.xml b/app/src/main/res/drawable/ic_arrow_down_circle_filled.xml similarity index 100% rename from session/src/main/res/drawable/ic_arrow_down_circle_filled.xml rename to app/src/main/res/drawable/ic_arrow_down_circle_filled.xml diff --git a/session/src/main/res/drawable/ic_arrow_up_circle_24.xml b/app/src/main/res/drawable/ic_arrow_up_circle_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_arrow_up_circle_24.xml rename to app/src/main/res/drawable/ic_arrow_up_circle_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_add_24.xml b/app/src/main/res/drawable/ic_baseline_add_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_add_24.xml rename to app/src/main/res/drawable/ic_baseline_add_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_arrow_back_24.xml b/app/src/main/res/drawable/ic_baseline_arrow_back_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_arrow_back_24.xml rename to app/src/main/res/drawable/ic_baseline_arrow_back_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_arrow_back_compact_24.xml b/app/src/main/res/drawable/ic_baseline_arrow_back_compact_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_arrow_back_compact_24.xml rename to app/src/main/res/drawable/ic_baseline_arrow_back_compact_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_arrow_forward_24.xml b/app/src/main/res/drawable/ic_baseline_arrow_forward_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_arrow_forward_24.xml rename to app/src/main/res/drawable/ic_baseline_arrow_forward_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_block_24.xml b/app/src/main/res/drawable/ic_baseline_block_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_block_24.xml rename to app/src/main/res/drawable/ic_baseline_block_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_call_split_24.xml b/app/src/main/res/drawable/ic_baseline_call_split_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_call_split_24.xml rename to app/src/main/res/drawable/ic_baseline_call_split_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_clear_24.xml b/app/src/main/res/drawable/ic_baseline_clear_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_clear_24.xml rename to app/src/main/res/drawable/ic_baseline_clear_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_dashboard_24.xml b/app/src/main/res/drawable/ic_baseline_dashboard_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_dashboard_24.xml rename to app/src/main/res/drawable/ic_baseline_dashboard_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_delete_24.xml b/app/src/main/res/drawable/ic_baseline_delete_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_delete_24.xml rename to app/src/main/res/drawable/ic_baseline_delete_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_done_24.xml b/app/src/main/res/drawable/ic_baseline_done_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_done_24.xml rename to app/src/main/res/drawable/ic_baseline_done_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_edit_24.xml b/app/src/main/res/drawable/ic_baseline_edit_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_edit_24.xml rename to app/src/main/res/drawable/ic_baseline_edit_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_file_copy_24.xml b/app/src/main/res/drawable/ic_baseline_file_copy_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_file_copy_24.xml rename to app/src/main/res/drawable/ic_baseline_file_copy_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_folder_24.xml b/app/src/main/res/drawable/ic_baseline_folder_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_folder_24.xml rename to app/src/main/res/drawable/ic_baseline_folder_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_folder_48.xml b/app/src/main/res/drawable/ic_baseline_folder_48.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_folder_48.xml rename to app/src/main/res/drawable/ic_baseline_folder_48.xml diff --git a/session/src/main/res/drawable/ic_baseline_forward_24.xml b/app/src/main/res/drawable/ic_baseline_forward_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_forward_24.xml rename to app/src/main/res/drawable/ic_baseline_forward_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_info_24.xml b/app/src/main/res/drawable/ic_baseline_info_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_info_24.xml rename to app/src/main/res/drawable/ic_baseline_info_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_key_24.xml b/app/src/main/res/drawable/ic_baseline_key_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_key_24.xml rename to app/src/main/res/drawable/ic_baseline_key_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_keyboard_24.xml b/app/src/main/res/drawable/ic_baseline_keyboard_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_keyboard_24.xml rename to app/src/main/res/drawable/ic_baseline_keyboard_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_keyboard_arrow_down_24.xml b/app/src/main/res/drawable/ic_baseline_keyboard_arrow_down_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_keyboard_arrow_down_24.xml rename to app/src/main/res/drawable/ic_baseline_keyboard_arrow_down_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_keyboard_arrow_up_24.xml b/app/src/main/res/drawable/ic_baseline_keyboard_arrow_up_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_keyboard_arrow_up_24.xml rename to app/src/main/res/drawable/ic_baseline_keyboard_arrow_up_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_launch_24.xml b/app/src/main/res/drawable/ic_baseline_launch_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_launch_24.xml rename to app/src/main/res/drawable/ic_baseline_launch_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_mic_24.xml b/app/src/main/res/drawable/ic_baseline_mic_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_mic_24.xml rename to app/src/main/res/drawable/ic_baseline_mic_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_mic_48.xml b/app/src/main/res/drawable/ic_baseline_mic_48.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_mic_48.xml rename to app/src/main/res/drawable/ic_baseline_mic_48.xml diff --git a/session/src/main/res/drawable/ic_baseline_night_mode_24.xml b/app/src/main/res/drawable/ic_baseline_night_mode_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_night_mode_24.xml rename to app/src/main/res/drawable/ic_baseline_night_mode_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_pause_circle_filled_48.xml b/app/src/main/res/drawable/ic_baseline_pause_circle_filled_48.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_pause_circle_filled_48.xml rename to app/src/main/res/drawable/ic_baseline_pause_circle_filled_48.xml diff --git a/session/src/main/res/drawable/ic_baseline_photo_camera_24.xml b/app/src/main/res/drawable/ic_baseline_photo_camera_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_photo_camera_24.xml rename to app/src/main/res/drawable/ic_baseline_photo_camera_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_photo_camera_48.xml b/app/src/main/res/drawable/ic_baseline_photo_camera_48.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_photo_camera_48.xml rename to app/src/main/res/drawable/ic_baseline_photo_camera_48.xml diff --git a/session/src/main/res/drawable/ic_baseline_photo_library_24.xml b/app/src/main/res/drawable/ic_baseline_photo_library_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_photo_library_24.xml rename to app/src/main/res/drawable/ic_baseline_photo_library_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_play_circle_filled_48.xml b/app/src/main/res/drawable/ic_baseline_play_circle_filled_48.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_play_circle_filled_48.xml rename to app/src/main/res/drawable/ic_baseline_play_circle_filled_48.xml diff --git a/session/src/main/res/drawable/ic_baseline_refresh_24.xml b/app/src/main/res/drawable/ic_baseline_refresh_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_refresh_24.xml rename to app/src/main/res/drawable/ic_baseline_refresh_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_reply_24.xml b/app/src/main/res/drawable/ic_baseline_reply_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_reply_24.xml rename to app/src/main/res/drawable/ic_baseline_reply_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_save_24.xml b/app/src/main/res/drawable/ic_baseline_save_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_save_24.xml rename to app/src/main/res/drawable/ic_baseline_save_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_search_24.xml b/app/src/main/res/drawable/ic_baseline_search_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_search_24.xml rename to app/src/main/res/drawable/ic_baseline_search_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_select_all_24.xml b/app/src/main/res/drawable/ic_baseline_select_all_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_select_all_24.xml rename to app/src/main/res/drawable/ic_baseline_select_all_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_timer_off_24.xml b/app/src/main/res/drawable/ic_baseline_timer_off_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_timer_off_24.xml rename to app/src/main/res/drawable/ic_baseline_timer_off_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_view_stream_24.xml b/app/src/main/res/drawable/ic_baseline_view_stream_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_view_stream_24.xml rename to app/src/main/res/drawable/ic_baseline_view_stream_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_visibility_24.xml b/app/src/main/res/drawable/ic_baseline_visibility_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_visibility_24.xml rename to app/src/main/res/drawable/ic_baseline_visibility_24.xml diff --git a/session/src/main/res/drawable/ic_baseline_visibility_off_24.xml b/app/src/main/res/drawable/ic_baseline_visibility_off_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_baseline_visibility_off_24.xml rename to app/src/main/res/drawable/ic_baseline_visibility_off_24.xml diff --git a/session/src/main/res/drawable/ic_brightness_6_24dp.xml b/app/src/main/res/drawable/ic_brightness_6_24dp.xml similarity index 100% rename from session/src/main/res/drawable/ic_brightness_6_24dp.xml rename to app/src/main/res/drawable/ic_brightness_6_24dp.xml diff --git a/session/src/main/res/drawable/ic_chat_bubbles.xml b/app/src/main/res/drawable/ic_chat_bubbles.xml similarity index 100% rename from session/src/main/res/drawable/ic_chat_bubbles.xml rename to app/src/main/res/drawable/ic_chat_bubbles.xml diff --git a/session/src/main/res/drawable/ic_chevron_up.xml b/app/src/main/res/drawable/ic_chevron_up.xml similarity index 100% rename from session/src/main/res/drawable/ic_chevron_up.xml rename to app/src/main/res/drawable/ic_chevron_up.xml diff --git a/session/src/main/res/drawable/ic_circle.xml b/app/src/main/res/drawable/ic_circle.xml similarity index 100% rename from session/src/main/res/drawable/ic_circle.xml rename to app/src/main/res/drawable/ic_circle.xml diff --git a/session/src/main/res/drawable/ic_circle_check.xml b/app/src/main/res/drawable/ic_circle_check.xml similarity index 100% rename from session/src/main/res/drawable/ic_circle_check.xml rename to app/src/main/res/drawable/ic_circle_check.xml diff --git a/session/src/main/res/drawable/ic_circle_dot_dot_dot.xml b/app/src/main/res/drawable/ic_circle_dot_dot_dot.xml similarity index 100% rename from session/src/main/res/drawable/ic_circle_dot_dot_dot.xml rename to app/src/main/res/drawable/ic_circle_dot_dot_dot.xml diff --git a/session/src/main/res/drawable/ic_circle_plus.xml b/app/src/main/res/drawable/ic_circle_plus.xml similarity index 100% rename from session/src/main/res/drawable/ic_circle_plus.xml rename to app/src/main/res/drawable/ic_circle_plus.xml diff --git a/session/src/main/res/drawable/ic_crown.xml b/app/src/main/res/drawable/ic_crown.xml similarity index 100% rename from session/src/main/res/drawable/ic_crown.xml rename to app/src/main/res/drawable/ic_crown.xml diff --git a/session/src/main/res/drawable/ic_download_circle_filled_48.xml b/app/src/main/res/drawable/ic_download_circle_filled_48.xml similarity index 100% rename from session/src/main/res/drawable/ic_download_circle_filled_48.xml rename to app/src/main/res/drawable/ic_download_circle_filled_48.xml diff --git a/session/src/main/res/drawable/ic_emoji_activity_dark_20.xml b/app/src/main/res/drawable/ic_emoji_activity_dark_20.xml similarity index 100% rename from session/src/main/res/drawable/ic_emoji_activity_dark_20.xml rename to app/src/main/res/drawable/ic_emoji_activity_dark_20.xml diff --git a/session/src/main/res/drawable/ic_emoji_activity_light_20.xml b/app/src/main/res/drawable/ic_emoji_activity_light_20.xml similarity index 100% rename from session/src/main/res/drawable/ic_emoji_activity_light_20.xml rename to app/src/main/res/drawable/ic_emoji_activity_light_20.xml diff --git a/session/src/main/res/drawable/ic_emoji_animal_dark_20.xml b/app/src/main/res/drawable/ic_emoji_animal_dark_20.xml similarity index 100% rename from session/src/main/res/drawable/ic_emoji_animal_dark_20.xml rename to app/src/main/res/drawable/ic_emoji_animal_dark_20.xml diff --git a/session/src/main/res/drawable/ic_emoji_animal_light_20.xml b/app/src/main/res/drawable/ic_emoji_animal_light_20.xml similarity index 100% rename from session/src/main/res/drawable/ic_emoji_animal_light_20.xml rename to app/src/main/res/drawable/ic_emoji_animal_light_20.xml diff --git a/session/src/main/res/drawable/ic_emoji_emoticon_dark_20.xml b/app/src/main/res/drawable/ic_emoji_emoticon_dark_20.xml similarity index 100% rename from session/src/main/res/drawable/ic_emoji_emoticon_dark_20.xml rename to app/src/main/res/drawable/ic_emoji_emoticon_dark_20.xml diff --git a/session/src/main/res/drawable/ic_emoji_emoticon_light_20.xml b/app/src/main/res/drawable/ic_emoji_emoticon_light_20.xml similarity index 100% rename from session/src/main/res/drawable/ic_emoji_emoticon_light_20.xml rename to app/src/main/res/drawable/ic_emoji_emoticon_light_20.xml diff --git a/session/src/main/res/drawable/ic_emoji_filled.xml b/app/src/main/res/drawable/ic_emoji_filled.xml similarity index 100% rename from session/src/main/res/drawable/ic_emoji_filled.xml rename to app/src/main/res/drawable/ic_emoji_filled.xml diff --git a/session/src/main/res/drawable/ic_emoji_filled_keyboard_24.xml b/app/src/main/res/drawable/ic_emoji_filled_keyboard_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_emoji_filled_keyboard_24.xml rename to app/src/main/res/drawable/ic_emoji_filled_keyboard_24.xml diff --git a/session/src/main/res/drawable/ic_emoji_filled_keyboard_dark.xml b/app/src/main/res/drawable/ic_emoji_filled_keyboard_dark.xml similarity index 100% rename from session/src/main/res/drawable/ic_emoji_filled_keyboard_dark.xml rename to app/src/main/res/drawable/ic_emoji_filled_keyboard_dark.xml diff --git a/session/src/main/res/drawable/ic_emoji_filled_keyboard_light.xml b/app/src/main/res/drawable/ic_emoji_filled_keyboard_light.xml similarity index 100% rename from session/src/main/res/drawable/ic_emoji_filled_keyboard_light.xml rename to app/src/main/res/drawable/ic_emoji_filled_keyboard_light.xml diff --git a/session/src/main/res/drawable/ic_emoji_flag_dark_20.xml b/app/src/main/res/drawable/ic_emoji_flag_dark_20.xml similarity index 100% rename from session/src/main/res/drawable/ic_emoji_flag_dark_20.xml rename to app/src/main/res/drawable/ic_emoji_flag_dark_20.xml diff --git a/session/src/main/res/drawable/ic_emoji_flag_light_20.xml b/app/src/main/res/drawable/ic_emoji_flag_light_20.xml similarity index 100% rename from session/src/main/res/drawable/ic_emoji_flag_light_20.xml rename to app/src/main/res/drawable/ic_emoji_flag_light_20.xml diff --git a/session/src/main/res/drawable/ic_emoji_food_dark_20.xml b/app/src/main/res/drawable/ic_emoji_food_dark_20.xml similarity index 100% rename from session/src/main/res/drawable/ic_emoji_food_dark_20.xml rename to app/src/main/res/drawable/ic_emoji_food_dark_20.xml diff --git a/session/src/main/res/drawable/ic_emoji_food_light_20.xml b/app/src/main/res/drawable/ic_emoji_food_light_20.xml similarity index 100% rename from session/src/main/res/drawable/ic_emoji_food_light_20.xml rename to app/src/main/res/drawable/ic_emoji_food_light_20.xml diff --git a/session/src/main/res/drawable/ic_emoji_object_dark_20.xml b/app/src/main/res/drawable/ic_emoji_object_dark_20.xml similarity index 100% rename from session/src/main/res/drawable/ic_emoji_object_dark_20.xml rename to app/src/main/res/drawable/ic_emoji_object_dark_20.xml diff --git a/session/src/main/res/drawable/ic_emoji_object_light_20.xml b/app/src/main/res/drawable/ic_emoji_object_light_20.xml similarity index 100% rename from session/src/main/res/drawable/ic_emoji_object_light_20.xml rename to app/src/main/res/drawable/ic_emoji_object_light_20.xml diff --git a/session/src/main/res/drawable/ic_emoji_outline.xml b/app/src/main/res/drawable/ic_emoji_outline.xml similarity index 100% rename from session/src/main/res/drawable/ic_emoji_outline.xml rename to app/src/main/res/drawable/ic_emoji_outline.xml diff --git a/session/src/main/res/drawable/ic_emoji_outline_keyboard.xml b/app/src/main/res/drawable/ic_emoji_outline_keyboard.xml similarity index 100% rename from session/src/main/res/drawable/ic_emoji_outline_keyboard.xml rename to app/src/main/res/drawable/ic_emoji_outline_keyboard.xml diff --git a/session/src/main/res/drawable/ic_emoji_people_dark_20.xml b/app/src/main/res/drawable/ic_emoji_people_dark_20.xml similarity index 100% rename from session/src/main/res/drawable/ic_emoji_people_dark_20.xml rename to app/src/main/res/drawable/ic_emoji_people_dark_20.xml diff --git a/session/src/main/res/drawable/ic_emoji_people_light_20.xml b/app/src/main/res/drawable/ic_emoji_people_light_20.xml similarity index 100% rename from session/src/main/res/drawable/ic_emoji_people_light_20.xml rename to app/src/main/res/drawable/ic_emoji_people_light_20.xml diff --git a/session/src/main/res/drawable/ic_emoji_symbol_dark_20.xml b/app/src/main/res/drawable/ic_emoji_symbol_dark_20.xml similarity index 100% rename from session/src/main/res/drawable/ic_emoji_symbol_dark_20.xml rename to app/src/main/res/drawable/ic_emoji_symbol_dark_20.xml diff --git a/session/src/main/res/drawable/ic_emoji_symbol_light_20.xml b/app/src/main/res/drawable/ic_emoji_symbol_light_20.xml similarity index 100% rename from session/src/main/res/drawable/ic_emoji_symbol_light_20.xml rename to app/src/main/res/drawable/ic_emoji_symbol_light_20.xml diff --git a/session/src/main/res/drawable/ic_emoji_travel_dark_20.xml b/app/src/main/res/drawable/ic_emoji_travel_dark_20.xml similarity index 100% rename from session/src/main/res/drawable/ic_emoji_travel_dark_20.xml rename to app/src/main/res/drawable/ic_emoji_travel_dark_20.xml diff --git a/session/src/main/res/drawable/ic_emoji_travel_light_20.xml b/app/src/main/res/drawable/ic_emoji_travel_light_20.xml similarity index 100% rename from session/src/main/res/drawable/ic_emoji_travel_light_20.xml rename to app/src/main/res/drawable/ic_emoji_travel_light_20.xml diff --git a/session/src/main/res/drawable/ic_filled_circle_check.xml b/app/src/main/res/drawable/ic_filled_circle_check.xml similarity index 100% rename from session/src/main/res/drawable/ic_filled_circle_check.xml rename to app/src/main/res/drawable/ic_filled_circle_check.xml diff --git a/session/src/main/res/drawable/ic_forum_24dp.xml b/app/src/main/res/drawable/ic_forum_24dp.xml similarity index 100% rename from session/src/main/res/drawable/ic_forum_24dp.xml rename to app/src/main/res/drawable/ic_forum_24dp.xml diff --git a/session/src/main/res/drawable/ic_forward_outline.xml b/app/src/main/res/drawable/ic_forward_outline.xml similarity index 100% rename from session/src/main/res/drawable/ic_forward_outline.xml rename to app/src/main/res/drawable/ic_forward_outline.xml diff --git a/session/src/main/res/drawable/ic_gear.xml b/app/src/main/res/drawable/ic_gear.xml similarity index 100% rename from session/src/main/res/drawable/ic_gear.xml rename to app/src/main/res/drawable/ic_gear.xml diff --git a/session/src/main/res/drawable/ic_globe.xml b/app/src/main/res/drawable/ic_globe.xml similarity index 100% rename from session/src/main/res/drawable/ic_globe.xml rename to app/src/main/res/drawable/ic_globe.xml diff --git a/session/src/main/res/drawable/ic_group.xml b/app/src/main/res/drawable/ic_group.xml similarity index 100% rename from session/src/main/res/drawable/ic_group.xml rename to app/src/main/res/drawable/ic_group.xml diff --git a/session/src/main/res/drawable/ic_group_large.xml b/app/src/main/res/drawable/ic_group_large.xml similarity index 100% rename from session/src/main/res/drawable/ic_group_large.xml rename to app/src/main/res/drawable/ic_group_large.xml diff --git a/session/src/main/res/drawable/ic_key.xml b/app/src/main/res/drawable/ic_key.xml similarity index 100% rename from session/src/main/res/drawable/ic_key.xml rename to app/src/main/res/drawable/ic_key.xml diff --git a/session/src/main/res/drawable/ic_laptop_24dp.xml b/app/src/main/res/drawable/ic_laptop_24dp.xml similarity index 100% rename from session/src/main/res/drawable/ic_laptop_24dp.xml rename to app/src/main/res/drawable/ic_laptop_24dp.xml diff --git a/session/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml similarity index 100% rename from session/src/main/res/drawable/ic_launcher_foreground.xml rename to app/src/main/res/drawable/ic_launcher_foreground.xml diff --git a/session/src/main/res/drawable/ic_lock.xml b/app/src/main/res/drawable/ic_lock.xml similarity index 100% rename from session/src/main/res/drawable/ic_lock.xml rename to app/src/main/res/drawable/ic_lock.xml diff --git a/session/src/main/res/drawable/ic_message.xml b/app/src/main/res/drawable/ic_message.xml similarity index 100% rename from session/src/main/res/drawable/ic_message.xml rename to app/src/main/res/drawable/ic_message.xml diff --git a/session/src/main/res/drawable/ic_mic_filled_24.xml b/app/src/main/res/drawable/ic_mic_filled_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_mic_filled_24.xml rename to app/src/main/res/drawable/ic_mic_filled_24.xml diff --git a/session/src/main/res/drawable/ic_microphone.xml b/app/src/main/res/drawable/ic_microphone.xml similarity index 100% rename from session/src/main/res/drawable/ic_microphone.xml rename to app/src/main/res/drawable/ic_microphone.xml diff --git a/session/src/main/res/drawable/ic_more_horiz_white.xml b/app/src/main/res/drawable/ic_more_horiz_white.xml similarity index 100% rename from session/src/main/res/drawable/ic_more_horiz_white.xml rename to app/src/main/res/drawable/ic_more_horiz_white.xml diff --git a/session/src/main/res/drawable/ic_mute.xml b/app/src/main/res/drawable/ic_mute.xml similarity index 100% rename from session/src/main/res/drawable/ic_mute.xml rename to app/src/main/res/drawable/ic_mute.xml diff --git a/session/src/main/res/drawable/ic_notifications_24dp.xml b/app/src/main/res/drawable/ic_notifications_24dp.xml similarity index 100% rename from session/src/main/res/drawable/ic_notifications_24dp.xml rename to app/src/main/res/drawable/ic_notifications_24dp.xml diff --git a/session/src/main/res/drawable/ic_outline_info_24.xml b/app/src/main/res/drawable/ic_outline_info_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_outline_info_24.xml rename to app/src/main/res/drawable/ic_outline_info_24.xml diff --git a/session/src/main/res/drawable/ic_outline_keyboard_24.xml b/app/src/main/res/drawable/ic_outline_keyboard_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_outline_keyboard_24.xml rename to app/src/main/res/drawable/ic_outline_keyboard_24.xml diff --git a/session/src/main/res/drawable/ic_outline_night_mode_24.xml b/app/src/main/res/drawable/ic_outline_night_mode_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_outline_night_mode_24.xml rename to app/src/main/res/drawable/ic_outline_night_mode_24.xml diff --git a/session/src/main/res/drawable/ic_outline_night_mode_auto_24.xml b/app/src/main/res/drawable/ic_outline_night_mode_auto_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_outline_night_mode_auto_24.xml rename to app/src/main/res/drawable/ic_outline_night_mode_auto_24.xml diff --git a/session/src/main/res/drawable/ic_outline_notifications_off_24.xml b/app/src/main/res/drawable/ic_outline_notifications_off_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_outline_notifications_off_24.xml rename to app/src/main/res/drawable/ic_outline_notifications_off_24.xml diff --git a/session/src/main/res/drawable/ic_outline_photo_camera_24.xml b/app/src/main/res/drawable/ic_outline_photo_camera_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_outline_photo_camera_24.xml rename to app/src/main/res/drawable/ic_outline_photo_camera_24.xml diff --git a/session/src/main/res/drawable/ic_person_large.xml b/app/src/main/res/drawable/ic_person_large.xml similarity index 100% rename from session/src/main/res/drawable/ic_person_large.xml rename to app/src/main/res/drawable/ic_person_large.xml diff --git a/session/src/main/res/drawable/ic_phonelink_erase_white_24dp.xml b/app/src/main/res/drawable/ic_phonelink_erase_white_24dp.xml similarity index 100% rename from session/src/main/res/drawable/ic_phonelink_erase_white_24dp.xml rename to app/src/main/res/drawable/ic_phonelink_erase_white_24dp.xml diff --git a/session/src/main/res/drawable/ic_plus.xml b/app/src/main/res/drawable/ic_plus.xml similarity index 100% rename from session/src/main/res/drawable/ic_plus.xml rename to app/src/main/res/drawable/ic_plus.xml diff --git a/session/src/main/res/drawable/ic_plus_24.xml b/app/src/main/res/drawable/ic_plus_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_plus_24.xml rename to app/src/main/res/drawable/ic_plus_24.xml diff --git a/session/src/main/res/drawable/ic_qr_code_24.xml b/app/src/main/res/drawable/ic_qr_code_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_qr_code_24.xml rename to app/src/main/res/drawable/ic_qr_code_24.xml diff --git a/session/src/main/res/drawable/ic_question_mark.xml b/app/src/main/res/drawable/ic_question_mark.xml similarity index 100% rename from session/src/main/res/drawable/ic_question_mark.xml rename to app/src/main/res/drawable/ic_question_mark.xml diff --git a/session/src/main/res/drawable/ic_recent_dark_20.xml b/app/src/main/res/drawable/ic_recent_dark_20.xml similarity index 100% rename from session/src/main/res/drawable/ic_recent_dark_20.xml rename to app/src/main/res/drawable/ic_recent_dark_20.xml diff --git a/session/src/main/res/drawable/ic_recent_light_20.xml b/app/src/main/res/drawable/ic_recent_light_20.xml similarity index 100% rename from session/src/main/res/drawable/ic_recent_light_20.xml rename to app/src/main/res/drawable/ic_recent_light_20.xml diff --git a/session/src/main/res/drawable/ic_security_24dp.xml b/app/src/main/res/drawable/ic_security_24dp.xml similarity index 100% rename from session/src/main/res/drawable/ic_security_24dp.xml rename to app/src/main/res/drawable/ic_security_24dp.xml diff --git a/session/src/main/res/drawable/ic_sticker_filled.xml b/app/src/main/res/drawable/ic_sticker_filled.xml similarity index 100% rename from session/src/main/res/drawable/ic_sticker_filled.xml rename to app/src/main/res/drawable/ic_sticker_filled.xml diff --git a/session/src/main/res/drawable/ic_sticker_filled_keyboard_24.xml b/app/src/main/res/drawable/ic_sticker_filled_keyboard_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_sticker_filled_keyboard_24.xml rename to app/src/main/res/drawable/ic_sticker_filled_keyboard_24.xml diff --git a/session/src/main/res/drawable/ic_sticker_filled_keyboard_dark.xml b/app/src/main/res/drawable/ic_sticker_filled_keyboard_dark.xml similarity index 100% rename from session/src/main/res/drawable/ic_sticker_filled_keyboard_dark.xml rename to app/src/main/res/drawable/ic_sticker_filled_keyboard_dark.xml diff --git a/session/src/main/res/drawable/ic_sticker_filled_keyboard_light.xml b/app/src/main/res/drawable/ic_sticker_filled_keyboard_light.xml similarity index 100% rename from session/src/main/res/drawable/ic_sticker_filled_keyboard_light.xml rename to app/src/main/res/drawable/ic_sticker_filled_keyboard_light.xml diff --git a/session/src/main/res/drawable/ic_sticker_outline.xml b/app/src/main/res/drawable/ic_sticker_outline.xml similarity index 100% rename from session/src/main/res/drawable/ic_sticker_outline.xml rename to app/src/main/res/drawable/ic_sticker_outline.xml diff --git a/session/src/main/res/drawable/ic_sticker_outline_keyboard.xml b/app/src/main/res/drawable/ic_sticker_outline_keyboard.xml similarity index 100% rename from session/src/main/res/drawable/ic_sticker_outline_keyboard.xml rename to app/src/main/res/drawable/ic_sticker_outline_keyboard.xml diff --git a/session/src/main/res/drawable/ic_sun.xml b/app/src/main/res/drawable/ic_sun.xml similarity index 100% rename from session/src/main/res/drawable/ic_sun.xml rename to app/src/main/res/drawable/ic_sun.xml diff --git a/session/src/main/res/drawable/ic_textsms_24dp.xml b/app/src/main/res/drawable/ic_textsms_24dp.xml similarity index 100% rename from session/src/main/res/drawable/ic_textsms_24dp.xml rename to app/src/main/res/drawable/ic_textsms_24dp.xml diff --git a/session/src/main/res/drawable/ic_triangle_down.xml b/app/src/main/res/drawable/ic_triangle_down.xml similarity index 100% rename from session/src/main/res/drawable/ic_triangle_down.xml rename to app/src/main/res/drawable/ic_triangle_down.xml diff --git a/session/src/main/res/drawable/ic_triangle_left.xml b/app/src/main/res/drawable/ic_triangle_left.xml similarity index 100% rename from session/src/main/res/drawable/ic_triangle_left.xml rename to app/src/main/res/drawable/ic_triangle_left.xml diff --git a/session/src/main/res/drawable/ic_triangle_right.xml b/app/src/main/res/drawable/ic_triangle_right.xml similarity index 100% rename from session/src/main/res/drawable/ic_triangle_right.xml rename to app/src/main/res/drawable/ic_triangle_right.xml diff --git a/session/src/main/res/drawable/ic_triangle_up.xml b/app/src/main/res/drawable/ic_triangle_up.xml similarity index 100% rename from session/src/main/res/drawable/ic_triangle_up.xml rename to app/src/main/res/drawable/ic_triangle_up.xml diff --git a/session/src/main/res/drawable/ic_ui_mode_24.xml b/app/src/main/res/drawable/ic_ui_mode_24.xml similarity index 100% rename from session/src/main/res/drawable/ic_ui_mode_24.xml rename to app/src/main/res/drawable/ic_ui_mode_24.xml diff --git a/session/src/main/res/drawable/ic_x.xml b/app/src/main/res/drawable/ic_x.xml similarity index 100% rename from session/src/main/res/drawable/ic_x.xml rename to app/src/main/res/drawable/ic_x.xml diff --git a/session/src/main/res/drawable/icon_link.xml b/app/src/main/res/drawable/icon_link.xml similarity index 100% rename from session/src/main/res/drawable/icon_link.xml rename to app/src/main/res/drawable/icon_link.xml diff --git a/session/src/main/res/drawable/icon_seedling.xml b/app/src/main/res/drawable/icon_seedling.xml similarity index 100% rename from session/src/main/res/drawable/icon_seedling.xml rename to app/src/main/res/drawable/icon_seedling.xml diff --git a/session/src/main/res/drawable/icon_share.xml b/app/src/main/res/drawable/icon_share.xml similarity index 100% rename from session/src/main/res/drawable/icon_share.xml rename to app/src/main/res/drawable/icon_share.xml diff --git a/session/src/main/res/drawable/image_shade.xml b/app/src/main/res/drawable/image_shade.xml similarity index 100% rename from session/src/main/res/drawable/image_shade.xml rename to app/src/main/res/drawable/image_shade.xml diff --git a/session/src/main/res/drawable/import_export_item_background_dark.xml b/app/src/main/res/drawable/import_export_item_background_dark.xml similarity index 100% rename from session/src/main/res/drawable/import_export_item_background_dark.xml rename to app/src/main/res/drawable/import_export_item_background_dark.xml diff --git a/session/src/main/res/drawable/import_export_item_background_light.xml b/app/src/main/res/drawable/import_export_item_background_light.xml similarity index 100% rename from session/src/main/res/drawable/import_export_item_background_light.xml rename to app/src/main/res/drawable/import_export_item_background_light.xml diff --git a/session/src/main/res/drawable/info_round.xml b/app/src/main/res/drawable/info_round.xml similarity index 100% rename from session/src/main/res/drawable/info_round.xml rename to app/src/main/res/drawable/info_round.xml diff --git a/session/src/main/res/drawable/labeled_edit_text_background_active.xml b/app/src/main/res/drawable/labeled_edit_text_background_active.xml similarity index 100% rename from session/src/main/res/drawable/labeled_edit_text_background_active.xml rename to app/src/main/res/drawable/labeled_edit_text_background_active.xml diff --git a/session/src/main/res/drawable/labeled_edit_text_background_inactive.xml b/app/src/main/res/drawable/labeled_edit_text_background_inactive.xml similarity index 100% rename from session/src/main/res/drawable/labeled_edit_text_background_inactive.xml rename to app/src/main/res/drawable/labeled_edit_text_background_inactive.xml diff --git a/session/src/main/res/drawable/media_camera_button_background.xml b/app/src/main/res/drawable/media_camera_button_background.xml similarity index 100% rename from session/src/main/res/drawable/media_camera_button_background.xml rename to app/src/main/res/drawable/media_camera_button_background.xml diff --git a/session/src/main/res/drawable/media_count_button_background.xml b/app/src/main/res/drawable/media_count_button_background.xml similarity index 100% rename from session/src/main/res/drawable/media_count_button_background.xml rename to app/src/main/res/drawable/media_count_button_background.xml diff --git a/session/src/main/res/drawable/media_count_number_background.xml b/app/src/main/res/drawable/media_count_number_background.xml similarity index 100% rename from session/src/main/res/drawable/media_count_number_background.xml rename to app/src/main/res/drawable/media_count_number_background.xml diff --git a/session/src/main/res/drawable/media_keyboard_selected_background_dark.xml b/app/src/main/res/drawable/media_keyboard_selected_background_dark.xml similarity index 100% rename from session/src/main/res/drawable/media_keyboard_selected_background_dark.xml rename to app/src/main/res/drawable/media_keyboard_selected_background_dark.xml diff --git a/session/src/main/res/drawable/media_keyboard_selected_background_light.xml b/app/src/main/res/drawable/media_keyboard_selected_background_light.xml similarity index 100% rename from session/src/main/res/drawable/media_keyboard_selected_background_light.xml rename to app/src/main/res/drawable/media_keyboard_selected_background_light.xml diff --git a/session/src/main/res/drawable/mediapicker_item_border_dark.xml b/app/src/main/res/drawable/mediapicker_item_border_dark.xml similarity index 100% rename from session/src/main/res/drawable/mediapicker_item_border_dark.xml rename to app/src/main/res/drawable/mediapicker_item_border_dark.xml diff --git a/session/src/main/res/drawable/mediapicker_item_border_light.xml b/app/src/main/res/drawable/mediapicker_item_border_light.xml similarity index 100% rename from session/src/main/res/drawable/mediapicker_item_border_light.xml rename to app/src/main/res/drawable/mediapicker_item_border_light.xml diff --git a/session/src/main/res/drawable/mediarail_button_background.xml b/app/src/main/res/drawable/mediarail_button_background.xml similarity index 100% rename from session/src/main/res/drawable/mediarail_button_background.xml rename to app/src/main/res/drawable/mediarail_button_background.xml diff --git a/session/src/main/res/drawable/mediarail_media_outline.xml b/app/src/main/res/drawable/mediarail_media_outline.xml similarity index 100% rename from session/src/main/res/drawable/mediarail_media_outline.xml rename to app/src/main/res/drawable/mediarail_media_outline.xml diff --git a/session/src/main/res/drawable/mention_candidate_view_background.xml b/app/src/main/res/drawable/mention_candidate_view_background.xml similarity index 100% rename from session/src/main/res/drawable/mention_candidate_view_background.xml rename to app/src/main/res/drawable/mention_candidate_view_background.xml diff --git a/session/src/main/res/drawable/message_bubble_background.xml b/app/src/main/res/drawable/message_bubble_background.xml similarity index 100% rename from session/src/main/res/drawable/message_bubble_background.xml rename to app/src/main/res/drawable/message_bubble_background.xml diff --git a/session/src/main/res/drawable/message_bubble_background_received_alone.xml b/app/src/main/res/drawable/message_bubble_background_received_alone.xml similarity index 100% rename from session/src/main/res/drawable/message_bubble_background_received_alone.xml rename to app/src/main/res/drawable/message_bubble_background_received_alone.xml diff --git a/session/src/main/res/drawable/message_bubble_background_received_end.xml b/app/src/main/res/drawable/message_bubble_background_received_end.xml similarity index 100% rename from session/src/main/res/drawable/message_bubble_background_received_end.xml rename to app/src/main/res/drawable/message_bubble_background_received_end.xml diff --git a/session/src/main/res/drawable/message_bubble_background_received_middle.xml b/app/src/main/res/drawable/message_bubble_background_received_middle.xml similarity index 100% rename from session/src/main/res/drawable/message_bubble_background_received_middle.xml rename to app/src/main/res/drawable/message_bubble_background_received_middle.xml diff --git a/session/src/main/res/drawable/message_bubble_background_received_start.xml b/app/src/main/res/drawable/message_bubble_background_received_start.xml similarity index 100% rename from session/src/main/res/drawable/message_bubble_background_received_start.xml rename to app/src/main/res/drawable/message_bubble_background_received_start.xml diff --git a/session/src/main/res/drawable/message_bubble_background_sent_alone.xml b/app/src/main/res/drawable/message_bubble_background_sent_alone.xml similarity index 100% rename from session/src/main/res/drawable/message_bubble_background_sent_alone.xml rename to app/src/main/res/drawable/message_bubble_background_sent_alone.xml diff --git a/session/src/main/res/drawable/message_bubble_background_sent_end.xml b/app/src/main/res/drawable/message_bubble_background_sent_end.xml similarity index 100% rename from session/src/main/res/drawable/message_bubble_background_sent_end.xml rename to app/src/main/res/drawable/message_bubble_background_sent_end.xml diff --git a/session/src/main/res/drawable/message_bubble_background_sent_middle.xml b/app/src/main/res/drawable/message_bubble_background_sent_middle.xml similarity index 100% rename from session/src/main/res/drawable/message_bubble_background_sent_middle.xml rename to app/src/main/res/drawable/message_bubble_background_sent_middle.xml diff --git a/session/src/main/res/drawable/message_bubble_background_sent_start.xml b/app/src/main/res/drawable/message_bubble_background_sent_start.xml similarity index 100% rename from session/src/main/res/drawable/message_bubble_background_sent_start.xml rename to app/src/main/res/drawable/message_bubble_background_sent_start.xml diff --git a/session/src/main/res/drawable/new_conversation_button_background.xml b/app/src/main/res/drawable/new_conversation_button_background.xml similarity index 100% rename from session/src/main/res/drawable/new_conversation_button_background.xml rename to app/src/main/res/drawable/new_conversation_button_background.xml diff --git a/session/src/main/res/drawable/notify_panel_notification_icon_bg_tile.xml b/app/src/main/res/drawable/notify_panel_notification_icon_bg_tile.xml similarity index 100% rename from session/src/main/res/drawable/notify_panel_notification_icon_bg_tile.xml rename to app/src/main/res/drawable/notify_panel_notification_icon_bg_tile.xml diff --git a/session/src/main/res/drawable/paths_building_dot.xml b/app/src/main/res/drawable/paths_building_dot.xml similarity index 100% rename from session/src/main/res/drawable/paths_building_dot.xml rename to app/src/main/res/drawable/paths_building_dot.xml diff --git a/session/src/main/res/drawable/pause_icon.xml b/app/src/main/res/drawable/pause_icon.xml similarity index 100% rename from session/src/main/res/drawable/pause_icon.xml rename to app/src/main/res/drawable/pause_icon.xml diff --git a/session/src/main/res/drawable/pause_to_play_animation.xml b/app/src/main/res/drawable/pause_to_play_animation.xml similarity index 100% rename from session/src/main/res/drawable/pause_to_play_animation.xml rename to app/src/main/res/drawable/pause_to_play_animation.xml diff --git a/session/src/main/res/drawable/permission_rationale_dialog_corners.xml b/app/src/main/res/drawable/permission_rationale_dialog_corners.xml similarity index 100% rename from session/src/main/res/drawable/permission_rationale_dialog_corners.xml rename to app/src/main/res/drawable/permission_rationale_dialog_corners.xml diff --git a/session/src/main/res/drawable/pill.xml b/app/src/main/res/drawable/pill.xml similarity index 100% rename from session/src/main/res/drawable/pill.xml rename to app/src/main/res/drawable/pill.xml diff --git a/session/src/main/res/drawable/play_icon.xml b/app/src/main/res/drawable/play_icon.xml similarity index 100% rename from session/src/main/res/drawable/play_icon.xml rename to app/src/main/res/drawable/play_icon.xml diff --git a/session/src/main/res/drawable/play_to_pause_animation.xml b/app/src/main/res/drawable/play_to_pause_animation.xml similarity index 100% rename from session/src/main/res/drawable/play_to_pause_animation.xml rename to app/src/main/res/drawable/play_to_pause_animation.xml diff --git a/session/src/main/res/drawable/pn_option_background.xml b/app/src/main/res/drawable/pn_option_background.xml similarity index 100% rename from session/src/main/res/drawable/pn_option_background.xml rename to app/src/main/res/drawable/pn_option_background.xml diff --git a/session/src/main/res/drawable/pn_option_background_deselect_transition.xml b/app/src/main/res/drawable/pn_option_background_deselect_transition.xml similarity index 100% rename from session/src/main/res/drawable/pn_option_background_deselect_transition.xml rename to app/src/main/res/drawable/pn_option_background_deselect_transition.xml diff --git a/session/src/main/res/drawable/pn_option_background_select_transition.xml b/app/src/main/res/drawable/pn_option_background_select_transition.xml similarity index 100% rename from session/src/main/res/drawable/pn_option_background_select_transition.xml rename to app/src/main/res/drawable/pn_option_background_select_transition.xml diff --git a/session/src/main/res/drawable/pn_option_background_selected.xml b/app/src/main/res/drawable/pn_option_background_selected.xml similarity index 100% rename from session/src/main/res/drawable/pn_option_background_selected.xml rename to app/src/main/res/drawable/pn_option_background_selected.xml diff --git a/session/src/main/res/drawable/preference_divider_dark.xml b/app/src/main/res/drawable/preference_divider_dark.xml similarity index 100% rename from session/src/main/res/drawable/preference_divider_dark.xml rename to app/src/main/res/drawable/preference_divider_dark.xml diff --git a/session/src/main/res/drawable/preference_divider_light.xml b/app/src/main/res/drawable/preference_divider_light.xml similarity index 100% rename from session/src/main/res/drawable/preference_divider_light.xml rename to app/src/main/res/drawable/preference_divider_light.xml diff --git a/session/src/main/res/drawable/profile_picture_view_large_background.xml b/app/src/main/res/drawable/profile_picture_view_large_background.xml similarity index 100% rename from session/src/main/res/drawable/profile_picture_view_large_background.xml rename to app/src/main/res/drawable/profile_picture_view_large_background.xml diff --git a/session/src/main/res/drawable/profile_picture_view_large_foreground.xml b/app/src/main/res/drawable/profile_picture_view_large_foreground.xml similarity index 100% rename from session/src/main/res/drawable/profile_picture_view_large_foreground.xml rename to app/src/main/res/drawable/profile_picture_view_large_foreground.xml diff --git a/session/src/main/res/drawable/profile_picture_view_medium_background.xml b/app/src/main/res/drawable/profile_picture_view_medium_background.xml similarity index 100% rename from session/src/main/res/drawable/profile_picture_view_medium_background.xml rename to app/src/main/res/drawable/profile_picture_view_medium_background.xml diff --git a/session/src/main/res/drawable/profile_picture_view_medium_foreground.xml b/app/src/main/res/drawable/profile_picture_view_medium_foreground.xml similarity index 100% rename from session/src/main/res/drawable/profile_picture_view_medium_foreground.xml rename to app/src/main/res/drawable/profile_picture_view_medium_foreground.xml diff --git a/session/src/main/res/drawable/profile_picture_view_rss_medium_background.xml b/app/src/main/res/drawable/profile_picture_view_rss_medium_background.xml similarity index 100% rename from session/src/main/res/drawable/profile_picture_view_rss_medium_background.xml rename to app/src/main/res/drawable/profile_picture_view_rss_medium_background.xml diff --git a/session/src/main/res/drawable/profile_picture_view_small_background.xml b/app/src/main/res/drawable/profile_picture_view_small_background.xml similarity index 100% rename from session/src/main/res/drawable/profile_picture_view_small_background.xml rename to app/src/main/res/drawable/profile_picture_view_small_background.xml diff --git a/session/src/main/res/drawable/profile_picture_view_small_foreground.xml b/app/src/main/res/drawable/profile_picture_view_small_foreground.xml similarity index 100% rename from session/src/main/res/drawable/profile_picture_view_small_foreground.xml rename to app/src/main/res/drawable/profile_picture_view_small_foreground.xml diff --git a/session/src/main/res/drawable/progress_button_state.xml b/app/src/main/res/drawable/progress_button_state.xml similarity index 100% rename from session/src/main/res/drawable/progress_button_state.xml rename to app/src/main/res/drawable/progress_button_state.xml diff --git a/session/src/main/res/drawable/prominent_dialog_button_background.xml b/app/src/main/res/drawable/prominent_dialog_button_background.xml similarity index 100% rename from session/src/main/res/drawable/prominent_dialog_button_background.xml rename to app/src/main/res/drawable/prominent_dialog_button_background.xml diff --git a/session/src/main/res/drawable/prominent_filled_button_medium_background.xml b/app/src/main/res/drawable/prominent_filled_button_medium_background.xml similarity index 100% rename from session/src/main/res/drawable/prominent_filled_button_medium_background.xml rename to app/src/main/res/drawable/prominent_filled_button_medium_background.xml diff --git a/session/src/main/res/drawable/prominent_outline_button_medium_background.xml b/app/src/main/res/drawable/prominent_outline_button_medium_background.xml similarity index 100% rename from session/src/main/res/drawable/prominent_outline_button_medium_background.xml rename to app/src/main/res/drawable/prominent_outline_button_medium_background.xml diff --git a/session/src/main/res/drawable/qr_code_background.xml b/app/src/main/res/drawable/qr_code_background.xml similarity index 100% rename from session/src/main/res/drawable/qr_code_background.xml rename to app/src/main/res/drawable/qr_code_background.xml diff --git a/session/src/main/res/drawable/quick_camera_shutter_ring.xml b/app/src/main/res/drawable/quick_camera_shutter_ring.xml similarity index 100% rename from session/src/main/res/drawable/quick_camera_shutter_ring.xml rename to app/src/main/res/drawable/quick_camera_shutter_ring.xml diff --git a/session/src/main/res/drawable/read_receipt_vector.xml b/app/src/main/res/drawable/read_receipt_vector.xml similarity index 100% rename from session/src/main/res/drawable/read_receipt_vector.xml rename to app/src/main/res/drawable/read_receipt_vector.xml diff --git a/session/src/main/res/drawable/recipient_preference_scrim_bottom.xml b/app/src/main/res/drawable/recipient_preference_scrim_bottom.xml similarity index 100% rename from session/src/main/res/drawable/recipient_preference_scrim_bottom.xml rename to app/src/main/res/drawable/recipient_preference_scrim_bottom.xml diff --git a/session/src/main/res/drawable/recipient_preference_scrim_top.xml b/app/src/main/res/drawable/recipient_preference_scrim_top.xml similarity index 100% rename from session/src/main/res/drawable/recipient_preference_scrim_top.xml rename to app/src/main/res/drawable/recipient_preference_scrim_top.xml diff --git a/session/src/main/res/drawable/recycler_view_fast_scroller_bubble.xml b/app/src/main/res/drawable/recycler_view_fast_scroller_bubble.xml similarity index 100% rename from session/src/main/res/drawable/recycler_view_fast_scroller_bubble.xml rename to app/src/main/res/drawable/recycler_view_fast_scroller_bubble.xml diff --git a/session/src/main/res/drawable/recycler_view_fast_scroller_handle.xml b/app/src/main/res/drawable/recycler_view_fast_scroller_handle.xml similarity index 100% rename from session/src/main/res/drawable/recycler_view_fast_scroller_handle.xml rename to app/src/main/res/drawable/recycler_view_fast_scroller_handle.xml diff --git a/session/src/main/res/drawable/reminder_background_error.xml b/app/src/main/res/drawable/reminder_background_error.xml similarity index 100% rename from session/src/main/res/drawable/reminder_background_error.xml rename to app/src/main/res/drawable/reminder_background_error.xml diff --git a/session/src/main/res/drawable/reminder_background_normal.xml b/app/src/main/res/drawable/reminder_background_normal.xml similarity index 100% rename from session/src/main/res/drawable/reminder_background_normal.xml rename to app/src/main/res/drawable/reminder_background_normal.xml diff --git a/session/src/main/res/drawable/remove_button_state.xml b/app/src/main/res/drawable/remove_button_state.xml similarity index 100% rename from session/src/main/res/drawable/remove_button_state.xml rename to app/src/main/res/drawable/remove_button_state.xml diff --git a/session/src/main/res/drawable/rounded_rectangle_dark.xml b/app/src/main/res/drawable/rounded_rectangle_dark.xml similarity index 100% rename from session/src/main/res/drawable/rounded_rectangle_dark.xml rename to app/src/main/res/drawable/rounded_rectangle_dark.xml diff --git a/session/src/main/res/drawable/rounded_rectangle_white.xml b/app/src/main/res/drawable/rounded_rectangle_white.xml similarity index 100% rename from session/src/main/res/drawable/rounded_rectangle_white.xml rename to app/src/main/res/drawable/rounded_rectangle_white.xml diff --git a/session/src/main/res/drawable/scroll_to_bottom_button_background.xml b/app/src/main/res/drawable/scroll_to_bottom_button_background.xml similarity index 100% rename from session/src/main/res/drawable/scroll_to_bottom_button_background.xml rename to app/src/main/res/drawable/scroll_to_bottom_button_background.xml diff --git a/session/src/main/res/drawable/search_toolbar_shadow.xml b/app/src/main/res/drawable/search_toolbar_shadow.xml similarity index 100% rename from session/src/main/res/drawable/search_toolbar_shadow.xml rename to app/src/main/res/drawable/search_toolbar_shadow.xml diff --git a/session/src/main/res/drawable/session_edit_text_background.xml b/app/src/main/res/drawable/session_edit_text_background.xml similarity index 100% rename from session/src/main/res/drawable/session_edit_text_background.xml rename to app/src/main/res/drawable/session_edit_text_background.xml diff --git a/session/src/main/res/drawable/session_edit_text_cursor.xml b/app/src/main/res/drawable/session_edit_text_cursor.xml similarity index 100% rename from session/src/main/res/drawable/session_edit_text_cursor.xml rename to app/src/main/res/drawable/session_edit_text_cursor.xml diff --git a/session/src/main/res/drawable/session_id_text_view_background.xml b/app/src/main/res/drawable/session_id_text_view_background.xml similarity index 100% rename from session/src/main/res/drawable/session_id_text_view_background.xml rename to app/src/main/res/drawable/session_id_text_view_background.xml diff --git a/session/src/main/res/drawable/session_logo.xml b/app/src/main/res/drawable/session_logo.xml similarity index 100% rename from session/src/main/res/drawable/session_logo.xml rename to app/src/main/res/drawable/session_logo.xml diff --git a/session/src/main/res/drawable/session_logo_white.xml b/app/src/main/res/drawable/session_logo_white.xml similarity index 100% rename from session/src/main/res/drawable/session_logo_white.xml rename to app/src/main/res/drawable/session_logo_white.xml diff --git a/session/src/main/res/drawable/setting_button_background.xml b/app/src/main/res/drawable/setting_button_background.xml similarity index 100% rename from session/src/main/res/drawable/setting_button_background.xml rename to app/src/main/res/drawable/setting_button_background.xml diff --git a/session/src/main/res/drawable/sticker_button_dark.xml b/app/src/main/res/drawable/sticker_button_dark.xml similarity index 100% rename from session/src/main/res/drawable/sticker_button_dark.xml rename to app/src/main/res/drawable/sticker_button_dark.xml diff --git a/session/src/main/res/drawable/sticker_button_light.xml b/app/src/main/res/drawable/sticker_button_light.xml similarity index 100% rename from session/src/main/res/drawable/sticker_button_light.xml rename to app/src/main/res/drawable/sticker_button_light.xml diff --git a/session/src/main/res/drawable/sticker_management_empty_background.xml b/app/src/main/res/drawable/sticker_management_empty_background.xml similarity index 100% rename from session/src/main/res/drawable/sticker_management_empty_background.xml rename to app/src/main/res/drawable/sticker_management_empty_background.xml diff --git a/session/src/main/res/drawable/sticker_missing_background_dark.xml b/app/src/main/res/drawable/sticker_missing_background_dark.xml similarity index 100% rename from session/src/main/res/drawable/sticker_missing_background_dark.xml rename to app/src/main/res/drawable/sticker_missing_background_dark.xml diff --git a/session/src/main/res/drawable/sticker_missing_background_light.xml b/app/src/main/res/drawable/sticker_missing_background_light.xml similarity index 100% rename from session/src/main/res/drawable/sticker_missing_background_light.xml rename to app/src/main/res/drawable/sticker_missing_background_light.xml diff --git a/session/src/main/res/drawable/sticky_date_header_background_dark.xml b/app/src/main/res/drawable/sticky_date_header_background_dark.xml similarity index 100% rename from session/src/main/res/drawable/sticky_date_header_background_dark.xml rename to app/src/main/res/drawable/sticky_date_header_background_dark.xml diff --git a/session/src/main/res/drawable/sticky_date_header_background_light.xml b/app/src/main/res/drawable/sticky_date_header_background_light.xml similarity index 100% rename from session/src/main/res/drawable/sticky_date_header_background_light.xml rename to app/src/main/res/drawable/sticky_date_header_background_light.xml diff --git a/session/src/main/res/drawable/tooltip_background.xml b/app/src/main/res/drawable/tooltip_background.xml similarity index 100% rename from session/src/main/res/drawable/tooltip_background.xml rename to app/src/main/res/drawable/tooltip_background.xml diff --git a/session/src/main/res/drawable/touch_highlight_background.xml b/app/src/main/res/drawable/touch_highlight_background.xml similarity index 100% rename from session/src/main/res/drawable/touch_highlight_background.xml rename to app/src/main/res/drawable/touch_highlight_background.xml diff --git a/session/src/main/res/drawable/transfer_controls_background.xml b/app/src/main/res/drawable/transfer_controls_background.xml similarity index 100% rename from session/src/main/res/drawable/transfer_controls_background.xml rename to app/src/main/res/drawable/transfer_controls_background.xml diff --git a/session/src/main/res/drawable/triangle_bottom_right_corner.xml b/app/src/main/res/drawable/triangle_bottom_right_corner.xml similarity index 100% rename from session/src/main/res/drawable/triangle_bottom_right_corner.xml rename to app/src/main/res/drawable/triangle_bottom_right_corner.xml diff --git a/session/src/main/res/drawable/triangle_right.xml b/app/src/main/res/drawable/triangle_right.xml similarity index 100% rename from session/src/main/res/drawable/triangle_right.xml rename to app/src/main/res/drawable/triangle_right.xml diff --git a/session/src/main/res/drawable/unimportant_dialog_button_background.xml b/app/src/main/res/drawable/unimportant_dialog_button_background.xml similarity index 100% rename from session/src/main/res/drawable/unimportant_dialog_button_background.xml rename to app/src/main/res/drawable/unimportant_dialog_button_background.xml diff --git a/session/src/main/res/drawable/unimportant_filled_button_medium_background.xml b/app/src/main/res/drawable/unimportant_filled_button_medium_background.xml similarity index 100% rename from session/src/main/res/drawable/unimportant_filled_button_medium_background.xml rename to app/src/main/res/drawable/unimportant_filled_button_medium_background.xml diff --git a/session/src/main/res/drawable/unimportant_outline_button_medium_background.xml b/app/src/main/res/drawable/unimportant_outline_button_medium_background.xml similarity index 100% rename from session/src/main/res/drawable/unimportant_outline_button_medium_background.xml rename to app/src/main/res/drawable/unimportant_outline_button_medium_background.xml diff --git a/session/src/main/res/drawable/unread_count_background_dark.xml b/app/src/main/res/drawable/unread_count_background_dark.xml similarity index 100% rename from session/src/main/res/drawable/unread_count_background_dark.xml rename to app/src/main/res/drawable/unread_count_background_dark.xml diff --git a/session/src/main/res/drawable/unread_count_background_light.xml b/app/src/main/res/drawable/unread_count_background_light.xml similarity index 100% rename from session/src/main/res/drawable/unread_count_background_light.xml rename to app/src/main/res/drawable/unread_count_background_light.xml diff --git a/session/src/main/res/drawable/webrtc_bluetooth_button.xml b/app/src/main/res/drawable/webrtc_bluetooth_button.xml similarity index 100% rename from session/src/main/res/drawable/webrtc_bluetooth_button.xml rename to app/src/main/res/drawable/webrtc_bluetooth_button.xml diff --git a/session/src/main/res/drawable/webrtc_camera_front_button.xml b/app/src/main/res/drawable/webrtc_camera_front_button.xml similarity index 100% rename from session/src/main/res/drawable/webrtc_camera_front_button.xml rename to app/src/main/res/drawable/webrtc_camera_front_button.xml diff --git a/session/src/main/res/drawable/webrtc_camera_rear_button.xml b/app/src/main/res/drawable/webrtc_camera_rear_button.xml similarity index 100% rename from session/src/main/res/drawable/webrtc_camera_rear_button.xml rename to app/src/main/res/drawable/webrtc_camera_rear_button.xml diff --git a/session/src/main/res/drawable/webrtc_control_background.xml b/app/src/main/res/drawable/webrtc_control_background.xml similarity index 100% rename from session/src/main/res/drawable/webrtc_control_background.xml rename to app/src/main/res/drawable/webrtc_control_background.xml diff --git a/session/src/main/res/drawable/webrtc_mute_button.xml b/app/src/main/res/drawable/webrtc_mute_button.xml similarity index 100% rename from session/src/main/res/drawable/webrtc_mute_button.xml rename to app/src/main/res/drawable/webrtc_mute_button.xml diff --git a/session/src/main/res/drawable/webrtc_speaker_button.xml b/app/src/main/res/drawable/webrtc_speaker_button.xml similarity index 100% rename from session/src/main/res/drawable/webrtc_speaker_button.xml rename to app/src/main/res/drawable/webrtc_speaker_button.xml diff --git a/session/src/main/res/drawable/webrtc_video_mute_button.xml b/app/src/main/res/drawable/webrtc_video_mute_button.xml similarity index 100% rename from session/src/main/res/drawable/webrtc_video_mute_button.xml rename to app/src/main/res/drawable/webrtc_video_mute_button.xml diff --git a/session/src/main/res/font/roboto_light.ttf b/app/src/main/res/font/roboto_light.ttf similarity index 100% rename from session/src/main/res/font/roboto_light.ttf rename to app/src/main/res/font/roboto_light.ttf diff --git a/session/src/main/res/font/space_mono_bold.ttf b/app/src/main/res/font/space_mono_bold.ttf similarity index 100% rename from session/src/main/res/font/space_mono_bold.ttf rename to app/src/main/res/font/space_mono_bold.ttf diff --git a/session/src/main/res/font/space_mono_regular.ttf b/app/src/main/res/font/space_mono_regular.ttf similarity index 100% rename from session/src/main/res/font/space_mono_regular.ttf rename to app/src/main/res/font/space_mono_regular.ttf diff --git a/session/src/main/res/layout-sw400dp/activity_display_name.xml b/app/src/main/res/layout-sw400dp/activity_display_name.xml similarity index 100% rename from session/src/main/res/layout-sw400dp/activity_display_name.xml rename to app/src/main/res/layout-sw400dp/activity_display_name.xml diff --git a/session/src/main/res/layout-sw400dp/activity_landing.xml b/app/src/main/res/layout-sw400dp/activity_landing.xml similarity index 100% rename from session/src/main/res/layout-sw400dp/activity_landing.xml rename to app/src/main/res/layout-sw400dp/activity_landing.xml diff --git a/session/src/main/res/layout-sw400dp/activity_pn_mode.xml b/app/src/main/res/layout-sw400dp/activity_pn_mode.xml similarity index 100% rename from session/src/main/res/layout-sw400dp/activity_pn_mode.xml rename to app/src/main/res/layout-sw400dp/activity_pn_mode.xml diff --git a/session/src/main/res/layout-sw400dp/activity_register.xml b/app/src/main/res/layout-sw400dp/activity_register.xml similarity index 100% rename from session/src/main/res/layout-sw400dp/activity_register.xml rename to app/src/main/res/layout-sw400dp/activity_register.xml diff --git a/session/src/main/res/layout-sw400dp/activity_restore.xml b/app/src/main/res/layout-sw400dp/activity_restore.xml similarity index 100% rename from session/src/main/res/layout-sw400dp/activity_restore.xml rename to app/src/main/res/layout-sw400dp/activity_restore.xml diff --git a/session/src/main/res/layout-sw400dp/activity_seed.xml b/app/src/main/res/layout-sw400dp/activity_seed.xml similarity index 100% rename from session/src/main/res/layout-sw400dp/activity_seed.xml rename to app/src/main/res/layout-sw400dp/activity_seed.xml diff --git a/session/src/main/res/layout-sw400dp/fragment_enter_chat_url.xml b/app/src/main/res/layout-sw400dp/fragment_enter_chat_url.xml similarity index 100% rename from session/src/main/res/layout-sw400dp/fragment_enter_chat_url.xml rename to app/src/main/res/layout-sw400dp/fragment_enter_chat_url.xml diff --git a/session/src/main/res/layout-sw400dp/fragment_enter_public_key.xml b/app/src/main/res/layout-sw400dp/fragment_enter_public_key.xml similarity index 100% rename from session/src/main/res/layout-sw400dp/fragment_enter_public_key.xml rename to app/src/main/res/layout-sw400dp/fragment_enter_public_key.xml diff --git a/session/src/main/res/layout-sw400dp/view_seed_reminder.xml b/app/src/main/res/layout-sw400dp/view_seed_reminder.xml similarity index 100% rename from session/src/main/res/layout-sw400dp/view_seed_reminder.xml rename to app/src/main/res/layout-sw400dp/view_seed_reminder.xml diff --git a/session/src/main/res/layout-sw420dp/fragment_enter_session_id.xml b/app/src/main/res/layout-sw420dp/fragment_enter_session_id.xml similarity index 100% rename from session/src/main/res/layout-sw420dp/fragment_enter_session_id.xml rename to app/src/main/res/layout-sw420dp/fragment_enter_session_id.xml diff --git a/session/src/main/res/layout/activity_add_public_chat.xml b/app/src/main/res/layout/activity_add_public_chat.xml similarity index 100% rename from session/src/main/res/layout/activity_add_public_chat.xml rename to app/src/main/res/layout/activity_add_public_chat.xml diff --git a/session/src/main/res/layout/activity_backup_restore.xml b/app/src/main/res/layout/activity_backup_restore.xml similarity index 100% rename from session/src/main/res/layout/activity_backup_restore.xml rename to app/src/main/res/layout/activity_backup_restore.xml diff --git a/session/src/main/res/layout/activity_contact_name_edit.xml b/app/src/main/res/layout/activity_contact_name_edit.xml similarity index 100% rename from session/src/main/res/layout/activity_contact_name_edit.xml rename to app/src/main/res/layout/activity_contact_name_edit.xml diff --git a/session/src/main/res/layout/activity_contact_share_edit.xml b/app/src/main/res/layout/activity_contact_share_edit.xml similarity index 100% rename from session/src/main/res/layout/activity_contact_share_edit.xml rename to app/src/main/res/layout/activity_contact_share_edit.xml diff --git a/session/src/main/res/layout/activity_create_closed_group.xml b/app/src/main/res/layout/activity_create_closed_group.xml similarity index 100% rename from session/src/main/res/layout/activity_create_closed_group.xml rename to app/src/main/res/layout/activity_create_closed_group.xml diff --git a/session/src/main/res/layout/activity_create_private_chat.xml b/app/src/main/res/layout/activity_create_private_chat.xml similarity index 100% rename from session/src/main/res/layout/activity_create_private_chat.xml rename to app/src/main/res/layout/activity_create_private_chat.xml diff --git a/session/src/main/res/layout/activity_display_name.xml b/app/src/main/res/layout/activity_display_name.xml similarity index 100% rename from session/src/main/res/layout/activity_display_name.xml rename to app/src/main/res/layout/activity_display_name.xml diff --git a/session/src/main/res/layout/activity_edit_closed_group.xml b/app/src/main/res/layout/activity_edit_closed_group.xml similarity index 100% rename from session/src/main/res/layout/activity_edit_closed_group.xml rename to app/src/main/res/layout/activity_edit_closed_group.xml diff --git a/session/src/main/res/layout/activity_fragment_wrapper.xml b/app/src/main/res/layout/activity_fragment_wrapper.xml similarity index 100% rename from session/src/main/res/layout/activity_fragment_wrapper.xml rename to app/src/main/res/layout/activity_fragment_wrapper.xml diff --git a/session/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml similarity index 100% rename from session/src/main/res/layout/activity_home.xml rename to app/src/main/res/layout/activity_home.xml diff --git a/session/src/main/res/layout/activity_join_public_chat.xml b/app/src/main/res/layout/activity_join_public_chat.xml similarity index 100% rename from session/src/main/res/layout/activity_join_public_chat.xml rename to app/src/main/res/layout/activity_join_public_chat.xml diff --git a/session/src/main/res/layout/activity_landing.xml b/app/src/main/res/layout/activity_landing.xml similarity index 100% rename from session/src/main/res/layout/activity_landing.xml rename to app/src/main/res/layout/activity_landing.xml diff --git a/session/src/main/res/layout/activity_link_device.xml b/app/src/main/res/layout/activity_link_device.xml similarity index 100% rename from session/src/main/res/layout/activity_link_device.xml rename to app/src/main/res/layout/activity_link_device.xml diff --git a/session/src/main/res/layout/activity_linked_devices.xml b/app/src/main/res/layout/activity_linked_devices.xml similarity index 100% rename from session/src/main/res/layout/activity_linked_devices.xml rename to app/src/main/res/layout/activity_linked_devices.xml diff --git a/session/src/main/res/layout/activity_path.xml b/app/src/main/res/layout/activity_path.xml similarity index 100% rename from session/src/main/res/layout/activity_path.xml rename to app/src/main/res/layout/activity_path.xml diff --git a/session/src/main/res/layout/activity_pn_mode.xml b/app/src/main/res/layout/activity_pn_mode.xml similarity index 100% rename from session/src/main/res/layout/activity_pn_mode.xml rename to app/src/main/res/layout/activity_pn_mode.xml diff --git a/session/src/main/res/layout/activity_qr_code.xml b/app/src/main/res/layout/activity_qr_code.xml similarity index 100% rename from session/src/main/res/layout/activity_qr_code.xml rename to app/src/main/res/layout/activity_qr_code.xml diff --git a/session/src/main/res/layout/activity_register.xml b/app/src/main/res/layout/activity_register.xml similarity index 100% rename from session/src/main/res/layout/activity_register.xml rename to app/src/main/res/layout/activity_register.xml diff --git a/session/src/main/res/layout/activity_restore.xml b/app/src/main/res/layout/activity_restore.xml similarity index 100% rename from session/src/main/res/layout/activity_restore.xml rename to app/src/main/res/layout/activity_restore.xml diff --git a/session/src/main/res/layout/activity_seed.xml b/app/src/main/res/layout/activity_seed.xml similarity index 100% rename from session/src/main/res/layout/activity_seed.xml rename to app/src/main/res/layout/activity_seed.xml diff --git a/session/src/main/res/layout/activity_select_contacts.xml b/app/src/main/res/layout/activity_select_contacts.xml similarity index 100% rename from session/src/main/res/layout/activity_select_contacts.xml rename to app/src/main/res/layout/activity_select_contacts.xml diff --git a/session/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml similarity index 100% rename from session/src/main/res/layout/activity_settings.xml rename to app/src/main/res/layout/activity_settings.xml diff --git a/session/src/main/res/layout/activity_shared_contact_details.xml b/app/src/main/res/layout/activity_shared_contact_details.xml similarity index 100% rename from session/src/main/res/layout/activity_shared_contact_details.xml rename to app/src/main/res/layout/activity_shared_contact_details.xml diff --git a/session/src/main/res/layout/album_thumbnail_2.xml b/app/src/main/res/layout/album_thumbnail_2.xml similarity index 100% rename from session/src/main/res/layout/album_thumbnail_2.xml rename to app/src/main/res/layout/album_thumbnail_2.xml diff --git a/session/src/main/res/layout/album_thumbnail_3.xml b/app/src/main/res/layout/album_thumbnail_3.xml similarity index 100% rename from session/src/main/res/layout/album_thumbnail_3.xml rename to app/src/main/res/layout/album_thumbnail_3.xml diff --git a/session/src/main/res/layout/album_thumbnail_4.xml b/app/src/main/res/layout/album_thumbnail_4.xml similarity index 100% rename from session/src/main/res/layout/album_thumbnail_4.xml rename to app/src/main/res/layout/album_thumbnail_4.xml diff --git a/session/src/main/res/layout/album_thumbnail_5.xml b/app/src/main/res/layout/album_thumbnail_5.xml similarity index 100% rename from session/src/main/res/layout/album_thumbnail_5.xml rename to app/src/main/res/layout/album_thumbnail_5.xml diff --git a/session/src/main/res/layout/album_thumbnail_many.xml b/app/src/main/res/layout/album_thumbnail_many.xml similarity index 100% rename from session/src/main/res/layout/album_thumbnail_many.xml rename to app/src/main/res/layout/album_thumbnail_many.xml diff --git a/session/src/main/res/layout/album_thumbnail_view.xml b/app/src/main/res/layout/album_thumbnail_view.xml similarity index 100% rename from session/src/main/res/layout/album_thumbnail_view.xml rename to app/src/main/res/layout/album_thumbnail_view.xml diff --git a/session/src/main/res/layout/alert_view.xml b/app/src/main/res/layout/alert_view.xml similarity index 100% rename from session/src/main/res/layout/alert_view.xml rename to app/src/main/res/layout/alert_view.xml diff --git a/session/src/main/res/layout/attachment_type_selector.xml b/app/src/main/res/layout/attachment_type_selector.xml similarity index 100% rename from session/src/main/res/layout/attachment_type_selector.xml rename to app/src/main/res/layout/attachment_type_selector.xml diff --git a/session/src/main/res/layout/backup_enable_dialog.xml b/app/src/main/res/layout/backup_enable_dialog.xml similarity index 100% rename from session/src/main/res/layout/backup_enable_dialog.xml rename to app/src/main/res/layout/backup_enable_dialog.xml diff --git a/session/src/main/res/layout/blocked_contact_list_item.xml b/app/src/main/res/layout/blocked_contact_list_item.xml similarity index 100% rename from session/src/main/res/layout/blocked_contact_list_item.xml rename to app/src/main/res/layout/blocked_contact_list_item.xml diff --git a/session/src/main/res/layout/blocked_contacts_fragment.xml b/app/src/main/res/layout/blocked_contacts_fragment.xml similarity index 100% rename from session/src/main/res/layout/blocked_contacts_fragment.xml rename to app/src/main/res/layout/blocked_contacts_fragment.xml diff --git a/session/src/main/res/layout/camera_activity.xml b/app/src/main/res/layout/camera_activity.xml similarity index 100% rename from session/src/main/res/layout/camera_activity.xml rename to app/src/main/res/layout/camera_activity.xml diff --git a/session/src/main/res/layout/camera_controls_landscape.xml b/app/src/main/res/layout/camera_controls_landscape.xml similarity index 100% rename from session/src/main/res/layout/camera_controls_landscape.xml rename to app/src/main/res/layout/camera_controls_landscape.xml diff --git a/session/src/main/res/layout/camera_controls_portrait.xml b/app/src/main/res/layout/camera_controls_portrait.xml similarity index 100% rename from session/src/main/res/layout/camera_controls_portrait.xml rename to app/src/main/res/layout/camera_controls_portrait.xml diff --git a/session/src/main/res/layout/camera_fragment.xml b/app/src/main/res/layout/camera_fragment.xml similarity index 100% rename from session/src/main/res/layout/camera_fragment.xml rename to app/src/main/res/layout/camera_fragment.xml diff --git a/session/src/main/res/layout/captcha_activity.xml b/app/src/main/res/layout/captcha_activity.xml similarity index 100% rename from session/src/main/res/layout/captcha_activity.xml rename to app/src/main/res/layout/captcha_activity.xml diff --git a/session/src/main/res/layout/change_passphrase_activity.xml b/app/src/main/res/layout/change_passphrase_activity.xml similarity index 100% rename from session/src/main/res/layout/change_passphrase_activity.xml rename to app/src/main/res/layout/change_passphrase_activity.xml diff --git a/session/src/main/res/layout/color_fragment.xml b/app/src/main/res/layout/color_fragment.xml similarity index 100% rename from session/src/main/res/layout/color_fragment.xml rename to app/src/main/res/layout/color_fragment.xml diff --git a/session/src/main/res/layout/contact_filter_toolbar.xml b/app/src/main/res/layout/contact_filter_toolbar.xml similarity index 100% rename from session/src/main/res/layout/contact_filter_toolbar.xml rename to app/src/main/res/layout/contact_filter_toolbar.xml diff --git a/session/src/main/res/layout/contact_selection_activity.xml b/app/src/main/res/layout/contact_selection_activity.xml similarity index 100% rename from session/src/main/res/layout/contact_selection_activity.xml rename to app/src/main/res/layout/contact_selection_activity.xml diff --git a/session/src/main/res/layout/contact_selection_list_divider.xml b/app/src/main/res/layout/contact_selection_list_divider.xml similarity index 100% rename from session/src/main/res/layout/contact_selection_list_divider.xml rename to app/src/main/res/layout/contact_selection_list_divider.xml diff --git a/session/src/main/res/layout/contact_selection_list_fragment.xml b/app/src/main/res/layout/contact_selection_list_fragment.xml similarity index 100% rename from session/src/main/res/layout/contact_selection_list_fragment.xml rename to app/src/main/res/layout/contact_selection_list_fragment.xml diff --git a/session/src/main/res/layout/contact_selection_recyclerview_header.xml b/app/src/main/res/layout/contact_selection_recyclerview_header.xml similarity index 100% rename from session/src/main/res/layout/contact_selection_recyclerview_header.xml rename to app/src/main/res/layout/contact_selection_recyclerview_header.xml diff --git a/session/src/main/res/layout/conversation_activity.xml b/app/src/main/res/layout/conversation_activity.xml similarity index 100% rename from session/src/main/res/layout/conversation_activity.xml rename to app/src/main/res/layout/conversation_activity.xml diff --git a/session/src/main/res/layout/conversation_activity_attachment_editor_stub.xml b/app/src/main/res/layout/conversation_activity_attachment_editor_stub.xml similarity index 100% rename from session/src/main/res/layout/conversation_activity_attachment_editor_stub.xml rename to app/src/main/res/layout/conversation_activity_attachment_editor_stub.xml diff --git a/session/src/main/res/layout/conversation_activity_emojidrawer_stub.xml b/app/src/main/res/layout/conversation_activity_emojidrawer_stub.xml similarity index 100% rename from session/src/main/res/layout/conversation_activity_emojidrawer_stub.xml rename to app/src/main/res/layout/conversation_activity_emojidrawer_stub.xml diff --git a/session/src/main/res/layout/conversation_activity_group_share_profile_stub.xml b/app/src/main/res/layout/conversation_activity_group_share_profile_stub.xml similarity index 100% rename from session/src/main/res/layout/conversation_activity_group_share_profile_stub.xml rename to app/src/main/res/layout/conversation_activity_group_share_profile_stub.xml diff --git a/session/src/main/res/layout/conversation_activity_reminderview_stub.xml b/app/src/main/res/layout/conversation_activity_reminderview_stub.xml similarity index 100% rename from session/src/main/res/layout/conversation_activity_reminderview_stub.xml rename to app/src/main/res/layout/conversation_activity_reminderview_stub.xml diff --git a/session/src/main/res/layout/conversation_activity_unverified_banner_stub.xml b/app/src/main/res/layout/conversation_activity_unverified_banner_stub.xml similarity index 100% rename from session/src/main/res/layout/conversation_activity_unverified_banner_stub.xml rename to app/src/main/res/layout/conversation_activity_unverified_banner_stub.xml diff --git a/session/src/main/res/layout/conversation_fragment.xml b/app/src/main/res/layout/conversation_fragment.xml similarity index 100% rename from session/src/main/res/layout/conversation_fragment.xml rename to app/src/main/res/layout/conversation_fragment.xml diff --git a/session/src/main/res/layout/conversation_input_panel.xml b/app/src/main/res/layout/conversation_input_panel.xml similarity index 100% rename from session/src/main/res/layout/conversation_input_panel.xml rename to app/src/main/res/layout/conversation_input_panel.xml diff --git a/session/src/main/res/layout/conversation_item_footer.xml b/app/src/main/res/layout/conversation_item_footer.xml similarity index 100% rename from session/src/main/res/layout/conversation_item_footer.xml rename to app/src/main/res/layout/conversation_item_footer.xml diff --git a/session/src/main/res/layout/conversation_item_header.xml b/app/src/main/res/layout/conversation_item_header.xml similarity index 100% rename from session/src/main/res/layout/conversation_item_header.xml rename to app/src/main/res/layout/conversation_item_header.xml diff --git a/session/src/main/res/layout/conversation_item_last_seen.xml b/app/src/main/res/layout/conversation_item_last_seen.xml similarity index 100% rename from session/src/main/res/layout/conversation_item_last_seen.xml rename to app/src/main/res/layout/conversation_item_last_seen.xml diff --git a/session/src/main/res/layout/conversation_item_received.xml b/app/src/main/res/layout/conversation_item_received.xml similarity index 100% rename from session/src/main/res/layout/conversation_item_received.xml rename to app/src/main/res/layout/conversation_item_received.xml diff --git a/session/src/main/res/layout/conversation_item_received_audio.xml b/app/src/main/res/layout/conversation_item_received_audio.xml similarity index 100% rename from session/src/main/res/layout/conversation_item_received_audio.xml rename to app/src/main/res/layout/conversation_item_received_audio.xml diff --git a/session/src/main/res/layout/conversation_item_received_document.xml b/app/src/main/res/layout/conversation_item_received_document.xml similarity index 100% rename from session/src/main/res/layout/conversation_item_received_document.xml rename to app/src/main/res/layout/conversation_item_received_document.xml diff --git a/session/src/main/res/layout/conversation_item_received_link_preview.xml b/app/src/main/res/layout/conversation_item_received_link_preview.xml similarity index 100% rename from session/src/main/res/layout/conversation_item_received_link_preview.xml rename to app/src/main/res/layout/conversation_item_received_link_preview.xml diff --git a/session/src/main/res/layout/conversation_item_received_shared_contact.xml b/app/src/main/res/layout/conversation_item_received_shared_contact.xml similarity index 100% rename from session/src/main/res/layout/conversation_item_received_shared_contact.xml rename to app/src/main/res/layout/conversation_item_received_shared_contact.xml diff --git a/session/src/main/res/layout/conversation_item_received_sticker.xml b/app/src/main/res/layout/conversation_item_received_sticker.xml similarity index 100% rename from session/src/main/res/layout/conversation_item_received_sticker.xml rename to app/src/main/res/layout/conversation_item_received_sticker.xml diff --git a/session/src/main/res/layout/conversation_item_received_thumbnail.xml b/app/src/main/res/layout/conversation_item_received_thumbnail.xml similarity index 100% rename from session/src/main/res/layout/conversation_item_received_thumbnail.xml rename to app/src/main/res/layout/conversation_item_received_thumbnail.xml diff --git a/session/src/main/res/layout/conversation_item_sent.xml b/app/src/main/res/layout/conversation_item_sent.xml similarity index 100% rename from session/src/main/res/layout/conversation_item_sent.xml rename to app/src/main/res/layout/conversation_item_sent.xml diff --git a/session/src/main/res/layout/conversation_item_sent_audio.xml b/app/src/main/res/layout/conversation_item_sent_audio.xml similarity index 100% rename from session/src/main/res/layout/conversation_item_sent_audio.xml rename to app/src/main/res/layout/conversation_item_sent_audio.xml diff --git a/session/src/main/res/layout/conversation_item_sent_document.xml b/app/src/main/res/layout/conversation_item_sent_document.xml similarity index 100% rename from session/src/main/res/layout/conversation_item_sent_document.xml rename to app/src/main/res/layout/conversation_item_sent_document.xml diff --git a/session/src/main/res/layout/conversation_item_sent_link_preview.xml b/app/src/main/res/layout/conversation_item_sent_link_preview.xml similarity index 100% rename from session/src/main/res/layout/conversation_item_sent_link_preview.xml rename to app/src/main/res/layout/conversation_item_sent_link_preview.xml diff --git a/session/src/main/res/layout/conversation_item_sent_shared_contact.xml b/app/src/main/res/layout/conversation_item_sent_shared_contact.xml similarity index 100% rename from session/src/main/res/layout/conversation_item_sent_shared_contact.xml rename to app/src/main/res/layout/conversation_item_sent_shared_contact.xml diff --git a/session/src/main/res/layout/conversation_item_sent_sticker.xml b/app/src/main/res/layout/conversation_item_sent_sticker.xml similarity index 100% rename from session/src/main/res/layout/conversation_item_sent_sticker.xml rename to app/src/main/res/layout/conversation_item_sent_sticker.xml diff --git a/session/src/main/res/layout/conversation_item_sent_thumbnail.xml b/app/src/main/res/layout/conversation_item_sent_thumbnail.xml similarity index 100% rename from session/src/main/res/layout/conversation_item_sent_thumbnail.xml rename to app/src/main/res/layout/conversation_item_sent_thumbnail.xml diff --git a/session/src/main/res/layout/conversation_item_thumbnail.xml b/app/src/main/res/layout/conversation_item_thumbnail.xml similarity index 100% rename from session/src/main/res/layout/conversation_item_thumbnail.xml rename to app/src/main/res/layout/conversation_item_thumbnail.xml diff --git a/session/src/main/res/layout/conversation_item_update.xml b/app/src/main/res/layout/conversation_item_update.xml similarity index 100% rename from session/src/main/res/layout/conversation_item_update.xml rename to app/src/main/res/layout/conversation_item_update.xml diff --git a/session/src/main/res/layout/conversation_list_activity.xml b/app/src/main/res/layout/conversation_list_activity.xml similarity index 100% rename from session/src/main/res/layout/conversation_list_activity.xml rename to app/src/main/res/layout/conversation_list_activity.xml diff --git a/session/src/main/res/layout/conversation_list_fragment.xml b/app/src/main/res/layout/conversation_list_fragment.xml similarity index 100% rename from session/src/main/res/layout/conversation_list_fragment.xml rename to app/src/main/res/layout/conversation_list_fragment.xml diff --git a/session/src/main/res/layout/conversation_list_item_action.xml b/app/src/main/res/layout/conversation_list_item_action.xml similarity index 100% rename from session/src/main/res/layout/conversation_list_item_action.xml rename to app/src/main/res/layout/conversation_list_item_action.xml diff --git a/session/src/main/res/layout/conversation_list_item_inbox_zero.xml b/app/src/main/res/layout/conversation_list_item_inbox_zero.xml similarity index 100% rename from session/src/main/res/layout/conversation_list_item_inbox_zero.xml rename to app/src/main/res/layout/conversation_list_item_inbox_zero.xml diff --git a/session/src/main/res/layout/conversation_list_item_view.xml b/app/src/main/res/layout/conversation_list_item_view.xml similarity index 100% rename from session/src/main/res/layout/conversation_list_item_view.xml rename to app/src/main/res/layout/conversation_list_item_view.xml diff --git a/session/src/main/res/layout/conversation_search_nav.xml b/app/src/main/res/layout/conversation_search_nav.xml similarity index 100% rename from session/src/main/res/layout/conversation_search_nav.xml rename to app/src/main/res/layout/conversation_search_nav.xml diff --git a/session/src/main/res/layout/conversation_title_view.xml b/app/src/main/res/layout/conversation_title_view.xml similarity index 100% rename from session/src/main/res/layout/conversation_title_view.xml rename to app/src/main/res/layout/conversation_title_view.xml diff --git a/session/src/main/res/layout/conversation_typing_view.xml b/app/src/main/res/layout/conversation_typing_view.xml similarity index 100% rename from session/src/main/res/layout/conversation_typing_view.xml rename to app/src/main/res/layout/conversation_typing_view.xml diff --git a/session/src/main/res/layout/country_code_text.xml b/app/src/main/res/layout/country_code_text.xml similarity index 100% rename from session/src/main/res/layout/country_code_text.xml rename to app/src/main/res/layout/country_code_text.xml diff --git a/session/src/main/res/layout/country_list_item.xml b/app/src/main/res/layout/country_list_item.xml similarity index 100% rename from session/src/main/res/layout/country_list_item.xml rename to app/src/main/res/layout/country_list_item.xml diff --git a/session/src/main/res/layout/country_selection.xml b/app/src/main/res/layout/country_selection.xml similarity index 100% rename from session/src/main/res/layout/country_selection.xml rename to app/src/main/res/layout/country_selection.xml diff --git a/session/src/main/res/layout/country_selection_fragment.xml b/app/src/main/res/layout/country_selection_fragment.xml similarity index 100% rename from session/src/main/res/layout/country_selection_fragment.xml rename to app/src/main/res/layout/country_selection_fragment.xml diff --git a/session/src/main/res/layout/create_passphrase_activity.xml b/app/src/main/res/layout/create_passphrase_activity.xml similarity index 100% rename from session/src/main/res/layout/create_passphrase_activity.xml rename to app/src/main/res/layout/create_passphrase_activity.xml diff --git a/session/src/main/res/layout/custom_default_preference_dialog.xml b/app/src/main/res/layout/custom_default_preference_dialog.xml similarity index 100% rename from session/src/main/res/layout/custom_default_preference_dialog.xml rename to app/src/main/res/layout/custom_default_preference_dialog.xml diff --git a/session/src/main/res/layout/database_migration_activity.xml b/app/src/main/res/layout/database_migration_activity.xml similarity index 100% rename from session/src/main/res/layout/database_migration_activity.xml rename to app/src/main/res/layout/database_migration_activity.xml diff --git a/session/src/main/res/layout/database_upgrade_activity.xml b/app/src/main/res/layout/database_upgrade_activity.xml similarity index 100% rename from session/src/main/res/layout/database_upgrade_activity.xml rename to app/src/main/res/layout/database_upgrade_activity.xml diff --git a/session/src/main/res/layout/delivery_status_view.xml b/app/src/main/res/layout/delivery_status_view.xml similarity index 100% rename from session/src/main/res/layout/delivery_status_view.xml rename to app/src/main/res/layout/delivery_status_view.xml diff --git a/session/src/main/res/layout/device_add_fragment.xml b/app/src/main/res/layout/device_add_fragment.xml similarity index 100% rename from session/src/main/res/layout/device_add_fragment.xml rename to app/src/main/res/layout/device_add_fragment.xml diff --git a/session/src/main/res/layout/device_link_fragment.xml b/app/src/main/res/layout/device_link_fragment.xml similarity index 100% rename from session/src/main/res/layout/device_link_fragment.xml rename to app/src/main/res/layout/device_link_fragment.xml diff --git a/session/src/main/res/layout/device_list_fragment.xml b/app/src/main/res/layout/device_list_fragment.xml similarity index 100% rename from session/src/main/res/layout/device_list_fragment.xml rename to app/src/main/res/layout/device_list_fragment.xml diff --git a/session/src/main/res/layout/device_list_item_view.xml b/app/src/main/res/layout/device_list_item_view.xml similarity index 100% rename from session/src/main/res/layout/device_list_item_view.xml rename to app/src/main/res/layout/device_list_item_view.xml diff --git a/session/src/main/res/layout/dialog_clear_all_data.xml b/app/src/main/res/layout/dialog_clear_all_data.xml similarity index 100% rename from session/src/main/res/layout/dialog_clear_all_data.xml rename to app/src/main/res/layout/dialog_clear_all_data.xml diff --git a/session/src/main/res/layout/dialog_edit_device_name.xml b/app/src/main/res/layout/dialog_edit_device_name.xml similarity index 100% rename from session/src/main/res/layout/dialog_edit_device_name.xml rename to app/src/main/res/layout/dialog_edit_device_name.xml diff --git a/session/src/main/res/layout/dialog_link_device_master_mode.xml b/app/src/main/res/layout/dialog_link_device_master_mode.xml similarity index 100% rename from session/src/main/res/layout/dialog_link_device_master_mode.xml rename to app/src/main/res/layout/dialog_link_device_master_mode.xml diff --git a/session/src/main/res/layout/dialog_link_device_slave_mode.xml b/app/src/main/res/layout/dialog_link_device_slave_mode.xml similarity index 100% rename from session/src/main/res/layout/dialog_link_device_slave_mode.xml rename to app/src/main/res/layout/dialog_link_device_slave_mode.xml diff --git a/session/src/main/res/layout/dialog_seed.xml b/app/src/main/res/layout/dialog_seed.xml similarity index 100% rename from session/src/main/res/layout/dialog_seed.xml rename to app/src/main/res/layout/dialog_seed.xml diff --git a/session/src/main/res/layout/document_view.xml b/app/src/main/res/layout/document_view.xml similarity index 100% rename from session/src/main/res/layout/document_view.xml rename to app/src/main/res/layout/document_view.xml diff --git a/session/src/main/res/layout/emoji_display_item.xml b/app/src/main/res/layout/emoji_display_item.xml similarity index 100% rename from session/src/main/res/layout/emoji_display_item.xml rename to app/src/main/res/layout/emoji_display_item.xml diff --git a/session/src/main/res/layout/emoji_grid_layout.xml b/app/src/main/res/layout/emoji_grid_layout.xml similarity index 100% rename from session/src/main/res/layout/emoji_grid_layout.xml rename to app/src/main/res/layout/emoji_grid_layout.xml diff --git a/session/src/main/res/layout/emoji_keyboard_icon_dark.xml b/app/src/main/res/layout/emoji_keyboard_icon_dark.xml similarity index 100% rename from session/src/main/res/layout/emoji_keyboard_icon_dark.xml rename to app/src/main/res/layout/emoji_keyboard_icon_dark.xml diff --git a/session/src/main/res/layout/emoji_keyboard_icon_dark_selected.xml b/app/src/main/res/layout/emoji_keyboard_icon_dark_selected.xml similarity index 100% rename from session/src/main/res/layout/emoji_keyboard_icon_dark_selected.xml rename to app/src/main/res/layout/emoji_keyboard_icon_dark_selected.xml diff --git a/session/src/main/res/layout/emoji_keyboard_icon_light.xml b/app/src/main/res/layout/emoji_keyboard_icon_light.xml similarity index 100% rename from session/src/main/res/layout/emoji_keyboard_icon_light.xml rename to app/src/main/res/layout/emoji_keyboard_icon_light.xml diff --git a/session/src/main/res/layout/emoji_keyboard_icon_light_selected.xml b/app/src/main/res/layout/emoji_keyboard_icon_light_selected.xml similarity index 100% rename from session/src/main/res/layout/emoji_keyboard_icon_light_selected.xml rename to app/src/main/res/layout/emoji_keyboard_icon_light_selected.xml diff --git a/session/src/main/res/layout/emoji_variation_selector.xml b/app/src/main/res/layout/emoji_variation_selector.xml similarity index 100% rename from session/src/main/res/layout/emoji_variation_selector.xml rename to app/src/main/res/layout/emoji_variation_selector.xml diff --git a/session/src/main/res/layout/emoji_variation_selector_item.xml b/app/src/main/res/layout/emoji_variation_selector_item.xml similarity index 100% rename from session/src/main/res/layout/emoji_variation_selector_item.xml rename to app/src/main/res/layout/emoji_variation_selector_item.xml diff --git a/session/src/main/res/layout/enter_backup_passphrase_dialog.xml b/app/src/main/res/layout/enter_backup_passphrase_dialog.xml similarity index 100% rename from session/src/main/res/layout/enter_backup_passphrase_dialog.xml rename to app/src/main/res/layout/enter_backup_passphrase_dialog.xml diff --git a/session/src/main/res/layout/experience_upgrade_activity.xml b/app/src/main/res/layout/experience_upgrade_activity.xml similarity index 100% rename from session/src/main/res/layout/experience_upgrade_activity.xml rename to app/src/main/res/layout/experience_upgrade_activity.xml diff --git a/session/src/main/res/layout/experience_upgrade_link_previews_fragment.xml b/app/src/main/res/layout/experience_upgrade_link_previews_fragment.xml similarity index 100% rename from session/src/main/res/layout/experience_upgrade_link_previews_fragment.xml rename to app/src/main/res/layout/experience_upgrade_link_previews_fragment.xml diff --git a/session/src/main/res/layout/experience_upgrade_preference_fragment.xml b/app/src/main/res/layout/experience_upgrade_preference_fragment.xml similarity index 100% rename from session/src/main/res/layout/experience_upgrade_preference_fragment.xml rename to app/src/main/res/layout/experience_upgrade_preference_fragment.xml diff --git a/session/src/main/res/layout/experience_upgrade_typing_indicators_fragment.xml b/app/src/main/res/layout/experience_upgrade_typing_indicators_fragment.xml similarity index 100% rename from session/src/main/res/layout/experience_upgrade_typing_indicators_fragment.xml rename to app/src/main/res/layout/experience_upgrade_typing_indicators_fragment.xml diff --git a/session/src/main/res/layout/expiration_dialog.xml b/app/src/main/res/layout/expiration_dialog.xml similarity index 100% rename from session/src/main/res/layout/expiration_dialog.xml rename to app/src/main/res/layout/expiration_dialog.xml diff --git a/session/src/main/res/layout/expiration_timer_menu.xml b/app/src/main/res/layout/expiration_timer_menu.xml similarity index 100% rename from session/src/main/res/layout/expiration_timer_menu.xml rename to app/src/main/res/layout/expiration_timer_menu.xml diff --git a/session/src/main/res/layout/fragment_closed_group_edit_bottom_sheet.xml b/app/src/main/res/layout/fragment_closed_group_edit_bottom_sheet.xml similarity index 100% rename from session/src/main/res/layout/fragment_closed_group_edit_bottom_sheet.xml rename to app/src/main/res/layout/fragment_closed_group_edit_bottom_sheet.xml diff --git a/session/src/main/res/layout/fragment_conversation_bottom_sheet.xml b/app/src/main/res/layout/fragment_conversation_bottom_sheet.xml similarity index 100% rename from session/src/main/res/layout/fragment_conversation_bottom_sheet.xml rename to app/src/main/res/layout/fragment_conversation_bottom_sheet.xml diff --git a/session/src/main/res/layout/fragment_device_list_bottom_sheet.xml b/app/src/main/res/layout/fragment_device_list_bottom_sheet.xml similarity index 100% rename from session/src/main/res/layout/fragment_device_list_bottom_sheet.xml rename to app/src/main/res/layout/fragment_device_list_bottom_sheet.xml diff --git a/session/src/main/res/layout/fragment_enter_chat_url.xml b/app/src/main/res/layout/fragment_enter_chat_url.xml similarity index 100% rename from session/src/main/res/layout/fragment_enter_chat_url.xml rename to app/src/main/res/layout/fragment_enter_chat_url.xml diff --git a/session/src/main/res/layout/fragment_enter_public_key.xml b/app/src/main/res/layout/fragment_enter_public_key.xml similarity index 100% rename from session/src/main/res/layout/fragment_enter_public_key.xml rename to app/src/main/res/layout/fragment_enter_public_key.xml diff --git a/session/src/main/res/layout/fragment_enter_session_id.xml b/app/src/main/res/layout/fragment_enter_session_id.xml similarity index 100% rename from session/src/main/res/layout/fragment_enter_session_id.xml rename to app/src/main/res/layout/fragment_enter_session_id.xml diff --git a/session/src/main/res/layout/fragment_light_theme_feature_intro_bottom_sheet.xml b/app/src/main/res/layout/fragment_light_theme_feature_intro_bottom_sheet.xml similarity index 100% rename from session/src/main/res/layout/fragment_light_theme_feature_intro_bottom_sheet.xml rename to app/src/main/res/layout/fragment_light_theme_feature_intro_bottom_sheet.xml diff --git a/session/src/main/res/layout/fragment_multi_device_removal_bottom_sheet.xml b/app/src/main/res/layout/fragment_multi_device_removal_bottom_sheet.xml similarity index 100% rename from session/src/main/res/layout/fragment_multi_device_removal_bottom_sheet.xml rename to app/src/main/res/layout/fragment_multi_device_removal_bottom_sheet.xml diff --git a/session/src/main/res/layout/fragment_new_conversation.xml b/app/src/main/res/layout/fragment_new_conversation.xml similarity index 100% rename from session/src/main/res/layout/fragment_new_conversation.xml rename to app/src/main/res/layout/fragment_new_conversation.xml diff --git a/session/src/main/res/layout/fragment_open_group_suggestion_bottom_sheet.xml b/app/src/main/res/layout/fragment_open_group_suggestion_bottom_sheet.xml similarity index 100% rename from session/src/main/res/layout/fragment_open_group_suggestion_bottom_sheet.xml rename to app/src/main/res/layout/fragment_open_group_suggestion_bottom_sheet.xml diff --git a/session/src/main/res/layout/fragment_scan_qr_code.xml b/app/src/main/res/layout/fragment_scan_qr_code.xml similarity index 100% rename from session/src/main/res/layout/fragment_scan_qr_code.xml rename to app/src/main/res/layout/fragment_scan_qr_code.xml diff --git a/session/src/main/res/layout/fragment_scan_qr_code_placeholder.xml b/app/src/main/res/layout/fragment_scan_qr_code_placeholder.xml similarity index 100% rename from session/src/main/res/layout/fragment_scan_qr_code_placeholder.xml rename to app/src/main/res/layout/fragment_scan_qr_code_placeholder.xml diff --git a/session/src/main/res/layout/fragment_scan_qr_code_wrapper.xml b/app/src/main/res/layout/fragment_scan_qr_code_wrapper.xml similarity index 100% rename from session/src/main/res/layout/fragment_scan_qr_code_wrapper.xml rename to app/src/main/res/layout/fragment_scan_qr_code_wrapper.xml diff --git a/session/src/main/res/layout/fragment_search.xml b/app/src/main/res/layout/fragment_search.xml similarity index 100% rename from session/src/main/res/layout/fragment_search.xml rename to app/src/main/res/layout/fragment_search.xml diff --git a/session/src/main/res/layout/fragment_submit_log.xml b/app/src/main/res/layout/fragment_submit_log.xml similarity index 100% rename from session/src/main/res/layout/fragment_submit_log.xml rename to app/src/main/res/layout/fragment_submit_log.xml diff --git a/session/src/main/res/layout/fragment_user_details_bottom_sheet.xml b/app/src/main/res/layout/fragment_user_details_bottom_sheet.xml similarity index 100% rename from session/src/main/res/layout/fragment_user_details_bottom_sheet.xml rename to app/src/main/res/layout/fragment_user_details_bottom_sheet.xml diff --git a/session/src/main/res/layout/fragment_view_my_qr_code.xml b/app/src/main/res/layout/fragment_view_my_qr_code.xml similarity index 100% rename from session/src/main/res/layout/fragment_view_my_qr_code.xml rename to app/src/main/res/layout/fragment_view_my_qr_code.xml diff --git a/session/src/main/res/layout/giphy_activity.xml b/app/src/main/res/layout/giphy_activity.xml similarity index 100% rename from session/src/main/res/layout/giphy_activity.xml rename to app/src/main/res/layout/giphy_activity.xml diff --git a/session/src/main/res/layout/giphy_activity_toolbar.xml b/app/src/main/res/layout/giphy_activity_toolbar.xml similarity index 100% rename from session/src/main/res/layout/giphy_activity_toolbar.xml rename to app/src/main/res/layout/giphy_activity_toolbar.xml diff --git a/session/src/main/res/layout/giphy_fragment.xml b/app/src/main/res/layout/giphy_fragment.xml similarity index 100% rename from session/src/main/res/layout/giphy_fragment.xml rename to app/src/main/res/layout/giphy_fragment.xml diff --git a/session/src/main/res/layout/giphy_thumbnail.xml b/app/src/main/res/layout/giphy_thumbnail.xml similarity index 100% rename from session/src/main/res/layout/giphy_thumbnail.xml rename to app/src/main/res/layout/giphy_thumbnail.xml diff --git a/session/src/main/res/layout/group_create_activity.xml b/app/src/main/res/layout/group_create_activity.xml similarity index 100% rename from session/src/main/res/layout/group_create_activity.xml rename to app/src/main/res/layout/group_create_activity.xml diff --git a/session/src/main/res/layout/image_editor_fragment.xml b/app/src/main/res/layout/image_editor_fragment.xml similarity index 100% rename from session/src/main/res/layout/image_editor_fragment.xml rename to app/src/main/res/layout/image_editor_fragment.xml diff --git a/session/src/main/res/layout/image_editor_hud.xml b/app/src/main/res/layout/image_editor_hud.xml similarity index 100% rename from session/src/main/res/layout/image_editor_hud.xml rename to app/src/main/res/layout/image_editor_hud.xml diff --git a/session/src/main/res/layout/invite_activity.xml b/app/src/main/res/layout/invite_activity.xml similarity index 100% rename from session/src/main/res/layout/invite_activity.xml rename to app/src/main/res/layout/invite_activity.xml diff --git a/session/src/main/res/layout/item_color.xml b/app/src/main/res/layout/item_color.xml similarity index 100% rename from session/src/main/res/layout/item_color.xml rename to app/src/main/res/layout/item_color.xml diff --git a/session/src/main/res/layout/item_editable_contact.xml b/app/src/main/res/layout/item_editable_contact.xml similarity index 100% rename from session/src/main/res/layout/item_editable_contact.xml rename to app/src/main/res/layout/item_editable_contact.xml diff --git a/session/src/main/res/layout/item_log_preview.xml b/app/src/main/res/layout/item_log_preview.xml similarity index 100% rename from session/src/main/res/layout/item_log_preview.xml rename to app/src/main/res/layout/item_log_preview.xml diff --git a/session/src/main/res/layout/item_selectable_contact_field.xml b/app/src/main/res/layout/item_selectable_contact_field.xml similarity index 100% rename from session/src/main/res/layout/item_selectable_contact_field.xml rename to app/src/main/res/layout/item_selectable_contact_field.xml diff --git a/session/src/main/res/layout/key_caching_notification.xml b/app/src/main/res/layout/key_caching_notification.xml similarity index 100% rename from session/src/main/res/layout/key_caching_notification.xml rename to app/src/main/res/layout/key_caching_notification.xml diff --git a/session/src/main/res/layout/labeled_edit_text.xml b/app/src/main/res/layout/labeled_edit_text.xml similarity index 100% rename from session/src/main/res/layout/labeled_edit_text.xml rename to app/src/main/res/layout/labeled_edit_text.xml diff --git a/session/src/main/res/layout/labeled_edit_text_default.xml b/app/src/main/res/layout/labeled_edit_text_default.xml similarity index 100% rename from session/src/main/res/layout/labeled_edit_text_default.xml rename to app/src/main/res/layout/labeled_edit_text_default.xml diff --git a/session/src/main/res/layout/led_color_preference_widget.xml b/app/src/main/res/layout/led_color_preference_widget.xml similarity index 100% rename from session/src/main/res/layout/led_color_preference_widget.xml rename to app/src/main/res/layout/led_color_preference_widget.xml diff --git a/session/src/main/res/layout/link_preview.xml b/app/src/main/res/layout/link_preview.xml similarity index 100% rename from session/src/main/res/layout/link_preview.xml rename to app/src/main/res/layout/link_preview.xml diff --git a/session/src/main/res/layout/load_more_header.xml b/app/src/main/res/layout/load_more_header.xml similarity index 100% rename from session/src/main/res/layout/load_more_header.xml rename to app/src/main/res/layout/load_more_header.xml diff --git a/session/src/main/res/layout/log_submit_activity.xml b/app/src/main/res/layout/log_submit_activity.xml similarity index 100% rename from session/src/main/res/layout/log_submit_activity.xml rename to app/src/main/res/layout/log_submit_activity.xml diff --git a/session/src/main/res/layout/longmessage_activity.xml b/app/src/main/res/layout/longmessage_activity.xml similarity index 100% rename from session/src/main/res/layout/longmessage_activity.xml rename to app/src/main/res/layout/longmessage_activity.xml diff --git a/session/src/main/res/layout/longmessage_bubble_received.xml b/app/src/main/res/layout/longmessage_bubble_received.xml similarity index 100% rename from session/src/main/res/layout/longmessage_bubble_received.xml rename to app/src/main/res/layout/longmessage_bubble_received.xml diff --git a/session/src/main/res/layout/longmessage_bubble_sent.xml b/app/src/main/res/layout/longmessage_bubble_sent.xml similarity index 100% rename from session/src/main/res/layout/longmessage_bubble_sent.xml rename to app/src/main/res/layout/longmessage_bubble_sent.xml diff --git a/session/src/main/res/layout/media_keyboard.xml b/app/src/main/res/layout/media_keyboard.xml similarity index 100% rename from session/src/main/res/layout/media_keyboard.xml rename to app/src/main/res/layout/media_keyboard.xml diff --git a/session/src/main/res/layout/media_keyboard_bottom_tab_item.xml b/app/src/main/res/layout/media_keyboard_bottom_tab_item.xml similarity index 100% rename from session/src/main/res/layout/media_keyboard_bottom_tab_item.xml rename to app/src/main/res/layout/media_keyboard_bottom_tab_item.xml diff --git a/session/src/main/res/layout/media_overview_activity.xml b/app/src/main/res/layout/media_overview_activity.xml similarity index 100% rename from session/src/main/res/layout/media_overview_activity.xml rename to app/src/main/res/layout/media_overview_activity.xml diff --git a/session/src/main/res/layout/media_overview_document_item.xml b/app/src/main/res/layout/media_overview_document_item.xml similarity index 100% rename from session/src/main/res/layout/media_overview_document_item.xml rename to app/src/main/res/layout/media_overview_document_item.xml diff --git a/session/src/main/res/layout/media_overview_document_item_header.xml b/app/src/main/res/layout/media_overview_document_item_header.xml similarity index 100% rename from session/src/main/res/layout/media_overview_document_item_header.xml rename to app/src/main/res/layout/media_overview_document_item_header.xml diff --git a/session/src/main/res/layout/media_overview_documents_fragment.xml b/app/src/main/res/layout/media_overview_documents_fragment.xml similarity index 100% rename from session/src/main/res/layout/media_overview_documents_fragment.xml rename to app/src/main/res/layout/media_overview_documents_fragment.xml diff --git a/session/src/main/res/layout/media_overview_gallery_fragment.xml b/app/src/main/res/layout/media_overview_gallery_fragment.xml similarity index 100% rename from session/src/main/res/layout/media_overview_gallery_fragment.xml rename to app/src/main/res/layout/media_overview_gallery_fragment.xml diff --git a/session/src/main/res/layout/media_overview_gallery_item.xml b/app/src/main/res/layout/media_overview_gallery_item.xml similarity index 100% rename from session/src/main/res/layout/media_overview_gallery_item.xml rename to app/src/main/res/layout/media_overview_gallery_item.xml diff --git a/session/src/main/res/layout/media_overview_gallery_item_header.xml b/app/src/main/res/layout/media_overview_gallery_item_header.xml similarity index 100% rename from session/src/main/res/layout/media_overview_gallery_item_header.xml rename to app/src/main/res/layout/media_overview_gallery_item_header.xml diff --git a/session/src/main/res/layout/media_preview_activity.xml b/app/src/main/res/layout/media_preview_activity.xml similarity index 100% rename from session/src/main/res/layout/media_preview_activity.xml rename to app/src/main/res/layout/media_preview_activity.xml diff --git a/session/src/main/res/layout/media_preview_exoplayer_layout.xml b/app/src/main/res/layout/media_preview_exoplayer_layout.xml similarity index 100% rename from session/src/main/res/layout/media_preview_exoplayer_layout.xml rename to app/src/main/res/layout/media_preview_exoplayer_layout.xml diff --git a/session/src/main/res/layout/media_view.xml b/app/src/main/res/layout/media_view.xml similarity index 100% rename from session/src/main/res/layout/media_view.xml rename to app/src/main/res/layout/media_view.xml diff --git a/session/src/main/res/layout/media_view_edit_button.xml b/app/src/main/res/layout/media_view_edit_button.xml similarity index 100% rename from session/src/main/res/layout/media_view_edit_button.xml rename to app/src/main/res/layout/media_view_edit_button.xml diff --git a/session/src/main/res/layout/media_view_page.xml b/app/src/main/res/layout/media_view_page.xml similarity index 100% rename from session/src/main/res/layout/media_view_page.xml rename to app/src/main/res/layout/media_view_page.xml diff --git a/session/src/main/res/layout/media_view_remove_button.xml b/app/src/main/res/layout/media_view_remove_button.xml similarity index 100% rename from session/src/main/res/layout/media_view_remove_button.xml rename to app/src/main/res/layout/media_view_remove_button.xml diff --git a/session/src/main/res/layout/media_view_video.xml b/app/src/main/res/layout/media_view_video.xml similarity index 100% rename from session/src/main/res/layout/media_view_video.xml rename to app/src/main/res/layout/media_view_video.xml diff --git a/session/src/main/res/layout/mediapicker_folder_fragment.xml b/app/src/main/res/layout/mediapicker_folder_fragment.xml similarity index 100% rename from session/src/main/res/layout/mediapicker_folder_fragment.xml rename to app/src/main/res/layout/mediapicker_folder_fragment.xml diff --git a/session/src/main/res/layout/mediapicker_folder_item.xml b/app/src/main/res/layout/mediapicker_folder_item.xml similarity index 100% rename from session/src/main/res/layout/mediapicker_folder_item.xml rename to app/src/main/res/layout/mediapicker_folder_item.xml diff --git a/session/src/main/res/layout/mediapicker_item_fragment.xml b/app/src/main/res/layout/mediapicker_item_fragment.xml similarity index 100% rename from session/src/main/res/layout/mediapicker_item_fragment.xml rename to app/src/main/res/layout/mediapicker_item_fragment.xml diff --git a/session/src/main/res/layout/mediapicker_media_item.xml b/app/src/main/res/layout/mediapicker_media_item.xml similarity index 100% rename from session/src/main/res/layout/mediapicker_media_item.xml rename to app/src/main/res/layout/mediapicker_media_item.xml diff --git a/session/src/main/res/layout/mediarail_button_item.xml b/app/src/main/res/layout/mediarail_button_item.xml similarity index 100% rename from session/src/main/res/layout/mediarail_button_item.xml rename to app/src/main/res/layout/mediarail_button_item.xml diff --git a/session/src/main/res/layout/mediarail_media_item.xml b/app/src/main/res/layout/mediarail_media_item.xml similarity index 100% rename from session/src/main/res/layout/mediarail_media_item.xml rename to app/src/main/res/layout/mediarail_media_item.xml diff --git a/session/src/main/res/layout/mediasend_activity.xml b/app/src/main/res/layout/mediasend_activity.xml similarity index 100% rename from session/src/main/res/layout/mediasend_activity.xml rename to app/src/main/res/layout/mediasend_activity.xml diff --git a/session/src/main/res/layout/mediasend_fragment.xml b/app/src/main/res/layout/mediasend_fragment.xml similarity index 100% rename from session/src/main/res/layout/mediasend_fragment.xml rename to app/src/main/res/layout/mediasend_fragment.xml diff --git a/session/src/main/res/layout/mediasend_image_fragment.xml b/app/src/main/res/layout/mediasend_image_fragment.xml similarity index 100% rename from session/src/main/res/layout/mediasend_image_fragment.xml rename to app/src/main/res/layout/mediasend_image_fragment.xml diff --git a/session/src/main/res/layout/mediasend_video_fragment.xml b/app/src/main/res/layout/mediasend_video_fragment.xml similarity index 100% rename from session/src/main/res/layout/mediasend_video_fragment.xml rename to app/src/main/res/layout/mediasend_video_fragment.xml diff --git a/session/src/main/res/layout/message_audio_view.xml b/app/src/main/res/layout/message_audio_view.xml similarity index 100% rename from session/src/main/res/layout/message_audio_view.xml rename to app/src/main/res/layout/message_audio_view.xml diff --git a/session/src/main/res/layout/message_details_activity.xml b/app/src/main/res/layout/message_details_activity.xml similarity index 100% rename from session/src/main/res/layout/message_details_activity.xml rename to app/src/main/res/layout/message_details_activity.xml diff --git a/session/src/main/res/layout/message_details_header.xml b/app/src/main/res/layout/message_details_header.xml similarity index 100% rename from session/src/main/res/layout/message_details_header.xml rename to app/src/main/res/layout/message_details_header.xml diff --git a/session/src/main/res/layout/message_recipient_list_item.xml b/app/src/main/res/layout/message_recipient_list_item.xml similarity index 100% rename from session/src/main/res/layout/message_recipient_list_item.xml rename to app/src/main/res/layout/message_recipient_list_item.xml diff --git a/session/src/main/res/layout/microphone_recorder_view.xml b/app/src/main/res/layout/microphone_recorder_view.xml similarity index 100% rename from session/src/main/res/layout/microphone_recorder_view.xml rename to app/src/main/res/layout/microphone_recorder_view.xml diff --git a/session/src/main/res/layout/permissions_rationale_dialog.xml b/app/src/main/res/layout/permissions_rationale_dialog.xml similarity index 100% rename from session/src/main/res/layout/permissions_rationale_dialog.xml rename to app/src/main/res/layout/permissions_rationale_dialog.xml diff --git a/session/src/main/res/layout/phone_text.xml b/app/src/main/res/layout/phone_text.xml similarity index 100% rename from session/src/main/res/layout/phone_text.xml rename to app/src/main/res/layout/phone_text.xml diff --git a/session/src/main/res/layout/preference_divider.xml b/app/src/main/res/layout/preference_divider.xml similarity index 100% rename from session/src/main/res/layout/preference_divider.xml rename to app/src/main/res/layout/preference_divider.xml diff --git a/session/src/main/res/layout/preference_right_summary_widget.xml b/app/src/main/res/layout/preference_right_summary_widget.xml similarity index 100% rename from session/src/main/res/layout/preference_right_summary_widget.xml rename to app/src/main/res/layout/preference_right_summary_widget.xml diff --git a/session/src/main/res/layout/preference_widget_color_swatch.xml b/app/src/main/res/layout/preference_widget_color_swatch.xml similarity index 100% rename from session/src/main/res/layout/preference_widget_color_swatch.xml rename to app/src/main/res/layout/preference_widget_color_swatch.xml diff --git a/session/src/main/res/layout/preference_widget_progress.xml b/app/src/main/res/layout/preference_widget_progress.xml similarity index 100% rename from session/src/main/res/layout/preference_widget_progress.xml rename to app/src/main/res/layout/preference_widget_progress.xml diff --git a/session/src/main/res/layout/profile_create_activity.xml b/app/src/main/res/layout/profile_create_activity.xml similarity index 100% rename from session/src/main/res/layout/profile_create_activity.xml rename to app/src/main/res/layout/profile_create_activity.xml diff --git a/session/src/main/res/layout/profile_group_share_view.xml b/app/src/main/res/layout/profile_group_share_view.xml similarity index 100% rename from session/src/main/res/layout/profile_group_share_view.xml rename to app/src/main/res/layout/profile_group_share_view.xml diff --git a/session/src/main/res/layout/profile_name_text.xml b/app/src/main/res/layout/profile_name_text.xml similarity index 100% rename from session/src/main/res/layout/profile_name_text.xml rename to app/src/main/res/layout/profile_name_text.xml diff --git a/session/src/main/res/layout/profile_preference_view.xml b/app/src/main/res/layout/profile_preference_view.xml similarity index 100% rename from session/src/main/res/layout/profile_preference_view.xml rename to app/src/main/res/layout/profile_preference_view.xml diff --git a/session/src/main/res/layout/progress_dialog.xml b/app/src/main/res/layout/progress_dialog.xml similarity index 100% rename from session/src/main/res/layout/progress_dialog.xml rename to app/src/main/res/layout/progress_dialog.xml diff --git a/session/src/main/res/layout/prompt_apn_activity.xml b/app/src/main/res/layout/prompt_apn_activity.xml similarity index 100% rename from session/src/main/res/layout/prompt_apn_activity.xml rename to app/src/main/res/layout/prompt_apn_activity.xml diff --git a/session/src/main/res/layout/prompt_passphrase_activity.xml b/app/src/main/res/layout/prompt_passphrase_activity.xml similarity index 100% rename from session/src/main/res/layout/prompt_passphrase_activity.xml rename to app/src/main/res/layout/prompt_passphrase_activity.xml diff --git a/session/src/main/res/layout/push_recipients_panel.xml b/app/src/main/res/layout/push_recipients_panel.xml similarity index 100% rename from session/src/main/res/layout/push_recipients_panel.xml rename to app/src/main/res/layout/push_recipients_panel.xml diff --git a/session/src/main/res/layout/quick_attachment_drawer.xml b/app/src/main/res/layout/quick_attachment_drawer.xml similarity index 100% rename from session/src/main/res/layout/quick_attachment_drawer.xml rename to app/src/main/res/layout/quick_attachment_drawer.xml diff --git a/session/src/main/res/layout/quick_camera_controls.xml b/app/src/main/res/layout/quick_camera_controls.xml similarity index 100% rename from session/src/main/res/layout/quick_camera_controls.xml rename to app/src/main/res/layout/quick_camera_controls.xml diff --git a/session/src/main/res/layout/quick_camera_controls_land.xml b/app/src/main/res/layout/quick_camera_controls_land.xml similarity index 100% rename from session/src/main/res/layout/quick_camera_controls_land.xml rename to app/src/main/res/layout/quick_camera_controls_land.xml diff --git a/session/src/main/res/layout/quote_view.xml b/app/src/main/res/layout/quote_view.xml similarity index 100% rename from session/src/main/res/layout/quote_view.xml rename to app/src/main/res/layout/quote_view.xml diff --git a/session/src/main/res/layout/recent_photo_view.xml b/app/src/main/res/layout/recent_photo_view.xml similarity index 100% rename from session/src/main/res/layout/recent_photo_view.xml rename to app/src/main/res/layout/recent_photo_view.xml diff --git a/session/src/main/res/layout/recent_photo_view_item.xml b/app/src/main/res/layout/recent_photo_view_item.xml similarity index 100% rename from session/src/main/res/layout/recent_photo_view_item.xml rename to app/src/main/res/layout/recent_photo_view_item.xml diff --git a/session/src/main/res/layout/recipient_filter_item.xml b/app/src/main/res/layout/recipient_filter_item.xml similarity index 100% rename from session/src/main/res/layout/recipient_filter_item.xml rename to app/src/main/res/layout/recipient_filter_item.xml diff --git a/session/src/main/res/layout/recipient_preference_activity.xml b/app/src/main/res/layout/recipient_preference_activity.xml similarity index 100% rename from session/src/main/res/layout/recipient_preference_activity.xml rename to app/src/main/res/layout/recipient_preference_activity.xml diff --git a/session/src/main/res/layout/recipient_preference_contact_widget.xml b/app/src/main/res/layout/recipient_preference_contact_widget.xml similarity index 100% rename from session/src/main/res/layout/recipient_preference_contact_widget.xml rename to app/src/main/res/layout/recipient_preference_contact_widget.xml diff --git a/session/src/main/res/layout/recipient_preference_photo_rail.xml b/app/src/main/res/layout/recipient_preference_photo_rail.xml similarity index 100% rename from session/src/main/res/layout/recipient_preference_photo_rail.xml rename to app/src/main/res/layout/recipient_preference_photo_rail.xml diff --git a/session/src/main/res/layout/recipient_preference_photo_rail_item.xml b/app/src/main/res/layout/recipient_preference_photo_rail_item.xml similarity index 100% rename from session/src/main/res/layout/recipient_preference_photo_rail_item.xml rename to app/src/main/res/layout/recipient_preference_photo_rail_item.xml diff --git a/session/src/main/res/layout/recording_layout.xml b/app/src/main/res/layout/recording_layout.xml similarity index 100% rename from session/src/main/res/layout/recording_layout.xml rename to app/src/main/res/layout/recording_layout.xml diff --git a/session/src/main/res/layout/recycler_view_fast_scroller.xml b/app/src/main/res/layout/recycler_view_fast_scroller.xml similarity index 100% rename from session/src/main/res/layout/recycler_view_fast_scroller.xml rename to app/src/main/res/layout/recycler_view_fast_scroller.xml diff --git a/session/src/main/res/layout/registration_activity.xml b/app/src/main/res/layout/registration_activity.xml similarity index 100% rename from session/src/main/res/layout/registration_activity.xml rename to app/src/main/res/layout/registration_activity.xml diff --git a/session/src/main/res/layout/registration_lock_dialog_view.xml b/app/src/main/res/layout/registration_lock_dialog_view.xml similarity index 100% rename from session/src/main/res/layout/registration_lock_dialog_view.xml rename to app/src/main/res/layout/registration_lock_dialog_view.xml diff --git a/session/src/main/res/layout/registration_lock_reminder_view.xml b/app/src/main/res/layout/registration_lock_reminder_view.xml similarity index 100% rename from session/src/main/res/layout/registration_lock_reminder_view.xml rename to app/src/main/res/layout/registration_lock_reminder_view.xml diff --git a/session/src/main/res/layout/registration_unlock_dialog_view.xml b/app/src/main/res/layout/registration_unlock_dialog_view.xml similarity index 100% rename from session/src/main/res/layout/registration_unlock_dialog_view.xml rename to app/src/main/res/layout/registration_unlock_dialog_view.xml diff --git a/session/src/main/res/layout/registration_welcome_activity.xml b/app/src/main/res/layout/registration_welcome_activity.xml similarity index 100% rename from session/src/main/res/layout/registration_welcome_activity.xml rename to app/src/main/res/layout/registration_welcome_activity.xml diff --git a/session/src/main/res/layout/reminder_header.xml b/app/src/main/res/layout/reminder_header.xml similarity index 100% rename from session/src/main/res/layout/reminder_header.xml rename to app/src/main/res/layout/reminder_header.xml diff --git a/session/src/main/res/layout/scribble_fragment_emojidrawer_stub.xml b/app/src/main/res/layout/scribble_fragment_emojidrawer_stub.xml similarity index 100% rename from session/src/main/res/layout/scribble_fragment_emojidrawer_stub.xml rename to app/src/main/res/layout/scribble_fragment_emojidrawer_stub.xml diff --git a/session/src/main/res/layout/scribble_select_sticker_activity.xml b/app/src/main/res/layout/scribble_select_sticker_activity.xml similarity index 100% rename from session/src/main/res/layout/scribble_select_sticker_activity.xml rename to app/src/main/res/layout/scribble_select_sticker_activity.xml diff --git a/session/src/main/res/layout/scribble_select_sticker_fragment.xml b/app/src/main/res/layout/scribble_select_sticker_fragment.xml similarity index 100% rename from session/src/main/res/layout/scribble_select_sticker_fragment.xml rename to app/src/main/res/layout/scribble_select_sticker_fragment.xml diff --git a/session/src/main/res/layout/scribble_sticker_item.xml b/app/src/main/res/layout/scribble_sticker_item.xml similarity index 100% rename from session/src/main/res/layout/scribble_sticker_item.xml rename to app/src/main/res/layout/scribble_sticker_item.xml diff --git a/session/src/main/res/layout/search_toolbar.xml b/app/src/main/res/layout/search_toolbar.xml similarity index 100% rename from session/src/main/res/layout/search_toolbar.xml rename to app/src/main/res/layout/search_toolbar.xml diff --git a/session/src/main/res/layout/selected_recipient_list_item.xml b/app/src/main/res/layout/selected_recipient_list_item.xml similarity index 100% rename from session/src/main/res/layout/selected_recipient_list_item.xml rename to app/src/main/res/layout/selected_recipient_list_item.xml diff --git a/session/src/main/res/layout/session_logo_action_bar_content.xml b/app/src/main/res/layout/session_logo_action_bar_content.xml similarity index 100% rename from session/src/main/res/layout/session_logo_action_bar_content.xml rename to app/src/main/res/layout/session_logo_action_bar_content.xml diff --git a/session/src/main/res/layout/session_restore_banner.xml b/app/src/main/res/layout/session_restore_banner.xml similarity index 100% rename from session/src/main/res/layout/session_restore_banner.xml rename to app/src/main/res/layout/session_restore_banner.xml diff --git a/session/src/main/res/layout/share_activity.xml b/app/src/main/res/layout/share_activity.xml similarity index 100% rename from session/src/main/res/layout/share_activity.xml rename to app/src/main/res/layout/share_activity.xml diff --git a/session/src/main/res/layout/share_intent_list.xml b/app/src/main/res/layout/share_intent_list.xml similarity index 100% rename from session/src/main/res/layout/share_intent_list.xml rename to app/src/main/res/layout/share_intent_list.xml diff --git a/session/src/main/res/layout/share_intent_row.xml b/app/src/main/res/layout/share_intent_row.xml similarity index 100% rename from session/src/main/res/layout/share_intent_row.xml rename to app/src/main/res/layout/share_intent_row.xml diff --git a/session/src/main/res/layout/shared_contact_view.xml b/app/src/main/res/layout/shared_contact_view.xml similarity index 100% rename from session/src/main/res/layout/shared_contact_view.xml rename to app/src/main/res/layout/shared_contact_view.xml diff --git a/session/src/main/res/layout/signal_map_view.xml b/app/src/main/res/layout/signal_map_view.xml similarity index 100% rename from session/src/main/res/layout/signal_map_view.xml rename to app/src/main/res/layout/signal_map_view.xml diff --git a/session/src/main/res/layout/sticker_keyboard_icon_dark.xml b/app/src/main/res/layout/sticker_keyboard_icon_dark.xml similarity index 100% rename from session/src/main/res/layout/sticker_keyboard_icon_dark.xml rename to app/src/main/res/layout/sticker_keyboard_icon_dark.xml diff --git a/session/src/main/res/layout/sticker_keyboard_icon_dark_selected.xml b/app/src/main/res/layout/sticker_keyboard_icon_dark_selected.xml similarity index 100% rename from session/src/main/res/layout/sticker_keyboard_icon_dark_selected.xml rename to app/src/main/res/layout/sticker_keyboard_icon_dark_selected.xml diff --git a/session/src/main/res/layout/sticker_keyboard_icon_light.xml b/app/src/main/res/layout/sticker_keyboard_icon_light.xml similarity index 100% rename from session/src/main/res/layout/sticker_keyboard_icon_light.xml rename to app/src/main/res/layout/sticker_keyboard_icon_light.xml diff --git a/session/src/main/res/layout/sticker_keyboard_icon_light_selected.xml b/app/src/main/res/layout/sticker_keyboard_icon_light_selected.xml similarity index 100% rename from session/src/main/res/layout/sticker_keyboard_icon_light_selected.xml rename to app/src/main/res/layout/sticker_keyboard_icon_light_selected.xml diff --git a/session/src/main/res/layout/sticker_keyboard_page.xml b/app/src/main/res/layout/sticker_keyboard_page.xml similarity index 100% rename from session/src/main/res/layout/sticker_keyboard_page.xml rename to app/src/main/res/layout/sticker_keyboard_page.xml diff --git a/session/src/main/res/layout/sticker_keyboard_page_list_item.xml b/app/src/main/res/layout/sticker_keyboard_page_list_item.xml similarity index 100% rename from session/src/main/res/layout/sticker_keyboard_page_list_item.xml rename to app/src/main/res/layout/sticker_keyboard_page_list_item.xml diff --git a/session/src/main/res/layout/sticker_management_activity.xml b/app/src/main/res/layout/sticker_management_activity.xml similarity index 100% rename from session/src/main/res/layout/sticker_management_activity.xml rename to app/src/main/res/layout/sticker_management_activity.xml diff --git a/session/src/main/res/layout/sticker_management_empty_item.xml b/app/src/main/res/layout/sticker_management_empty_item.xml similarity index 100% rename from session/src/main/res/layout/sticker_management_empty_item.xml rename to app/src/main/res/layout/sticker_management_empty_item.xml diff --git a/session/src/main/res/layout/sticker_management_header_item.xml b/app/src/main/res/layout/sticker_management_header_item.xml similarity index 100% rename from session/src/main/res/layout/sticker_management_header_item.xml rename to app/src/main/res/layout/sticker_management_header_item.xml diff --git a/session/src/main/res/layout/sticker_management_sticker_item.xml b/app/src/main/res/layout/sticker_management_sticker_item.xml similarity index 100% rename from session/src/main/res/layout/sticker_management_sticker_item.xml rename to app/src/main/res/layout/sticker_management_sticker_item.xml diff --git a/session/src/main/res/layout/sticker_preview_activity.xml b/app/src/main/res/layout/sticker_preview_activity.xml similarity index 100% rename from session/src/main/res/layout/sticker_preview_activity.xml rename to app/src/main/res/layout/sticker_preview_activity.xml diff --git a/session/src/main/res/layout/sticker_preview_list_item.xml b/app/src/main/res/layout/sticker_preview_list_item.xml similarity index 100% rename from session/src/main/res/layout/sticker_preview_list_item.xml rename to app/src/main/res/layout/sticker_preview_list_item.xml diff --git a/session/src/main/res/layout/sticker_preview_popup.xml b/app/src/main/res/layout/sticker_preview_popup.xml similarity index 100% rename from session/src/main/res/layout/sticker_preview_popup.xml rename to app/src/main/res/layout/sticker_preview_popup.xml diff --git a/session/src/main/res/layout/sticker_suggestion_list_item.xml b/app/src/main/res/layout/sticker_suggestion_list_item.xml similarity index 100% rename from session/src/main/res/layout/sticker_suggestion_list_item.xml rename to app/src/main/res/layout/sticker_suggestion_list_item.xml diff --git a/session/src/main/res/layout/sticker_view.xml b/app/src/main/res/layout/sticker_view.xml similarity index 100% rename from session/src/main/res/layout/sticker_view.xml rename to app/src/main/res/layout/sticker_view.xml diff --git a/session/src/main/res/layout/switch_compat_preference.xml b/app/src/main/res/layout/switch_compat_preference.xml similarity index 100% rename from session/src/main/res/layout/switch_compat_preference.xml rename to app/src/main/res/layout/switch_compat_preference.xml diff --git a/session/src/main/res/layout/thumbnail_view.xml b/app/src/main/res/layout/thumbnail_view.xml similarity index 100% rename from session/src/main/res/layout/thumbnail_view.xml rename to app/src/main/res/layout/thumbnail_view.xml diff --git a/session/src/main/res/layout/tooltip.xml b/app/src/main/res/layout/tooltip.xml similarity index 100% rename from session/src/main/res/layout/tooltip.xml rename to app/src/main/res/layout/tooltip.xml diff --git a/session/src/main/res/layout/transfer_controls_stub.xml b/app/src/main/res/layout/transfer_controls_stub.xml similarity index 100% rename from session/src/main/res/layout/transfer_controls_stub.xml rename to app/src/main/res/layout/transfer_controls_stub.xml diff --git a/session/src/main/res/layout/transfer_controls_view.xml b/app/src/main/res/layout/transfer_controls_view.xml similarity index 100% rename from session/src/main/res/layout/transfer_controls_view.xml rename to app/src/main/res/layout/transfer_controls_view.xml diff --git a/session/src/main/res/layout/transport_selection_list_item.xml b/app/src/main/res/layout/transport_selection_list_item.xml similarity index 100% rename from session/src/main/res/layout/transport_selection_list_item.xml rename to app/src/main/res/layout/transport_selection_list_item.xml diff --git a/session/src/main/res/layout/typing_indicator_view.xml b/app/src/main/res/layout/typing_indicator_view.xml similarity index 100% rename from session/src/main/res/layout/typing_indicator_view.xml rename to app/src/main/res/layout/typing_indicator_view.xml diff --git a/session/src/main/res/layout/unidentified_delivery_learn_more.xml b/app/src/main/res/layout/unidentified_delivery_learn_more.xml similarity index 100% rename from session/src/main/res/layout/unidentified_delivery_learn_more.xml rename to app/src/main/res/layout/unidentified_delivery_learn_more.xml diff --git a/session/src/main/res/layout/unknown_sender_view.xml b/app/src/main/res/layout/unknown_sender_view.xml similarity index 100% rename from session/src/main/res/layout/unknown_sender_view.xml rename to app/src/main/res/layout/unknown_sender_view.xml diff --git a/session/src/main/res/layout/unverified_banner_view.xml b/app/src/main/res/layout/unverified_banner_view.xml similarity index 100% rename from session/src/main/res/layout/unverified_banner_view.xml rename to app/src/main/res/layout/unverified_banner_view.xml diff --git a/session/src/main/res/layout/verification_code_view.xml b/app/src/main/res/layout/verification_code_view.xml similarity index 100% rename from session/src/main/res/layout/verification_code_view.xml rename to app/src/main/res/layout/verification_code_view.xml diff --git a/session/src/main/res/layout/verification_pin_keyboard_view.xml b/app/src/main/res/layout/verification_pin_keyboard_view.xml similarity index 100% rename from session/src/main/res/layout/verification_pin_keyboard_view.xml rename to app/src/main/res/layout/verification_pin_keyboard_view.xml diff --git a/session/src/main/res/layout/verify_display_fragment.xml b/app/src/main/res/layout/verify_display_fragment.xml similarity index 100% rename from session/src/main/res/layout/verify_display_fragment.xml rename to app/src/main/res/layout/verify_display_fragment.xml diff --git a/session/src/main/res/layout/verify_scan_fragment.xml b/app/src/main/res/layout/verify_scan_fragment.xml similarity index 100% rename from session/src/main/res/layout/verify_scan_fragment.xml rename to app/src/main/res/layout/verify_scan_fragment.xml diff --git a/session/src/main/res/layout/video_player.xml b/app/src/main/res/layout/video_player.xml similarity index 100% rename from session/src/main/res/layout/video_player.xml rename to app/src/main/res/layout/video_player.xml diff --git a/session/src/main/res/layout/view_conversation.xml b/app/src/main/res/layout/view_conversation.xml similarity index 100% rename from session/src/main/res/layout/view_conversation.xml rename to app/src/main/res/layout/view_conversation.xml diff --git a/session/src/main/res/layout/view_device.xml b/app/src/main/res/layout/view_device.xml similarity index 100% rename from session/src/main/res/layout/view_device.xml rename to app/src/main/res/layout/view_device.xml diff --git a/session/src/main/res/layout/view_device_linking.xml b/app/src/main/res/layout/view_device_linking.xml similarity index 100% rename from session/src/main/res/layout/view_device_linking.xml rename to app/src/main/res/layout/view_device_linking.xml diff --git a/session/src/main/res/layout/view_fake_chat.xml b/app/src/main/res/layout/view_fake_chat.xml similarity index 100% rename from session/src/main/res/layout/view_fake_chat.xml rename to app/src/main/res/layout/view_fake_chat.xml diff --git a/session/src/main/res/layout/view_mention_candidate.xml b/app/src/main/res/layout/view_mention_candidate.xml similarity index 100% rename from session/src/main/res/layout/view_mention_candidate.xml rename to app/src/main/res/layout/view_mention_candidate.xml diff --git a/session/src/main/res/layout/view_mention_candidate_selection.xml b/app/src/main/res/layout/view_mention_candidate_selection.xml similarity index 100% rename from session/src/main/res/layout/view_mention_candidate_selection.xml rename to app/src/main/res/layout/view_mention_candidate_selection.xml diff --git a/session/src/main/res/layout/view_profile_picture.xml b/app/src/main/res/layout/view_profile_picture.xml similarity index 100% rename from session/src/main/res/layout/view_profile_picture.xml rename to app/src/main/res/layout/view_profile_picture.xml diff --git a/session/src/main/res/layout/view_qr_code.xml b/app/src/main/res/layout/view_qr_code.xml similarity index 100% rename from session/src/main/res/layout/view_qr_code.xml rename to app/src/main/res/layout/view_qr_code.xml diff --git a/session/src/main/res/layout/view_seed_reminder.xml b/app/src/main/res/layout/view_seed_reminder.xml similarity index 100% rename from session/src/main/res/layout/view_seed_reminder.xml rename to app/src/main/res/layout/view_seed_reminder.xml diff --git a/session/src/main/res/layout/view_separator.xml b/app/src/main/res/layout/view_separator.xml similarity index 100% rename from session/src/main/res/layout/view_separator.xml rename to app/src/main/res/layout/view_separator.xml diff --git a/session/src/main/res/layout/view_user.xml b/app/src/main/res/layout/view_user.xml similarity index 100% rename from session/src/main/res/layout/view_user.xml rename to app/src/main/res/layout/view_user.xml diff --git a/session/src/main/res/layout/webrtc_answer_decline_button.xml b/app/src/main/res/layout/webrtc_answer_decline_button.xml similarity index 100% rename from session/src/main/res/layout/webrtc_answer_decline_button.xml rename to app/src/main/res/layout/webrtc_answer_decline_button.xml diff --git a/session/src/main/res/layout/webrtc_call_activity.xml b/app/src/main/res/layout/webrtc_call_activity.xml similarity index 100% rename from session/src/main/res/layout/webrtc_call_activity.xml rename to app/src/main/res/layout/webrtc_call_activity.xml diff --git a/session/src/main/res/layout/webrtc_call_controls.xml b/app/src/main/res/layout/webrtc_call_controls.xml similarity index 100% rename from session/src/main/res/layout/webrtc_call_controls.xml rename to app/src/main/res/layout/webrtc_call_controls.xml diff --git a/session/src/main/res/layout/webrtc_call_screen.xml b/app/src/main/res/layout/webrtc_call_screen.xml similarity index 100% rename from session/src/main/res/layout/webrtc_call_screen.xml rename to app/src/main/res/layout/webrtc_call_screen.xml diff --git a/session/src/main/res/layout/zooming_image_view.xml b/app/src/main/res/layout/zooming_image_view.xml similarity index 100% rename from session/src/main/res/layout/zooming_image_view.xml rename to app/src/main/res/layout/zooming_image_view.xml diff --git a/session/src/main/res/menu/conversation.xml b/app/src/main/res/menu/conversation.xml similarity index 100% rename from session/src/main/res/menu/conversation.xml rename to app/src/main/res/menu/conversation.xml diff --git a/session/src/main/res/menu/conversation_block.xml b/app/src/main/res/menu/conversation_block.xml similarity index 100% rename from session/src/main/res/menu/conversation_block.xml rename to app/src/main/res/menu/conversation_block.xml diff --git a/session/src/main/res/menu/conversation_context.xml b/app/src/main/res/menu/conversation_context.xml similarity index 100% rename from session/src/main/res/menu/conversation_context.xml rename to app/src/main/res/menu/conversation_context.xml diff --git a/session/src/main/res/menu/conversation_copy_session_id.xml b/app/src/main/res/menu/conversation_copy_session_id.xml similarity index 100% rename from session/src/main/res/menu/conversation_copy_session_id.xml rename to app/src/main/res/menu/conversation_copy_session_id.xml diff --git a/session/src/main/res/menu/conversation_expiring_off.xml b/app/src/main/res/menu/conversation_expiring_off.xml similarity index 100% rename from session/src/main/res/menu/conversation_expiring_off.xml rename to app/src/main/res/menu/conversation_expiring_off.xml diff --git a/session/src/main/res/menu/conversation_expiring_on.xml b/app/src/main/res/menu/conversation_expiring_on.xml similarity index 100% rename from session/src/main/res/menu/conversation_expiring_on.xml rename to app/src/main/res/menu/conversation_expiring_on.xml diff --git a/session/src/main/res/menu/conversation_insecure.xml b/app/src/main/res/menu/conversation_insecure.xml similarity index 100% rename from session/src/main/res/menu/conversation_insecure.xml rename to app/src/main/res/menu/conversation_insecure.xml diff --git a/session/src/main/res/menu/conversation_list_batch.xml b/app/src/main/res/menu/conversation_list_batch.xml similarity index 100% rename from session/src/main/res/menu/conversation_list_batch.xml rename to app/src/main/res/menu/conversation_list_batch.xml diff --git a/session/src/main/res/menu/conversation_list_search.xml b/app/src/main/res/menu/conversation_list_search.xml similarity index 100% rename from session/src/main/res/menu/conversation_list_search.xml rename to app/src/main/res/menu/conversation_list_search.xml diff --git a/session/src/main/res/menu/conversation_mms_group_options.xml b/app/src/main/res/menu/conversation_mms_group_options.xml similarity index 100% rename from session/src/main/res/menu/conversation_mms_group_options.xml rename to app/src/main/res/menu/conversation_mms_group_options.xml diff --git a/session/src/main/res/menu/conversation_muted.xml b/app/src/main/res/menu/conversation_muted.xml similarity index 100% rename from session/src/main/res/menu/conversation_muted.xml rename to app/src/main/res/menu/conversation_muted.xml diff --git a/session/src/main/res/menu/conversation_popup.xml b/app/src/main/res/menu/conversation_popup.xml similarity index 100% rename from session/src/main/res/menu/conversation_popup.xml rename to app/src/main/res/menu/conversation_popup.xml diff --git a/session/src/main/res/menu/conversation_push_group_options.xml b/app/src/main/res/menu/conversation_push_group_options.xml similarity index 100% rename from session/src/main/res/menu/conversation_push_group_options.xml rename to app/src/main/res/menu/conversation_push_group_options.xml diff --git a/session/src/main/res/menu/conversation_secure.xml b/app/src/main/res/menu/conversation_secure.xml similarity index 100% rename from session/src/main/res/menu/conversation_secure.xml rename to app/src/main/res/menu/conversation_secure.xml diff --git a/session/src/main/res/menu/conversation_unblock.xml b/app/src/main/res/menu/conversation_unblock.xml similarity index 100% rename from session/src/main/res/menu/conversation_unblock.xml rename to app/src/main/res/menu/conversation_unblock.xml diff --git a/session/src/main/res/menu/conversation_unmuted.xml b/app/src/main/res/menu/conversation_unmuted.xml similarity index 100% rename from session/src/main/res/menu/conversation_unmuted.xml rename to app/src/main/res/menu/conversation_unmuted.xml diff --git a/session/src/main/res/menu/log_submit.xml b/app/src/main/res/menu/log_submit.xml similarity index 100% rename from session/src/main/res/menu/log_submit.xml rename to app/src/main/res/menu/log_submit.xml diff --git a/session/src/main/res/menu/media_overview_context.xml b/app/src/main/res/menu/media_overview_context.xml similarity index 100% rename from session/src/main/res/menu/media_overview_context.xml rename to app/src/main/res/menu/media_overview_context.xml diff --git a/session/src/main/res/menu/media_preview.xml b/app/src/main/res/menu/media_preview.xml similarity index 100% rename from session/src/main/res/menu/media_preview.xml rename to app/src/main/res/menu/media_preview.xml diff --git a/session/src/main/res/menu/mediapicker_default.xml b/app/src/main/res/menu/mediapicker_default.xml similarity index 100% rename from session/src/main/res/menu/mediapicker_default.xml rename to app/src/main/res/menu/mediapicker_default.xml diff --git a/session/src/main/res/menu/menu_apply.xml b/app/src/main/res/menu/menu_apply.xml similarity index 100% rename from session/src/main/res/menu/menu_apply.xml rename to app/src/main/res/menu/menu_apply.xml diff --git a/session/src/main/res/menu/menu_done.xml b/app/src/main/res/menu/menu_done.xml similarity index 100% rename from session/src/main/res/menu/menu_done.xml rename to app/src/main/res/menu/menu_done.xml diff --git a/session/src/main/res/menu/menu_edit_closed_group.xml b/app/src/main/res/menu/menu_edit_closed_group.xml similarity index 100% rename from session/src/main/res/menu/menu_edit_closed_group.xml rename to app/src/main/res/menu/menu_edit_closed_group.xml diff --git a/session/src/main/res/menu/menu_home.xml b/app/src/main/res/menu/menu_home.xml similarity index 100% rename from session/src/main/res/menu/menu_home.xml rename to app/src/main/res/menu/menu_home.xml diff --git a/session/src/main/res/menu/menu_linked_devices.xml b/app/src/main/res/menu/menu_linked_devices.xml similarity index 100% rename from session/src/main/res/menu/menu_linked_devices.xml rename to app/src/main/res/menu/menu_linked_devices.xml diff --git a/session/src/main/res/menu/menu_pn_mode.xml b/app/src/main/res/menu/menu_pn_mode.xml similarity index 100% rename from session/src/main/res/menu/menu_pn_mode.xml rename to app/src/main/res/menu/menu_pn_mode.xml diff --git a/session/src/main/res/menu/new_conversation_activity.xml b/app/src/main/res/menu/new_conversation_activity.xml similarity index 100% rename from session/src/main/res/menu/new_conversation_activity.xml rename to app/src/main/res/menu/new_conversation_activity.xml diff --git a/session/src/main/res/menu/settings_general.xml b/app/src/main/res/menu/settings_general.xml similarity index 100% rename from session/src/main/res/menu/settings_general.xml rename to app/src/main/res/menu/settings_general.xml diff --git a/session/src/main/res/menu/text_secure_normal.xml b/app/src/main/res/menu/text_secure_normal.xml similarity index 100% rename from session/src/main/res/menu/text_secure_normal.xml rename to app/src/main/res/menu/text_secure_normal.xml diff --git a/session/src/main/res/menu/verify_display_fragment_context_menu.xml b/app/src/main/res/menu/verify_display_fragment_context_menu.xml similarity index 100% rename from session/src/main/res/menu/verify_display_fragment_context_menu.xml rename to app/src/main/res/menu/verify_display_fragment_context_menu.xml diff --git a/session/src/main/res/menu/verify_identity.xml b/app/src/main/res/menu/verify_identity.xml similarity index 100% rename from session/src/main/res/menu/verify_identity.xml rename to app/src/main/res/menu/verify_identity.xml diff --git a/session/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml similarity index 100% rename from session/src/main/res/mipmap-anydpi-v26/ic_launcher.xml rename to app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml diff --git a/session/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml similarity index 100% rename from session/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml rename to app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml diff --git a/session/src/main/res/mipmap-hdpi/ic_group_shortcut.png b/app/src/main/res/mipmap-hdpi/ic_group_shortcut.png similarity index 100% rename from session/src/main/res/mipmap-hdpi/ic_group_shortcut.png rename to app/src/main/res/mipmap-hdpi/ic_group_shortcut.png diff --git a/session/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from session/src/main/res/mipmap-hdpi/ic_launcher.png rename to app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/session/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png similarity index 100% rename from session/src/main/res/mipmap-hdpi/ic_launcher_round.png rename to app/src/main/res/mipmap-hdpi/ic_launcher_round.png diff --git a/session/src/main/res/mipmap-hdpi/ic_person_shortcut.png b/app/src/main/res/mipmap-hdpi/ic_person_shortcut.png similarity index 100% rename from session/src/main/res/mipmap-hdpi/ic_person_shortcut.png rename to app/src/main/res/mipmap-hdpi/ic_person_shortcut.png diff --git a/session/src/main/res/mipmap-mdpi/ic_group_shortcut.png b/app/src/main/res/mipmap-mdpi/ic_group_shortcut.png similarity index 100% rename from session/src/main/res/mipmap-mdpi/ic_group_shortcut.png rename to app/src/main/res/mipmap-mdpi/ic_group_shortcut.png diff --git a/session/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from session/src/main/res/mipmap-mdpi/ic_launcher.png rename to app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/session/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png similarity index 100% rename from session/src/main/res/mipmap-mdpi/ic_launcher_round.png rename to app/src/main/res/mipmap-mdpi/ic_launcher_round.png diff --git a/session/src/main/res/mipmap-mdpi/ic_person_shortcut.png b/app/src/main/res/mipmap-mdpi/ic_person_shortcut.png similarity index 100% rename from session/src/main/res/mipmap-mdpi/ic_person_shortcut.png rename to app/src/main/res/mipmap-mdpi/ic_person_shortcut.png diff --git a/session/src/main/res/mipmap-xhdpi/ic_group_shortcut.png b/app/src/main/res/mipmap-xhdpi/ic_group_shortcut.png similarity index 100% rename from session/src/main/res/mipmap-xhdpi/ic_group_shortcut.png rename to app/src/main/res/mipmap-xhdpi/ic_group_shortcut.png diff --git a/session/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from session/src/main/res/mipmap-xhdpi/ic_launcher.png rename to app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/session/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png similarity index 100% rename from session/src/main/res/mipmap-xhdpi/ic_launcher_round.png rename to app/src/main/res/mipmap-xhdpi/ic_launcher_round.png diff --git a/session/src/main/res/mipmap-xhdpi/ic_person_shortcut.png b/app/src/main/res/mipmap-xhdpi/ic_person_shortcut.png similarity index 100% rename from session/src/main/res/mipmap-xhdpi/ic_person_shortcut.png rename to app/src/main/res/mipmap-xhdpi/ic_person_shortcut.png diff --git a/session/src/main/res/mipmap-xxhdpi/ic_group_shortcut.png b/app/src/main/res/mipmap-xxhdpi/ic_group_shortcut.png similarity index 100% rename from session/src/main/res/mipmap-xxhdpi/ic_group_shortcut.png rename to app/src/main/res/mipmap-xxhdpi/ic_group_shortcut.png diff --git a/session/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from session/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/session/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png similarity index 100% rename from session/src/main/res/mipmap-xxhdpi/ic_launcher_round.png rename to app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png diff --git a/session/src/main/res/mipmap-xxhdpi/ic_person_shortcut.png b/app/src/main/res/mipmap-xxhdpi/ic_person_shortcut.png similarity index 100% rename from session/src/main/res/mipmap-xxhdpi/ic_person_shortcut.png rename to app/src/main/res/mipmap-xxhdpi/ic_person_shortcut.png diff --git a/session/src/main/res/mipmap-xxxhdpi/ic_group_shortcut.png b/app/src/main/res/mipmap-xxxhdpi/ic_group_shortcut.png similarity index 100% rename from session/src/main/res/mipmap-xxxhdpi/ic_group_shortcut.png rename to app/src/main/res/mipmap-xxxhdpi/ic_group_shortcut.png diff --git a/session/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from session/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/session/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png similarity index 100% rename from session/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png rename to app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/session/src/main/res/mipmap-xxxhdpi/ic_person_shortcut.png b/app/src/main/res/mipmap-xxxhdpi/ic_person_shortcut.png similarity index 100% rename from session/src/main/res/mipmap-xxxhdpi/ic_person_shortcut.png rename to app/src/main/res/mipmap-xxxhdpi/ic_person_shortcut.png diff --git a/session/src/main/res/raw/censorship_fronting.store b/app/src/main/res/raw/censorship_fronting.store similarity index 100% rename from session/src/main/res/raw/censorship_fronting.store rename to app/src/main/res/raw/censorship_fronting.store diff --git a/session/src/main/res/raw/ias.store b/app/src/main/res/raw/ias.store similarity index 100% rename from session/src/main/res/raw/ias.store rename to app/src/main/res/raw/ias.store diff --git a/session/src/main/res/raw/redphone_busy.mp3 b/app/src/main/res/raw/redphone_busy.mp3 similarity index 100% rename from session/src/main/res/raw/redphone_busy.mp3 rename to app/src/main/res/raw/redphone_busy.mp3 diff --git a/session/src/main/res/raw/redphone_outring.mp3 b/app/src/main/res/raw/redphone_outring.mp3 similarity index 100% rename from session/src/main/res/raw/redphone_outring.mp3 rename to app/src/main/res/raw/redphone_outring.mp3 diff --git a/session/src/main/res/raw/webrtc_completed.mp3 b/app/src/main/res/raw/webrtc_completed.mp3 similarity index 100% rename from session/src/main/res/raw/webrtc_completed.mp3 rename to app/src/main/res/raw/webrtc_completed.mp3 diff --git a/session/src/main/res/raw/webrtc_disconnected.mp3 b/app/src/main/res/raw/webrtc_disconnected.mp3 similarity index 100% rename from session/src/main/res/raw/webrtc_disconnected.mp3 rename to app/src/main/res/raw/webrtc_disconnected.mp3 diff --git a/session/src/main/res/raw/whisper.store b/app/src/main/res/raw/whisper.store similarity index 100% rename from session/src/main/res/raw/whisper.store rename to app/src/main/res/raw/whisper.store diff --git a/session/src/main/res/transition/fragment_shared.xml b/app/src/main/res/transition/fragment_shared.xml similarity index 100% rename from session/src/main/res/transition/fragment_shared.xml rename to app/src/main/res/transition/fragment_shared.xml diff --git a/session/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml similarity index 100% rename from session/src/main/res/values-ar/strings.xml rename to app/src/main/res/values-ar/strings.xml diff --git a/session/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml similarity index 100% rename from session/src/main/res/values-az/strings.xml rename to app/src/main/res/values-az/strings.xml diff --git a/session/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml similarity index 100% rename from session/src/main/res/values-bg/strings.xml rename to app/src/main/res/values-bg/strings.xml diff --git a/session/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml similarity index 100% rename from session/src/main/res/values-ca/strings.xml rename to app/src/main/res/values-ca/strings.xml diff --git a/session/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml similarity index 100% rename from session/src/main/res/values-cs/strings.xml rename to app/src/main/res/values-cs/strings.xml diff --git a/session/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml similarity index 100% rename from session/src/main/res/values-cy/strings.xml rename to app/src/main/res/values-cy/strings.xml diff --git a/session/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml similarity index 100% rename from session/src/main/res/values-da/strings.xml rename to app/src/main/res/values-da/strings.xml diff --git a/session/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml similarity index 100% rename from session/src/main/res/values-de/strings.xml rename to app/src/main/res/values-de/strings.xml diff --git a/session/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml similarity index 100% rename from session/src/main/res/values-el/strings.xml rename to app/src/main/res/values-el/strings.xml diff --git a/session/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml similarity index 100% rename from session/src/main/res/values-eo/strings.xml rename to app/src/main/res/values-eo/strings.xml diff --git a/session/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml similarity index 100% rename from session/src/main/res/values-es/strings.xml rename to app/src/main/res/values-es/strings.xml diff --git a/session/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml similarity index 100% rename from session/src/main/res/values-et/strings.xml rename to app/src/main/res/values-et/strings.xml diff --git a/session/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml similarity index 100% rename from session/src/main/res/values-eu/strings.xml rename to app/src/main/res/values-eu/strings.xml diff --git a/session/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml similarity index 100% rename from session/src/main/res/values-fa/strings.xml rename to app/src/main/res/values-fa/strings.xml diff --git a/session/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml similarity index 100% rename from session/src/main/res/values-fi/strings.xml rename to app/src/main/res/values-fi/strings.xml diff --git a/session/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml similarity index 100% rename from session/src/main/res/values-fr/strings.xml rename to app/src/main/res/values-fr/strings.xml diff --git a/session/src/main/res/values-ga/strings.xml b/app/src/main/res/values-ga/strings.xml similarity index 100% rename from session/src/main/res/values-ga/strings.xml rename to app/src/main/res/values-ga/strings.xml diff --git a/session/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml similarity index 100% rename from session/src/main/res/values-gl/strings.xml rename to app/src/main/res/values-gl/strings.xml diff --git a/session/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml similarity index 100% rename from session/src/main/res/values-hi/strings.xml rename to app/src/main/res/values-hi/strings.xml diff --git a/session/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml similarity index 100% rename from session/src/main/res/values-hr/strings.xml rename to app/src/main/res/values-hr/strings.xml diff --git a/session/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml similarity index 100% rename from session/src/main/res/values-hu/strings.xml rename to app/src/main/res/values-hu/strings.xml diff --git a/session/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml similarity index 100% rename from session/src/main/res/values-in/strings.xml rename to app/src/main/res/values-in/strings.xml diff --git a/session/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml similarity index 100% rename from session/src/main/res/values-it/strings.xml rename to app/src/main/res/values-it/strings.xml diff --git a/session/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml similarity index 100% rename from session/src/main/res/values-iw/strings.xml rename to app/src/main/res/values-iw/strings.xml diff --git a/session/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml similarity index 100% rename from session/src/main/res/values-ja/strings.xml rename to app/src/main/res/values-ja/strings.xml diff --git a/session/src/main/res/values-km/strings.xml b/app/src/main/res/values-km/strings.xml similarity index 100% rename from session/src/main/res/values-km/strings.xml rename to app/src/main/res/values-km/strings.xml diff --git a/session/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml similarity index 100% rename from session/src/main/res/values-ko/strings.xml rename to app/src/main/res/values-ko/strings.xml diff --git a/session/src/main/res/values-ku/strings.xml b/app/src/main/res/values-ku/strings.xml similarity index 100% rename from session/src/main/res/values-ku/strings.xml rename to app/src/main/res/values-ku/strings.xml diff --git a/session/src/main/res/values-land/dimens.xml b/app/src/main/res/values-land/dimens.xml similarity index 100% rename from session/src/main/res/values-land/dimens.xml rename to app/src/main/res/values-land/dimens.xml diff --git a/session/src/main/res/values-lg/strings.xml b/app/src/main/res/values-lg/strings.xml similarity index 100% rename from session/src/main/res/values-lg/strings.xml rename to app/src/main/res/values-lg/strings.xml diff --git a/session/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml similarity index 100% rename from session/src/main/res/values-lt/strings.xml rename to app/src/main/res/values-lt/strings.xml diff --git a/session/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml similarity index 100% rename from session/src/main/res/values-mk/strings.xml rename to app/src/main/res/values-mk/strings.xml diff --git a/session/src/main/res/values-my/strings.xml b/app/src/main/res/values-my/strings.xml similarity index 100% rename from session/src/main/res/values-my/strings.xml rename to app/src/main/res/values-my/strings.xml diff --git a/session/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml similarity index 100% rename from session/src/main/res/values-nb/strings.xml rename to app/src/main/res/values-nb/strings.xml diff --git a/session/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml similarity index 100% rename from session/src/main/res/values-nl/strings.xml rename to app/src/main/res/values-nl/strings.xml diff --git a/session/src/main/res/values-nn/strings.xml b/app/src/main/res/values-nn/strings.xml similarity index 100% rename from session/src/main/res/values-nn/strings.xml rename to app/src/main/res/values-nn/strings.xml diff --git a/session/src/main/res/values-notnight-v21/colors.xml b/app/src/main/res/values-notnight-v21/colors.xml similarity index 100% rename from session/src/main/res/values-notnight-v21/colors.xml rename to app/src/main/res/values-notnight-v21/colors.xml diff --git a/session/src/main/res/values-notnight-v21/styles.xml b/app/src/main/res/values-notnight-v21/styles.xml similarity index 100% rename from session/src/main/res/values-notnight-v21/styles.xml rename to app/src/main/res/values-notnight-v21/styles.xml diff --git a/session/src/main/res/values-notnight-v21/themes.xml b/app/src/main/res/values-notnight-v21/themes.xml similarity index 100% rename from session/src/main/res/values-notnight-v21/themes.xml rename to app/src/main/res/values-notnight-v21/themes.xml diff --git a/session/src/main/res/values-notnight-v23/themes.xml b/app/src/main/res/values-notnight-v23/themes.xml similarity index 100% rename from session/src/main/res/values-notnight-v23/themes.xml rename to app/src/main/res/values-notnight-v23/themes.xml diff --git a/session/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml similarity index 100% rename from session/src/main/res/values-pl/strings.xml rename to app/src/main/res/values-pl/strings.xml diff --git a/session/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml similarity index 100% rename from session/src/main/res/values-pt-rBR/strings.xml rename to app/src/main/res/values-pt-rBR/strings.xml diff --git a/session/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml similarity index 100% rename from session/src/main/res/values-pt/strings.xml rename to app/src/main/res/values-pt/strings.xml diff --git a/session/src/main/res/values-qu-rEC/strings.xml b/app/src/main/res/values-qu-rEC/strings.xml similarity index 100% rename from session/src/main/res/values-qu-rEC/strings.xml rename to app/src/main/res/values-qu-rEC/strings.xml diff --git a/session/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml similarity index 100% rename from session/src/main/res/values-ro/strings.xml rename to app/src/main/res/values-ro/strings.xml diff --git a/session/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml similarity index 100% rename from session/src/main/res/values-ru/strings.xml rename to app/src/main/res/values-ru/strings.xml diff --git a/session/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml similarity index 100% rename from session/src/main/res/values-sk/strings.xml rename to app/src/main/res/values-sk/strings.xml diff --git a/session/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml similarity index 100% rename from session/src/main/res/values-sl/strings.xml rename to app/src/main/res/values-sl/strings.xml diff --git a/session/src/main/res/values-small/dimens.xml b/app/src/main/res/values-small/dimens.xml similarity index 100% rename from session/src/main/res/values-small/dimens.xml rename to app/src/main/res/values-small/dimens.xml diff --git a/session/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml similarity index 100% rename from session/src/main/res/values-sq/strings.xml rename to app/src/main/res/values-sq/strings.xml diff --git a/session/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml similarity index 100% rename from session/src/main/res/values-sr/strings.xml rename to app/src/main/res/values-sr/strings.xml diff --git a/session/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml similarity index 100% rename from session/src/main/res/values-sv/strings.xml rename to app/src/main/res/values-sv/strings.xml diff --git a/session/src/main/res/values-sw/strings.xml b/app/src/main/res/values-sw/strings.xml similarity index 100% rename from session/src/main/res/values-sw/strings.xml rename to app/src/main/res/values-sw/strings.xml diff --git a/session/src/main/res/values-sw360dp/dimens.xml b/app/src/main/res/values-sw360dp/dimens.xml similarity index 100% rename from session/src/main/res/values-sw360dp/dimens.xml rename to app/src/main/res/values-sw360dp/dimens.xml diff --git a/session/src/main/res/values-sw400dp/dimens.xml b/app/src/main/res/values-sw400dp/dimens.xml similarity index 100% rename from session/src/main/res/values-sw400dp/dimens.xml rename to app/src/main/res/values-sw400dp/dimens.xml diff --git a/session/src/main/res/values-sw480dp/dimens.xml b/app/src/main/res/values-sw480dp/dimens.xml similarity index 100% rename from session/src/main/res/values-sw480dp/dimens.xml rename to app/src/main/res/values-sw480dp/dimens.xml diff --git a/session/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml similarity index 100% rename from session/src/main/res/values-te/strings.xml rename to app/src/main/res/values-te/strings.xml diff --git a/session/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml similarity index 100% rename from session/src/main/res/values-th/strings.xml rename to app/src/main/res/values-th/strings.xml diff --git a/session/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml similarity index 100% rename from session/src/main/res/values-tr/strings.xml rename to app/src/main/res/values-tr/strings.xml diff --git a/session/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml similarity index 100% rename from session/src/main/res/values-uk/strings.xml rename to app/src/main/res/values-uk/strings.xml diff --git a/session/src/main/res/values-v23/themes.xml b/app/src/main/res/values-v23/themes.xml similarity index 100% rename from session/src/main/res/values-v23/themes.xml rename to app/src/main/res/values-v23/themes.xml diff --git a/session/src/main/res/values-v26/values.xml b/app/src/main/res/values-v26/values.xml similarity index 100% rename from session/src/main/res/values-v26/values.xml rename to app/src/main/res/values-v26/values.xml diff --git a/session/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml similarity index 100% rename from session/src/main/res/values-vi/strings.xml rename to app/src/main/res/values-vi/strings.xml diff --git a/session/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml similarity index 100% rename from session/src/main/res/values-zh-rCN/strings.xml rename to app/src/main/res/values-zh-rCN/strings.xml diff --git a/session/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml similarity index 100% rename from session/src/main/res/values-zh-rTW/strings.xml rename to app/src/main/res/values-zh-rTW/strings.xml diff --git a/session/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml similarity index 100% rename from session/src/main/res/values/arrays.xml rename to app/src/main/res/values/arrays.xml diff --git a/session/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml similarity index 100% rename from session/src/main/res/values/attrs.xml rename to app/src/main/res/values/attrs.xml diff --git a/session/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml similarity index 100% rename from session/src/main/res/values/colors.xml rename to app/src/main/res/values/colors.xml diff --git a/session/src/main/res/values/conversation_colors.xml b/app/src/main/res/values/conversation_colors.xml similarity index 100% rename from session/src/main/res/values/conversation_colors.xml rename to app/src/main/res/values/conversation_colors.xml diff --git a/session/src/main/res/values/core_colors.xml b/app/src/main/res/values/core_colors.xml similarity index 100% rename from session/src/main/res/values/core_colors.xml rename to app/src/main/res/values/core_colors.xml diff --git a/session/src/main/res/values/crop_area_renderer.xml b/app/src/main/res/values/crop_area_renderer.xml similarity index 100% rename from session/src/main/res/values/crop_area_renderer.xml rename to app/src/main/res/values/crop_area_renderer.xml diff --git a/session/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml similarity index 100% rename from session/src/main/res/values/dimens.xml rename to app/src/main/res/values/dimens.xml diff --git a/session/src/main/res/values/emoji.xml b/app/src/main/res/values/emoji.xml similarity index 100% rename from session/src/main/res/values/emoji.xml rename to app/src/main/res/values/emoji.xml diff --git a/session/src/main/res/values/google-playstore-strings.xml b/app/src/main/res/values/google-playstore-strings.xml similarity index 100% rename from session/src/main/res/values/google-playstore-strings.xml rename to app/src/main/res/values/google-playstore-strings.xml diff --git a/session/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml similarity index 100% rename from session/src/main/res/values/ic_launcher_background.xml rename to app/src/main/res/values/ic_launcher_background.xml diff --git a/session/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml similarity index 100% rename from session/src/main/res/values/ids.xml rename to app/src/main/res/values/ids.xml diff --git a/session/src/main/res/values/integers.xml b/app/src/main/res/values/integers.xml similarity index 100% rename from session/src/main/res/values/integers.xml rename to app/src/main/res/values/integers.xml diff --git a/session/src/main/res/values/material_colors.xml b/app/src/main/res/values/material_colors.xml similarity index 100% rename from session/src/main/res/values/material_colors.xml rename to app/src/main/res/values/material_colors.xml diff --git a/session/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml similarity index 100% rename from session/src/main/res/values/strings.xml rename to app/src/main/res/values/strings.xml diff --git a/session/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml similarity index 100% rename from session/src/main/res/values/styles.xml rename to app/src/main/res/values/styles.xml diff --git a/session/src/main/res/values/text_styles.xml b/app/src/main/res/values/text_styles.xml similarity index 100% rename from session/src/main/res/values/text_styles.xml rename to app/src/main/res/values/text_styles.xml diff --git a/session/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml similarity index 100% rename from session/src/main/res/values/themes.xml rename to app/src/main/res/values/themes.xml diff --git a/session/src/main/res/values/values.xml b/app/src/main/res/values/values.xml similarity index 100% rename from session/src/main/res/values/values.xml rename to app/src/main/res/values/values.xml diff --git a/session/src/main/res/values/vector_paths.xml b/app/src/main/res/values/vector_paths.xml similarity index 100% rename from session/src/main/res/values/vector_paths.xml rename to app/src/main/res/values/vector_paths.xml diff --git a/session/src/main/res/xml-mcc202-mnc1/mms_config.xml b/app/src/main/res/xml-mcc202-mnc1/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc202-mnc1/mms_config.xml rename to app/src/main/res/xml-mcc202-mnc1/mms_config.xml diff --git a/session/src/main/res/xml-mcc202-mnc5/mms_config.xml b/app/src/main/res/xml-mcc202-mnc5/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc202-mnc5/mms_config.xml rename to app/src/main/res/xml-mcc202-mnc5/mms_config.xml diff --git a/session/src/main/res/xml-mcc204-mnc16/mms_config.xml b/app/src/main/res/xml-mcc204-mnc16/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc204-mnc16/mms_config.xml rename to app/src/main/res/xml-mcc204-mnc16/mms_config.xml diff --git a/session/src/main/res/xml-mcc204-mnc20/mms_config.xml b/app/src/main/res/xml-mcc204-mnc20/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc204-mnc20/mms_config.xml rename to app/src/main/res/xml-mcc204-mnc20/mms_config.xml diff --git a/session/src/main/res/xml-mcc208-mnc1/mms_config.xml b/app/src/main/res/xml-mcc208-mnc1/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc208-mnc1/mms_config.xml rename to app/src/main/res/xml-mcc208-mnc1/mms_config.xml diff --git a/session/src/main/res/xml-mcc208-mnc10/mms_config.xml b/app/src/main/res/xml-mcc208-mnc10/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc208-mnc10/mms_config.xml rename to app/src/main/res/xml-mcc208-mnc10/mms_config.xml diff --git a/session/src/main/res/xml-mcc208-mnc15/mms_config.xml b/app/src/main/res/xml-mcc208-mnc15/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc208-mnc15/mms_config.xml rename to app/src/main/res/xml-mcc208-mnc15/mms_config.xml diff --git a/session/src/main/res/xml-mcc208-mnc20/mms_config.xml b/app/src/main/res/xml-mcc208-mnc20/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc208-mnc20/mms_config.xml rename to app/src/main/res/xml-mcc208-mnc20/mms_config.xml diff --git a/session/src/main/res/xml-mcc208-mnc26/mms_config.xml b/app/src/main/res/xml-mcc208-mnc26/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc208-mnc26/mms_config.xml rename to app/src/main/res/xml-mcc208-mnc26/mms_config.xml diff --git a/session/src/main/res/xml-mcc214-mnc1/mms_config.xml b/app/src/main/res/xml-mcc214-mnc1/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc214-mnc1/mms_config.xml rename to app/src/main/res/xml-mcc214-mnc1/mms_config.xml diff --git a/session/src/main/res/xml-mcc214-mnc17/mms_config.xml b/app/src/main/res/xml-mcc214-mnc17/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc214-mnc17/mms_config.xml rename to app/src/main/res/xml-mcc214-mnc17/mms_config.xml diff --git a/session/src/main/res/xml-mcc214-mnc21/mms_config.xml b/app/src/main/res/xml-mcc214-mnc21/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc214-mnc21/mms_config.xml rename to app/src/main/res/xml-mcc214-mnc21/mms_config.xml diff --git a/session/src/main/res/xml-mcc214-mnc3/mms_config.xml b/app/src/main/res/xml-mcc214-mnc3/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc214-mnc3/mms_config.xml rename to app/src/main/res/xml-mcc214-mnc3/mms_config.xml diff --git a/session/src/main/res/xml-mcc214-mnc6/mms_config.xml b/app/src/main/res/xml-mcc214-mnc6/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc214-mnc6/mms_config.xml rename to app/src/main/res/xml-mcc214-mnc6/mms_config.xml diff --git a/session/src/main/res/xml-mcc214-mnc7/mms_config.xml b/app/src/main/res/xml-mcc214-mnc7/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc214-mnc7/mms_config.xml rename to app/src/main/res/xml-mcc214-mnc7/mms_config.xml diff --git a/session/src/main/res/xml-mcc216-mnc30/mms_config.xml b/app/src/main/res/xml-mcc216-mnc30/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc216-mnc30/mms_config.xml rename to app/src/main/res/xml-mcc216-mnc30/mms_config.xml diff --git a/session/src/main/res/xml-mcc216-mnc70/mms_config.xml b/app/src/main/res/xml-mcc216-mnc70/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc216-mnc70/mms_config.xml rename to app/src/main/res/xml-mcc216-mnc70/mms_config.xml diff --git a/session/src/main/res/xml-mcc218-mnc5/mms_config.xml b/app/src/main/res/xml-mcc218-mnc5/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc218-mnc5/mms_config.xml rename to app/src/main/res/xml-mcc218-mnc5/mms_config.xml diff --git a/session/src/main/res/xml-mcc219-mnc1/mms_config.xml b/app/src/main/res/xml-mcc219-mnc1/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc219-mnc1/mms_config.xml rename to app/src/main/res/xml-mcc219-mnc1/mms_config.xml diff --git a/session/src/main/res/xml-mcc220-mnc4/mms_config.xml b/app/src/main/res/xml-mcc220-mnc4/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc220-mnc4/mms_config.xml rename to app/src/main/res/xml-mcc220-mnc4/mms_config.xml diff --git a/session/src/main/res/xml-mcc222-mnc1/mms_config.xml b/app/src/main/res/xml-mcc222-mnc1/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc222-mnc1/mms_config.xml rename to app/src/main/res/xml-mcc222-mnc1/mms_config.xml diff --git a/session/src/main/res/xml-mcc222-mnc10/mms_config.xml b/app/src/main/res/xml-mcc222-mnc10/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc222-mnc10/mms_config.xml rename to app/src/main/res/xml-mcc222-mnc10/mms_config.xml diff --git a/session/src/main/res/xml-mcc222-mnc8/mms_config.xml b/app/src/main/res/xml-mcc222-mnc8/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc222-mnc8/mms_config.xml rename to app/src/main/res/xml-mcc222-mnc8/mms_config.xml diff --git a/session/src/main/res/xml-mcc226-mnc1/mms_config.xml b/app/src/main/res/xml-mcc226-mnc1/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc226-mnc1/mms_config.xml rename to app/src/main/res/xml-mcc226-mnc1/mms_config.xml diff --git a/session/src/main/res/xml-mcc226-mnc10/mms_config.xml b/app/src/main/res/xml-mcc226-mnc10/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc226-mnc10/mms_config.xml rename to app/src/main/res/xml-mcc226-mnc10/mms_config.xml diff --git a/session/src/main/res/xml-mcc226-mnc3/mms_config.xml b/app/src/main/res/xml-mcc226-mnc3/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc226-mnc3/mms_config.xml rename to app/src/main/res/xml-mcc226-mnc3/mms_config.xml diff --git a/session/src/main/res/xml-mcc226-mnc6/mms_config.xml b/app/src/main/res/xml-mcc226-mnc6/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc226-mnc6/mms_config.xml rename to app/src/main/res/xml-mcc226-mnc6/mms_config.xml diff --git a/session/src/main/res/xml-mcc228-mnc1/mms_config.xml b/app/src/main/res/xml-mcc228-mnc1/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc228-mnc1/mms_config.xml rename to app/src/main/res/xml-mcc228-mnc1/mms_config.xml diff --git a/session/src/main/res/xml-mcc230-mnc1/mms_config.xml b/app/src/main/res/xml-mcc230-mnc1/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc230-mnc1/mms_config.xml rename to app/src/main/res/xml-mcc230-mnc1/mms_config.xml diff --git a/session/src/main/res/xml-mcc230-mnc3/mms_config.xml b/app/src/main/res/xml-mcc230-mnc3/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc230-mnc3/mms_config.xml rename to app/src/main/res/xml-mcc230-mnc3/mms_config.xml diff --git a/session/src/main/res/xml-mcc230-mnc99/mms_config.xml b/app/src/main/res/xml-mcc230-mnc99/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc230-mnc99/mms_config.xml rename to app/src/main/res/xml-mcc230-mnc99/mms_config.xml diff --git a/session/src/main/res/xml-mcc231-mnc2/mms_config.xml b/app/src/main/res/xml-mcc231-mnc2/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc231-mnc2/mms_config.xml rename to app/src/main/res/xml-mcc231-mnc2/mms_config.xml diff --git a/session/src/main/res/xml-mcc232-mnc1/mms_config.xml b/app/src/main/res/xml-mcc232-mnc1/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc232-mnc1/mms_config.xml rename to app/src/main/res/xml-mcc232-mnc1/mms_config.xml diff --git a/session/src/main/res/xml-mcc232-mnc3/mms_config.xml b/app/src/main/res/xml-mcc232-mnc3/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc232-mnc3/mms_config.xml rename to app/src/main/res/xml-mcc232-mnc3/mms_config.xml diff --git a/session/src/main/res/xml-mcc232-mnc7/mms_config.xml b/app/src/main/res/xml-mcc232-mnc7/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc232-mnc7/mms_config.xml rename to app/src/main/res/xml-mcc232-mnc7/mms_config.xml diff --git a/session/src/main/res/xml-mcc234-mnc15/mms_config.xml b/app/src/main/res/xml-mcc234-mnc15/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc234-mnc15/mms_config.xml rename to app/src/main/res/xml-mcc234-mnc15/mms_config.xml diff --git a/session/src/main/res/xml-mcc234-mnc3/mms_config.xml b/app/src/main/res/xml-mcc234-mnc3/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc234-mnc3/mms_config.xml rename to app/src/main/res/xml-mcc234-mnc3/mms_config.xml diff --git a/session/src/main/res/xml-mcc238-mnc2/mms_config.xml b/app/src/main/res/xml-mcc238-mnc2/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc238-mnc2/mms_config.xml rename to app/src/main/res/xml-mcc238-mnc2/mms_config.xml diff --git a/session/src/main/res/xml-mcc238-mnc77/mms_config.xml b/app/src/main/res/xml-mcc238-mnc77/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc238-mnc77/mms_config.xml rename to app/src/main/res/xml-mcc238-mnc77/mms_config.xml diff --git a/session/src/main/res/xml-mcc240-mnc1/mms_config.xml b/app/src/main/res/xml-mcc240-mnc1/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc240-mnc1/mms_config.xml rename to app/src/main/res/xml-mcc240-mnc1/mms_config.xml diff --git a/session/src/main/res/xml-mcc240-mnc24/mms_config.xml b/app/src/main/res/xml-mcc240-mnc24/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc240-mnc24/mms_config.xml rename to app/src/main/res/xml-mcc240-mnc24/mms_config.xml diff --git a/session/src/main/res/xml-mcc240-mnc4/mms_config.xml b/app/src/main/res/xml-mcc240-mnc4/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc240-mnc4/mms_config.xml rename to app/src/main/res/xml-mcc240-mnc4/mms_config.xml diff --git a/session/src/main/res/xml-mcc240-mnc8/mms_config.xml b/app/src/main/res/xml-mcc240-mnc8/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc240-mnc8/mms_config.xml rename to app/src/main/res/xml-mcc240-mnc8/mms_config.xml diff --git a/session/src/main/res/xml-mcc242-mnc1/mms_config.xml b/app/src/main/res/xml-mcc242-mnc1/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc242-mnc1/mms_config.xml rename to app/src/main/res/xml-mcc242-mnc1/mms_config.xml diff --git a/session/src/main/res/xml-mcc242-mnc2/mms_config.xml b/app/src/main/res/xml-mcc242-mnc2/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc242-mnc2/mms_config.xml rename to app/src/main/res/xml-mcc242-mnc2/mms_config.xml diff --git a/session/src/main/res/xml-mcc242-mnc5/mms_config.xml b/app/src/main/res/xml-mcc242-mnc5/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc242-mnc5/mms_config.xml rename to app/src/main/res/xml-mcc242-mnc5/mms_config.xml diff --git a/session/src/main/res/xml-mcc244-mnc91/mms_config.xml b/app/src/main/res/xml-mcc244-mnc91/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc244-mnc91/mms_config.xml rename to app/src/main/res/xml-mcc244-mnc91/mms_config.xml diff --git a/session/src/main/res/xml-mcc255-mnc1/mms_config.xml b/app/src/main/res/xml-mcc255-mnc1/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc255-mnc1/mms_config.xml rename to app/src/main/res/xml-mcc255-mnc1/mms_config.xml diff --git a/session/src/main/res/xml-mcc260-mnc1/mms_config.xml b/app/src/main/res/xml-mcc260-mnc1/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc260-mnc1/mms_config.xml rename to app/src/main/res/xml-mcc260-mnc1/mms_config.xml diff --git a/session/src/main/res/xml-mcc260-mnc2/mms_config.xml b/app/src/main/res/xml-mcc260-mnc2/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc260-mnc2/mms_config.xml rename to app/src/main/res/xml-mcc260-mnc2/mms_config.xml diff --git a/session/src/main/res/xml-mcc260-mnc3/mms_config.xml b/app/src/main/res/xml-mcc260-mnc3/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc260-mnc3/mms_config.xml rename to app/src/main/res/xml-mcc260-mnc3/mms_config.xml diff --git a/session/src/main/res/xml-mcc260-mnc5/mms_config.xml b/app/src/main/res/xml-mcc260-mnc5/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc260-mnc5/mms_config.xml rename to app/src/main/res/xml-mcc260-mnc5/mms_config.xml diff --git a/session/src/main/res/xml-mcc260-mnc6/mms_config.xml b/app/src/main/res/xml-mcc260-mnc6/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc260-mnc6/mms_config.xml rename to app/src/main/res/xml-mcc260-mnc6/mms_config.xml diff --git a/session/src/main/res/xml-mcc262-mnc1/mms_config.xml b/app/src/main/res/xml-mcc262-mnc1/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc262-mnc1/mms_config.xml rename to app/src/main/res/xml-mcc262-mnc1/mms_config.xml diff --git a/session/src/main/res/xml-mcc262-mnc2/mms_config.xml b/app/src/main/res/xml-mcc262-mnc2/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc262-mnc2/mms_config.xml rename to app/src/main/res/xml-mcc262-mnc2/mms_config.xml diff --git a/session/src/main/res/xml-mcc262-mnc4/mms_config.xml b/app/src/main/res/xml-mcc262-mnc4/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc262-mnc4/mms_config.xml rename to app/src/main/res/xml-mcc262-mnc4/mms_config.xml diff --git a/session/src/main/res/xml-mcc262-mnc7/mms_config.xml b/app/src/main/res/xml-mcc262-mnc7/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc262-mnc7/mms_config.xml rename to app/src/main/res/xml-mcc262-mnc7/mms_config.xml diff --git a/session/src/main/res/xml-mcc262-mnc9/mms_config.xml b/app/src/main/res/xml-mcc262-mnc9/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc262-mnc9/mms_config.xml rename to app/src/main/res/xml-mcc262-mnc9/mms_config.xml diff --git a/session/src/main/res/xml-mcc268-mnc1/mms_config.xml b/app/src/main/res/xml-mcc268-mnc1/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc268-mnc1/mms_config.xml rename to app/src/main/res/xml-mcc268-mnc1/mms_config.xml diff --git a/session/src/main/res/xml-mcc272-mnc1/mms_config.xml b/app/src/main/res/xml-mcc272-mnc1/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc272-mnc1/mms_config.xml rename to app/src/main/res/xml-mcc272-mnc1/mms_config.xml diff --git a/session/src/main/res/xml-mcc274-mnc2/mms_config.xml b/app/src/main/res/xml-mcc274-mnc2/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc274-mnc2/mms_config.xml rename to app/src/main/res/xml-mcc274-mnc2/mms_config.xml diff --git a/session/src/main/res/xml-mcc274-mnc3/mms_config.xml b/app/src/main/res/xml-mcc274-mnc3/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc274-mnc3/mms_config.xml rename to app/src/main/res/xml-mcc274-mnc3/mms_config.xml diff --git a/session/src/main/res/xml-mcc276-mnc2/mms_config.xml b/app/src/main/res/xml-mcc276-mnc2/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc276-mnc2/mms_config.xml rename to app/src/main/res/xml-mcc276-mnc2/mms_config.xml diff --git a/session/src/main/res/xml-mcc278-mnc1/mms_config.xml b/app/src/main/res/xml-mcc278-mnc1/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc278-mnc1/mms_config.xml rename to app/src/main/res/xml-mcc278-mnc1/mms_config.xml diff --git a/session/src/main/res/xml-mcc284-mnc1/mms_config.xml b/app/src/main/res/xml-mcc284-mnc1/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc284-mnc1/mms_config.xml rename to app/src/main/res/xml-mcc284-mnc1/mms_config.xml diff --git a/session/src/main/res/xml-mcc286-mnc1/mms_config.xml b/app/src/main/res/xml-mcc286-mnc1/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc286-mnc1/mms_config.xml rename to app/src/main/res/xml-mcc286-mnc1/mms_config.xml diff --git a/session/src/main/res/xml-mcc286-mnc2/mms_config.xml b/app/src/main/res/xml-mcc286-mnc2/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc286-mnc2/mms_config.xml rename to app/src/main/res/xml-mcc286-mnc2/mms_config.xml diff --git a/session/src/main/res/xml-mcc286-mnc3/mms_config.xml b/app/src/main/res/xml-mcc286-mnc3/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc286-mnc3/mms_config.xml rename to app/src/main/res/xml-mcc286-mnc3/mms_config.xml diff --git a/session/src/main/res/xml-mcc293-mnc40/mms_config.xml b/app/src/main/res/xml-mcc293-mnc40/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc293-mnc40/mms_config.xml rename to app/src/main/res/xml-mcc293-mnc40/mms_config.xml diff --git a/session/src/main/res/xml-mcc294-mnc1/mms_config.xml b/app/src/main/res/xml-mcc294-mnc1/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc294-mnc1/mms_config.xml rename to app/src/main/res/xml-mcc294-mnc1/mms_config.xml diff --git a/session/src/main/res/xml-mcc294-mnc2/mms_config.xml b/app/src/main/res/xml-mcc294-mnc2/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc294-mnc2/mms_config.xml rename to app/src/main/res/xml-mcc294-mnc2/mms_config.xml diff --git a/session/src/main/res/xml-mcc294-mnc3/mms_config.xml b/app/src/main/res/xml-mcc294-mnc3/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc294-mnc3/mms_config.xml rename to app/src/main/res/xml-mcc294-mnc3/mms_config.xml diff --git a/session/src/main/res/xml-mcc297-mnc2/mms_config.xml b/app/src/main/res/xml-mcc297-mnc2/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc297-mnc2/mms_config.xml rename to app/src/main/res/xml-mcc297-mnc2/mms_config.xml diff --git a/session/src/main/res/xml-mcc302-mnc220/mms_config.xml b/app/src/main/res/xml-mcc302-mnc220/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc302-mnc220/mms_config.xml rename to app/src/main/res/xml-mcc302-mnc220/mms_config.xml diff --git a/session/src/main/res/xml-mcc302-mnc221/mms_config.xml b/app/src/main/res/xml-mcc302-mnc221/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc302-mnc221/mms_config.xml rename to app/src/main/res/xml-mcc302-mnc221/mms_config.xml diff --git a/session/src/main/res/xml-mcc302-mnc270/mms_config.xml b/app/src/main/res/xml-mcc302-mnc270/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc302-mnc270/mms_config.xml rename to app/src/main/res/xml-mcc302-mnc270/mms_config.xml diff --git a/session/src/main/res/xml-mcc302-mnc290/mms_config.xml b/app/src/main/res/xml-mcc302-mnc290/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc302-mnc290/mms_config.xml rename to app/src/main/res/xml-mcc302-mnc290/mms_config.xml diff --git a/session/src/main/res/xml-mcc302-mnc320/mms_config.xml b/app/src/main/res/xml-mcc302-mnc320/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc302-mnc320/mms_config.xml rename to app/src/main/res/xml-mcc302-mnc320/mms_config.xml diff --git a/session/src/main/res/xml-mcc302-mnc370/mms_config.xml b/app/src/main/res/xml-mcc302-mnc370/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc302-mnc370/mms_config.xml rename to app/src/main/res/xml-mcc302-mnc370/mms_config.xml diff --git a/session/src/main/res/xml-mcc302-mnc490/mms_config.xml b/app/src/main/res/xml-mcc302-mnc490/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc302-mnc490/mms_config.xml rename to app/src/main/res/xml-mcc302-mnc490/mms_config.xml diff --git a/session/src/main/res/xml-mcc302-mnc500/mms_config.xml b/app/src/main/res/xml-mcc302-mnc500/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc302-mnc500/mms_config.xml rename to app/src/main/res/xml-mcc302-mnc500/mms_config.xml diff --git a/session/src/main/res/xml-mcc302-mnc510/mms_config.xml b/app/src/main/res/xml-mcc302-mnc510/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc302-mnc510/mms_config.xml rename to app/src/main/res/xml-mcc302-mnc510/mms_config.xml diff --git a/session/src/main/res/xml-mcc302-mnc520/mms_config.xml b/app/src/main/res/xml-mcc302-mnc520/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc302-mnc520/mms_config.xml rename to app/src/main/res/xml-mcc302-mnc520/mms_config.xml diff --git a/session/src/main/res/xml-mcc302-mnc610/mms_config.xml b/app/src/main/res/xml-mcc302-mnc610/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc302-mnc610/mms_config.xml rename to app/src/main/res/xml-mcc302-mnc610/mms_config.xml diff --git a/session/src/main/res/xml-mcc302-mnc660/mms_config.xml b/app/src/main/res/xml-mcc302-mnc660/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc302-mnc660/mms_config.xml rename to app/src/main/res/xml-mcc302-mnc660/mms_config.xml diff --git a/session/src/main/res/xml-mcc302-mnc720/mms_config.xml b/app/src/main/res/xml-mcc302-mnc720/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc302-mnc720/mms_config.xml rename to app/src/main/res/xml-mcc302-mnc720/mms_config.xml diff --git a/session/src/main/res/xml-mcc302-mnc780/mms_config.xml b/app/src/main/res/xml-mcc302-mnc780/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc302-mnc780/mms_config.xml rename to app/src/main/res/xml-mcc302-mnc780/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc10/mms_config.xml b/app/src/main/res/xml-mcc310-mnc10/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc10/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc10/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc12/mms_config.xml b/app/src/main/res/xml-mcc310-mnc12/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc12/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc12/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc120/mms_config.xml b/app/src/main/res/xml-mcc310-mnc120/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc120/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc120/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc13/mms_config.xml b/app/src/main/res/xml-mcc310-mnc13/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc13/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc13/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc130/mms_config.xml b/app/src/main/res/xml-mcc310-mnc130/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc130/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc130/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc150/mms_config.xml b/app/src/main/res/xml-mcc310-mnc150/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc150/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc150/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc160/mms_config.xml b/app/src/main/res/xml-mcc310-mnc160/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc160/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc160/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc170/mms_config.xml b/app/src/main/res/xml-mcc310-mnc170/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc170/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc170/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc26/mms_config.xml b/app/src/main/res/xml-mcc310-mnc26/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc26/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc26/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc260/mms_config.xml b/app/src/main/res/xml-mcc310-mnc260/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc260/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc260/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc360/mms_config.xml b/app/src/main/res/xml-mcc310-mnc360/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc360/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc360/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc380/mms_config.xml b/app/src/main/res/xml-mcc310-mnc380/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc380/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc380/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc4/mms_config.xml b/app/src/main/res/xml-mcc310-mnc4/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc4/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc4/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc40/mms_config.xml b/app/src/main/res/xml-mcc310-mnc40/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc40/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc40/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc410/mms_config.xml b/app/src/main/res/xml-mcc310-mnc410/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc410/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc410/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc420/mms_config.xml b/app/src/main/res/xml-mcc310-mnc420/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc420/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc420/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc450/mms_config.xml b/app/src/main/res/xml-mcc310-mnc450/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc450/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc450/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc470/mms_config.xml b/app/src/main/res/xml-mcc310-mnc470/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc470/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc470/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc490/mms_config.xml b/app/src/main/res/xml-mcc310-mnc490/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc490/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc490/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc5/mms_config.xml b/app/src/main/res/xml-mcc310-mnc5/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc5/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc5/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc560/mms_config.xml b/app/src/main/res/xml-mcc310-mnc560/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc560/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc560/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc580/mms_config.xml b/app/src/main/res/xml-mcc310-mnc580/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc580/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc580/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc590/mms_config.xml b/app/src/main/res/xml-mcc310-mnc590/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc590/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc590/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc600/mms_config.xml b/app/src/main/res/xml-mcc310-mnc600/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc600/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc600/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc680/mms_config.xml b/app/src/main/res/xml-mcc310-mnc680/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc680/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc680/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc70/mms_config.xml b/app/src/main/res/xml-mcc310-mnc70/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc70/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc70/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc750/mms_config.xml b/app/src/main/res/xml-mcc310-mnc750/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc750/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc750/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc770/mms_config.xml b/app/src/main/res/xml-mcc310-mnc770/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc770/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc770/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc890/mms_config.xml b/app/src/main/res/xml-mcc310-mnc890/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc890/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc890/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc90/mms_config.xml b/app/src/main/res/xml-mcc310-mnc90/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc90/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc90/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc910/mms_config.xml b/app/src/main/res/xml-mcc310-mnc910/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc910/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc910/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc920/mms_config.xml b/app/src/main/res/xml-mcc310-mnc920/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc920/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc920/mms_config.xml diff --git a/session/src/main/res/xml-mcc310-mnc980/mms_config.xml b/app/src/main/res/xml-mcc310-mnc980/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc310-mnc980/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc980/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc100/mms_config.xml b/app/src/main/res/xml-mcc311-mnc100/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc100/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc100/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc110/mms_config.xml b/app/src/main/res/xml-mcc311-mnc110/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc110/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc110/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc12/mms_config.xml b/app/src/main/res/xml-mcc311-mnc12/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc12/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc12/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc180/mms_config.xml b/app/src/main/res/xml-mcc311-mnc180/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc180/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc180/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc220/mms_config.xml b/app/src/main/res/xml-mcc311-mnc220/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc220/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc220/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc221/mms_config.xml b/app/src/main/res/xml-mcc311-mnc221/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc221/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc221/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc222/mms_config.xml b/app/src/main/res/xml-mcc311-mnc222/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc222/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc222/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc223/mms_config.xml b/app/src/main/res/xml-mcc311-mnc223/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc223/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc223/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc224/mms_config.xml b/app/src/main/res/xml-mcc311-mnc224/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc224/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc224/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc225/mms_config.xml b/app/src/main/res/xml-mcc311-mnc225/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc225/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc225/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc226/mms_config.xml b/app/src/main/res/xml-mcc311-mnc226/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc226/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc226/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc227/mms_config.xml b/app/src/main/res/xml-mcc311-mnc227/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc227/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc227/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc228/mms_config.xml b/app/src/main/res/xml-mcc311-mnc228/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc228/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc228/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc229/mms_config.xml b/app/src/main/res/xml-mcc311-mnc229/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc229/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc229/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc230/mms_config.xml b/app/src/main/res/xml-mcc311-mnc230/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc230/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc230/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc270/mms_config.xml b/app/src/main/res/xml-mcc311-mnc270/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc270/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc270/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc271/mms_config.xml b/app/src/main/res/xml-mcc311-mnc271/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc271/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc271/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc272/mms_config.xml b/app/src/main/res/xml-mcc311-mnc272/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc272/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc272/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc273/mms_config.xml b/app/src/main/res/xml-mcc311-mnc273/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc273/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc273/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc274/mms_config.xml b/app/src/main/res/xml-mcc311-mnc274/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc274/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc274/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc275/mms_config.xml b/app/src/main/res/xml-mcc311-mnc275/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc275/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc275/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc276/mms_config.xml b/app/src/main/res/xml-mcc311-mnc276/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc276/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc276/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc277/mms_config.xml b/app/src/main/res/xml-mcc311-mnc277/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc277/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc277/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc278/mms_config.xml b/app/src/main/res/xml-mcc311-mnc278/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc278/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc278/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc279/mms_config.xml b/app/src/main/res/xml-mcc311-mnc279/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc279/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc279/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc280/mms_config.xml b/app/src/main/res/xml-mcc311-mnc280/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc280/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc280/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc281/mms_config.xml b/app/src/main/res/xml-mcc311-mnc281/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc281/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc281/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc282/mms_config.xml b/app/src/main/res/xml-mcc311-mnc282/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc282/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc282/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc283/mms_config.xml b/app/src/main/res/xml-mcc311-mnc283/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc283/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc283/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc284/mms_config.xml b/app/src/main/res/xml-mcc311-mnc284/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc284/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc284/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc285/mms_config.xml b/app/src/main/res/xml-mcc311-mnc285/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc285/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc285/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc286/mms_config.xml b/app/src/main/res/xml-mcc311-mnc286/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc286/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc286/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc287/mms_config.xml b/app/src/main/res/xml-mcc311-mnc287/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc287/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc287/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc288/mms_config.xml b/app/src/main/res/xml-mcc311-mnc288/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc288/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc288/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc289/mms_config.xml b/app/src/main/res/xml-mcc311-mnc289/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc289/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc289/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc340/mms_config.xml b/app/src/main/res/xml-mcc311-mnc340/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc340/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc340/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc370/mms_config.xml b/app/src/main/res/xml-mcc311-mnc370/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc370/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc370/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc390/mms_config.xml b/app/src/main/res/xml-mcc311-mnc390/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc390/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc390/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc410/mms_config.xml b/app/src/main/res/xml-mcc311-mnc410/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc410/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc410/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc430/mms_config.xml b/app/src/main/res/xml-mcc311-mnc430/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc430/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc430/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc440/mms_config.xml b/app/src/main/res/xml-mcc311-mnc440/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc440/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc440/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc480/mms_config.xml b/app/src/main/res/xml-mcc311-mnc480/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc480/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc480/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc481/mms_config.xml b/app/src/main/res/xml-mcc311-mnc481/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc481/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc481/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc482/mms_config.xml b/app/src/main/res/xml-mcc311-mnc482/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc482/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc482/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc483/mms_config.xml b/app/src/main/res/xml-mcc311-mnc483/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc483/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc483/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc484/mms_config.xml b/app/src/main/res/xml-mcc311-mnc484/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc484/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc484/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc485/mms_config.xml b/app/src/main/res/xml-mcc311-mnc485/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc485/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc485/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc486/mms_config.xml b/app/src/main/res/xml-mcc311-mnc486/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc486/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc486/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc487/mms_config.xml b/app/src/main/res/xml-mcc311-mnc487/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc487/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc487/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc488/mms_config.xml b/app/src/main/res/xml-mcc311-mnc488/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc488/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc488/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc489/mms_config.xml b/app/src/main/res/xml-mcc311-mnc489/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc489/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc489/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc490/mms_config.xml b/app/src/main/res/xml-mcc311-mnc490/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc490/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc490/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc580/mms_config.xml b/app/src/main/res/xml-mcc311-mnc580/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc580/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc580/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc581/mms_config.xml b/app/src/main/res/xml-mcc311-mnc581/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc581/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc581/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc582/mms_config.xml b/app/src/main/res/xml-mcc311-mnc582/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc582/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc582/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc583/mms_config.xml b/app/src/main/res/xml-mcc311-mnc583/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc583/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc583/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc584/mms_config.xml b/app/src/main/res/xml-mcc311-mnc584/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc584/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc584/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc585/mms_config.xml b/app/src/main/res/xml-mcc311-mnc585/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc585/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc585/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc586/mms_config.xml b/app/src/main/res/xml-mcc311-mnc586/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc586/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc586/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc587/mms_config.xml b/app/src/main/res/xml-mcc311-mnc587/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc587/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc587/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc588/mms_config.xml b/app/src/main/res/xml-mcc311-mnc588/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc588/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc588/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc589/mms_config.xml b/app/src/main/res/xml-mcc311-mnc589/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc589/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc589/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc590/mms_config.xml b/app/src/main/res/xml-mcc311-mnc590/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc590/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc590/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc70/mms_config.xml b/app/src/main/res/xml-mcc311-mnc70/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc70/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc70/mms_config.xml diff --git a/session/src/main/res/xml-mcc311-mnc870/mms_config.xml b/app/src/main/res/xml-mcc311-mnc870/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc311-mnc870/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc870/mms_config.xml diff --git a/session/src/main/res/xml-mcc312-mnc160/mms_config.xml b/app/src/main/res/xml-mcc312-mnc160/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc312-mnc160/mms_config.xml rename to app/src/main/res/xml-mcc312-mnc160/mms_config.xml diff --git a/session/src/main/res/xml-mcc312-mnc420/mms_config.xml b/app/src/main/res/xml-mcc312-mnc420/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc312-mnc420/mms_config.xml rename to app/src/main/res/xml-mcc312-mnc420/mms_config.xml diff --git a/session/src/main/res/xml-mcc312-mnc530/mms_config.xml b/app/src/main/res/xml-mcc312-mnc530/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc312-mnc530/mms_config.xml rename to app/src/main/res/xml-mcc312-mnc530/mms_config.xml diff --git a/session/src/main/res/xml-mcc334-mnc2/mms_config.xml b/app/src/main/res/xml-mcc334-mnc2/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc334-mnc2/mms_config.xml rename to app/src/main/res/xml-mcc334-mnc2/mms_config.xml diff --git a/session/src/main/res/xml-mcc334-mnc20/mms_config.xml b/app/src/main/res/xml-mcc334-mnc20/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc334-mnc20/mms_config.xml rename to app/src/main/res/xml-mcc334-mnc20/mms_config.xml diff --git a/session/src/main/res/xml-mcc418-mnc20/mms_config.xml b/app/src/main/res/xml-mcc418-mnc20/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc418-mnc20/mms_config.xml rename to app/src/main/res/xml-mcc418-mnc20/mms_config.xml diff --git a/session/src/main/res/xml-mcc418-mnc30/mms_config.xml b/app/src/main/res/xml-mcc418-mnc30/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc418-mnc30/mms_config.xml rename to app/src/main/res/xml-mcc418-mnc30/mms_config.xml diff --git a/session/src/main/res/xml-mcc418-mnc5/mms_config.xml b/app/src/main/res/xml-mcc418-mnc5/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc418-mnc5/mms_config.xml rename to app/src/main/res/xml-mcc418-mnc5/mms_config.xml diff --git a/session/src/main/res/xml-mcc420-mnc4/mms_config.xml b/app/src/main/res/xml-mcc420-mnc4/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc420-mnc4/mms_config.xml rename to app/src/main/res/xml-mcc420-mnc4/mms_config.xml diff --git a/session/src/main/res/xml-mcc426-mnc2/mms_config.xml b/app/src/main/res/xml-mcc426-mnc2/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc426-mnc2/mms_config.xml rename to app/src/main/res/xml-mcc426-mnc2/mms_config.xml diff --git a/session/src/main/res/xml-mcc427-mnc2/mms_config.xml b/app/src/main/res/xml-mcc427-mnc2/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc427-mnc2/mms_config.xml rename to app/src/main/res/xml-mcc427-mnc2/mms_config.xml diff --git a/session/src/main/res/xml-mcc440-mnc20/mms_config.xml b/app/src/main/res/xml-mcc440-mnc20/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc440-mnc20/mms_config.xml rename to app/src/main/res/xml-mcc440-mnc20/mms_config.xml diff --git a/session/src/main/res/xml-mcc450-mnc00/mms_config.xml b/app/src/main/res/xml-mcc450-mnc00/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc450-mnc00/mms_config.xml rename to app/src/main/res/xml-mcc450-mnc00/mms_config.xml diff --git a/session/src/main/res/xml-mcc450-mnc2/mms_config.xml b/app/src/main/res/xml-mcc450-mnc2/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc450-mnc2/mms_config.xml rename to app/src/main/res/xml-mcc450-mnc2/mms_config.xml diff --git a/session/src/main/res/xml-mcc450-mnc5/mms_config.xml b/app/src/main/res/xml-mcc450-mnc5/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc450-mnc5/mms_config.xml rename to app/src/main/res/xml-mcc450-mnc5/mms_config.xml diff --git a/session/src/main/res/xml-mcc450-mnc6/mms_config.xml b/app/src/main/res/xml-mcc450-mnc6/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc450-mnc6/mms_config.xml rename to app/src/main/res/xml-mcc450-mnc6/mms_config.xml diff --git a/session/src/main/res/xml-mcc450-mnc8/mms_config.xml b/app/src/main/res/xml-mcc450-mnc8/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc450-mnc8/mms_config.xml rename to app/src/main/res/xml-mcc450-mnc8/mms_config.xml diff --git a/session/src/main/res/xml-mcc505-mnc1/mms_config.xml b/app/src/main/res/xml-mcc505-mnc1/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc505-mnc1/mms_config.xml rename to app/src/main/res/xml-mcc505-mnc1/mms_config.xml diff --git a/session/src/main/res/xml-mcc505-mnc3/mms_config.xml b/app/src/main/res/xml-mcc505-mnc3/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc505-mnc3/mms_config.xml rename to app/src/main/res/xml-mcc505-mnc3/mms_config.xml diff --git a/session/src/main/res/xml-mcc505-mnc7/mms_config.xml b/app/src/main/res/xml-mcc505-mnc7/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc505-mnc7/mms_config.xml rename to app/src/main/res/xml-mcc505-mnc7/mms_config.xml diff --git a/session/src/main/res/xml-mcc530-mnc1/mms_config.xml b/app/src/main/res/xml-mcc530-mnc1/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc530-mnc1/mms_config.xml rename to app/src/main/res/xml-mcc530-mnc1/mms_config.xml diff --git a/session/src/main/res/xml-mcc530-mnc5/mms_config.xml b/app/src/main/res/xml-mcc530-mnc5/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc530-mnc5/mms_config.xml rename to app/src/main/res/xml-mcc530-mnc5/mms_config.xml diff --git a/session/src/main/res/xml-mcc602-mnc2/mms_config.xml b/app/src/main/res/xml-mcc602-mnc2/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc602-mnc2/mms_config.xml rename to app/src/main/res/xml-mcc602-mnc2/mms_config.xml diff --git a/session/src/main/res/xml-mcc604-mnc00/mms_config.xml b/app/src/main/res/xml-mcc604-mnc00/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc604-mnc00/mms_config.xml rename to app/src/main/res/xml-mcc604-mnc00/mms_config.xml diff --git a/session/src/main/res/xml-mcc604-mnc2/mms_config.xml b/app/src/main/res/xml-mcc604-mnc2/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc604-mnc2/mms_config.xml rename to app/src/main/res/xml-mcc604-mnc2/mms_config.xml diff --git a/session/src/main/res/xml-mcc647-mnc10/mms_config.xml b/app/src/main/res/xml-mcc647-mnc10/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc647-mnc10/mms_config.xml rename to app/src/main/res/xml-mcc647-mnc10/mms_config.xml diff --git a/session/src/main/res/xml-mcc655-mnc1/mms_config.xml b/app/src/main/res/xml-mcc655-mnc1/mms_config.xml similarity index 100% rename from session/src/main/res/xml-mcc655-mnc1/mms_config.xml rename to app/src/main/res/xml-mcc655-mnc1/mms_config.xml diff --git a/session/src/main/res/xml/automotive_app_desc.xml b/app/src/main/res/xml/automotive_app_desc.xml similarity index 100% rename from session/src/main/res/xml/automotive_app_desc.xml rename to app/src/main/res/xml/automotive_app_desc.xml diff --git a/session/src/main/res/xml/contactsformat.xml b/app/src/main/res/xml/contactsformat.xml similarity index 100% rename from session/src/main/res/xml/contactsformat.xml rename to app/src/main/res/xml/contactsformat.xml diff --git a/session/src/main/res/xml/file_provider_paths.xml b/app/src/main/res/xml/file_provider_paths.xml similarity index 100% rename from session/src/main/res/xml/file_provider_paths.xml rename to app/src/main/res/xml/file_provider_paths.xml diff --git a/session/src/main/res/xml/mms_config.xml b/app/src/main/res/xml/mms_config.xml similarity index 100% rename from session/src/main/res/xml/mms_config.xml rename to app/src/main/res/xml/mms_config.xml diff --git a/session/src/main/res/xml/network_security_configuration.xml b/app/src/main/res/xml/network_security_configuration.xml similarity index 100% rename from session/src/main/res/xml/network_security_configuration.xml rename to app/src/main/res/xml/network_security_configuration.xml diff --git a/session/src/main/res/xml/pin_keyboard.xml b/app/src/main/res/xml/pin_keyboard.xml similarity index 100% rename from session/src/main/res/xml/pin_keyboard.xml rename to app/src/main/res/xml/pin_keyboard.xml diff --git a/session/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml similarity index 100% rename from session/src/main/res/xml/preferences.xml rename to app/src/main/res/xml/preferences.xml diff --git a/session/src/main/res/xml/preferences_advanced.xml b/app/src/main/res/xml/preferences_advanced.xml similarity index 100% rename from session/src/main/res/xml/preferences_advanced.xml rename to app/src/main/res/xml/preferences_advanced.xml diff --git a/session/src/main/res/xml/preferences_app_protection.xml b/app/src/main/res/xml/preferences_app_protection.xml similarity index 100% rename from session/src/main/res/xml/preferences_app_protection.xml rename to app/src/main/res/xml/preferences_app_protection.xml diff --git a/session/src/main/res/xml/preferences_appearance.xml b/app/src/main/res/xml/preferences_appearance.xml similarity index 100% rename from session/src/main/res/xml/preferences_appearance.xml rename to app/src/main/res/xml/preferences_appearance.xml diff --git a/session/src/main/res/xml/preferences_chats.xml b/app/src/main/res/xml/preferences_chats.xml similarity index 100% rename from session/src/main/res/xml/preferences_chats.xml rename to app/src/main/res/xml/preferences_chats.xml diff --git a/session/src/main/res/xml/preferences_manual_mms.xml b/app/src/main/res/xml/preferences_manual_mms.xml similarity index 100% rename from session/src/main/res/xml/preferences_manual_mms.xml rename to app/src/main/res/xml/preferences_manual_mms.xml diff --git a/session/src/main/res/xml/preferences_notifications.xml b/app/src/main/res/xml/preferences_notifications.xml similarity index 100% rename from session/src/main/res/xml/preferences_notifications.xml rename to app/src/main/res/xml/preferences_notifications.xml diff --git a/session/src/main/res/xml/preferences_sms_mms.xml b/app/src/main/res/xml/preferences_sms_mms.xml similarity index 100% rename from session/src/main/res/xml/preferences_sms_mms.xml rename to app/src/main/res/xml/preferences_sms_mms.xml diff --git a/session/src/main/res/xml/recipient_preferences.xml b/app/src/main/res/xml/recipient_preferences.xml similarity index 100% rename from session/src/main/res/xml/recipient_preferences.xml rename to app/src/main/res/xml/recipient_preferences.xml diff --git a/session/src/main/res/xml/syncadapter.xml b/app/src/main/res/xml/syncadapter.xml similarity index 100% rename from session/src/main/res/xml/syncadapter.xml rename to app/src/main/res/xml/syncadapter.xml diff --git a/session/src/test/java/org/thoughtcrime/securesms/BaseUnitTest.java b/app/src/test/java/org/thoughtcrime/securesms/BaseUnitTest.java similarity index 100% rename from session/src/test/java/org/thoughtcrime/securesms/BaseUnitTest.java rename to app/src/test/java/org/thoughtcrime/securesms/BaseUnitTest.java diff --git a/session/src/test/java/org/thoughtcrime/securesms/camera/OrderEnforcerTest.java b/app/src/test/java/org/thoughtcrime/securesms/camera/OrderEnforcerTest.java similarity index 100% rename from session/src/test/java/org/thoughtcrime/securesms/camera/OrderEnforcerTest.java rename to app/src/test/java/org/thoughtcrime/securesms/camera/OrderEnforcerTest.java diff --git a/session/src/test/java/org/thoughtcrime/securesms/conversation/ConversationAdapterTest.java b/app/src/test/java/org/thoughtcrime/securesms/conversation/ConversationAdapterTest.java similarity index 100% rename from session/src/test/java/org/thoughtcrime/securesms/conversation/ConversationAdapterTest.java rename to app/src/test/java/org/thoughtcrime/securesms/conversation/ConversationAdapterTest.java diff --git a/session/src/test/java/org/thoughtcrime/securesms/database/CursorRecyclerViewAdapterTest.java b/app/src/test/java/org/thoughtcrime/securesms/database/CursorRecyclerViewAdapterTest.java similarity index 100% rename from session/src/test/java/org/thoughtcrime/securesms/database/CursorRecyclerViewAdapterTest.java rename to app/src/test/java/org/thoughtcrime/securesms/database/CursorRecyclerViewAdapterTest.java diff --git a/session/src/test/java/org/thoughtcrime/securesms/jobmanager/impl/JsonDataSerializerTest.java b/app/src/test/java/org/thoughtcrime/securesms/jobmanager/impl/JsonDataSerializerTest.java similarity index 100% rename from session/src/test/java/org/thoughtcrime/securesms/jobmanager/impl/JsonDataSerializerTest.java rename to app/src/test/java/org/thoughtcrime/securesms/jobmanager/impl/JsonDataSerializerTest.java diff --git a/session/src/test/java/org/thoughtcrime/securesms/jobs/FastJobStorageTest.java b/app/src/test/java/org/thoughtcrime/securesms/jobs/FastJobStorageTest.java similarity index 100% rename from session/src/test/java/org/thoughtcrime/securesms/jobs/FastJobStorageTest.java rename to app/src/test/java/org/thoughtcrime/securesms/jobs/FastJobStorageTest.java diff --git a/session/src/test/java/org/thoughtcrime/securesms/l10n/LanguageResourcesTest.java b/app/src/test/java/org/thoughtcrime/securesms/l10n/LanguageResourcesTest.java similarity index 100% rename from session/src/test/java/org/thoughtcrime/securesms/l10n/LanguageResourcesTest.java rename to app/src/test/java/org/thoughtcrime/securesms/l10n/LanguageResourcesTest.java diff --git a/session/src/test/java/org/thoughtcrime/securesms/linkpreview/LinkPreviewUtilTest.java b/app/src/test/java/org/thoughtcrime/securesms/linkpreview/LinkPreviewUtilTest.java similarity index 100% rename from session/src/test/java/org/thoughtcrime/securesms/linkpreview/LinkPreviewUtilTest.java rename to app/src/test/java/org/thoughtcrime/securesms/linkpreview/LinkPreviewUtilTest.java diff --git a/session/src/test/java/org/thoughtcrime/securesms/logging/LogTest.java b/app/src/test/java/org/thoughtcrime/securesms/logging/LogTest.java similarity index 100% rename from session/src/test/java/org/thoughtcrime/securesms/logging/LogTest.java rename to app/src/test/java/org/thoughtcrime/securesms/logging/LogTest.java diff --git a/session/src/test/java/org/thoughtcrime/securesms/recipients/RecipientExporterTest.java b/app/src/test/java/org/thoughtcrime/securesms/recipients/RecipientExporterTest.java similarity index 100% rename from session/src/test/java/org/thoughtcrime/securesms/recipients/RecipientExporterTest.java rename to app/src/test/java/org/thoughtcrime/securesms/recipients/RecipientExporterTest.java diff --git a/session/src/test/java/org/thoughtcrime/securesms/service/VerificationCodeParserTest.java b/app/src/test/java/org/thoughtcrime/securesms/service/VerificationCodeParserTest.java similarity index 100% rename from session/src/test/java/org/thoughtcrime/securesms/service/VerificationCodeParserTest.java rename to app/src/test/java/org/thoughtcrime/securesms/service/VerificationCodeParserTest.java diff --git a/session/src/test/java/org/thoughtcrime/securesms/testutil/DirectExecutor.java b/app/src/test/java/org/thoughtcrime/securesms/testutil/DirectExecutor.java similarity index 100% rename from session/src/test/java/org/thoughtcrime/securesms/testutil/DirectExecutor.java rename to app/src/test/java/org/thoughtcrime/securesms/testutil/DirectExecutor.java diff --git a/session/src/test/java/org/thoughtcrime/securesms/util/DelimiterUtilTest.java b/app/src/test/java/org/thoughtcrime/securesms/util/DelimiterUtilTest.java similarity index 100% rename from session/src/test/java/org/thoughtcrime/securesms/util/DelimiterUtilTest.java rename to app/src/test/java/org/thoughtcrime/securesms/util/DelimiterUtilTest.java diff --git a/session/src/test/java/org/thoughtcrime/securesms/util/ListPartitionTest.java b/app/src/test/java/org/thoughtcrime/securesms/util/ListPartitionTest.java similarity index 100% rename from session/src/test/java/org/thoughtcrime/securesms/util/ListPartitionTest.java rename to app/src/test/java/org/thoughtcrime/securesms/util/ListPartitionTest.java diff --git a/session/src/test/java/org/thoughtcrime/securesms/util/PhoneNumberFormatterTest.java b/app/src/test/java/org/thoughtcrime/securesms/util/PhoneNumberFormatterTest.java similarity index 100% rename from session/src/test/java/org/thoughtcrime/securesms/util/PhoneNumberFormatterTest.java rename to app/src/test/java/org/thoughtcrime/securesms/util/PhoneNumberFormatterTest.java diff --git a/session/src/test/java/org/thoughtcrime/securesms/util/Rfc5724UriTest.java b/app/src/test/java/org/thoughtcrime/securesms/util/Rfc5724UriTest.java similarity index 100% rename from session/src/test/java/org/thoughtcrime/securesms/util/Rfc5724UriTest.java rename to app/src/test/java/org/thoughtcrime/securesms/util/Rfc5724UriTest.java diff --git a/session/src/test/java/org/thoughtcrime/securesms/util/SearchUtilTest.java b/app/src/test/java/org/thoughtcrime/securesms/util/SearchUtilTest.java similarity index 100% rename from session/src/test/java/org/thoughtcrime/securesms/util/SearchUtilTest.java rename to app/src/test/java/org/thoughtcrime/securesms/util/SearchUtilTest.java diff --git a/session/src/test/java/org/thoughtcrime/securesms/util/UtilTest.java b/app/src/test/java/org/thoughtcrime/securesms/util/UtilTest.java similarity index 100% rename from session/src/test/java/org/thoughtcrime/securesms/util/UtilTest.java rename to app/src/test/java/org/thoughtcrime/securesms/util/UtilTest.java diff --git a/session/src/test/java/org/thoughtcrime/securesms/util/dynamiclanguage/LanguageStringTest.java b/app/src/test/java/org/thoughtcrime/securesms/util/dynamiclanguage/LanguageStringTest.java similarity index 100% rename from session/src/test/java/org/thoughtcrime/securesms/util/dynamiclanguage/LanguageStringTest.java rename to app/src/test/java/org/thoughtcrime/securesms/util/dynamiclanguage/LanguageStringTest.java diff --git a/session/src/test/java/org/thoughtcrime/securesms/util/dynamiclanguage/LocaleParserTest.java b/app/src/test/java/org/thoughtcrime/securesms/util/dynamiclanguage/LocaleParserTest.java similarity index 100% rename from session/src/test/java/org/thoughtcrime/securesms/util/dynamiclanguage/LocaleParserTest.java rename to app/src/test/java/org/thoughtcrime/securesms/util/dynamiclanguage/LocaleParserTest.java diff --git a/session/src/test/resources/data/data_serialized.json b/app/src/test/resources/data/data_serialized.json similarity index 100% rename from session/src/test/resources/data/data_serialized.json rename to app/src/test/resources/data/data_serialized.json diff --git a/session/website/AndroidManifest.xml b/app/website/AndroidManifest.xml similarity index 100% rename from session/website/AndroidManifest.xml rename to app/website/AndroidManifest.xml diff --git a/sessionmessaging/.gitignore b/libsession/.gitignore similarity index 100% rename from sessionmessaging/.gitignore rename to libsession/.gitignore diff --git a/libsession/build.gradle b/libsession/build.gradle new file mode 100644 index 000000000..aea50a300 --- /dev/null +++ b/libsession/build.gradle @@ -0,0 +1,44 @@ +plugins { + id 'com.android.library' + id 'kotlin-android' +} + +android { + compileSdkVersion 30 + buildToolsVersion "30.0.1" + + defaultConfig { + minSdkVersion 21 + targetSdkVersion 30 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles "consumer-rules.pro" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } +} + +dependencies { + + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion" + implementation 'androidx.core:core-ktx:1.3.2' + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'com.google.android.material:material:1.2.1' + testImplementation 'junit:junit:4.+' + androidTestImplementation 'androidx.test.ext:junit:1.1.2' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' +} \ No newline at end of file diff --git a/libsession/consumer-rules.pro b/libsession/consumer-rules.pro new file mode 100644 index 000000000..e69de29bb diff --git a/libsession/proguard-rules.pro b/libsession/proguard-rules.pro new file mode 100644 index 000000000..481bb4348 --- /dev/null +++ b/libsession/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/libsession/src/androidTest/java/org/session/libsession/ExampleInstrumentedTest.kt b/libsession/src/androidTest/java/org/session/libsession/ExampleInstrumentedTest.kt new file mode 100644 index 000000000..b24fb9b26 --- /dev/null +++ b/libsession/src/androidTest/java/org/session/libsession/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package org.session.libsession + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("org.session.libsession.test", appContext.packageName) + } +} \ No newline at end of file diff --git a/libsession/src/main/AndroidManifest.xml b/libsession/src/main/AndroidManifest.xml new file mode 100644 index 000000000..2db400737 --- /dev/null +++ b/libsession/src/main/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/sessionmessaging/src/main/java/org/session/messaging/jobs/AttachmentDownloadJob.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/AttachmentDownloadJob.kt similarity index 100% rename from sessionmessaging/src/main/java/org/session/messaging/jobs/AttachmentDownloadJob.kt rename to libsession/src/main/java/org/session/libsession/messaging/jobs/AttachmentDownloadJob.kt diff --git a/sessionmessaging/src/main/java/org/session/messaging/jobs/AttachmentUploadJob.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/AttachmentUploadJob.kt similarity index 100% rename from sessionmessaging/src/main/java/org/session/messaging/jobs/AttachmentUploadJob.kt rename to libsession/src/main/java/org/session/libsession/messaging/jobs/AttachmentUploadJob.kt diff --git a/sessionmessaging/src/main/java/org/session/messaging/jobs/Job.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/Job.kt similarity index 100% rename from sessionmessaging/src/main/java/org/session/messaging/jobs/Job.kt rename to libsession/src/main/java/org/session/libsession/messaging/jobs/Job.kt diff --git a/sessionmessaging/src/main/java/org/session/messaging/jobs/JobDelegate.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/JobDelegate.kt similarity index 100% rename from sessionmessaging/src/main/java/org/session/messaging/jobs/JobDelegate.kt rename to libsession/src/main/java/org/session/libsession/messaging/jobs/JobDelegate.kt diff --git a/sessionmessaging/src/main/java/org/session/messaging/jobs/JobQueue.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/JobQueue.kt similarity index 100% rename from sessionmessaging/src/main/java/org/session/messaging/jobs/JobQueue.kt rename to libsession/src/main/java/org/session/libsession/messaging/jobs/JobQueue.kt diff --git a/sessionmessaging/src/main/java/org/session/messaging/jobs/MessageReceiveJob.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/MessageReceiveJob.kt similarity index 100% rename from sessionmessaging/src/main/java/org/session/messaging/jobs/MessageReceiveJob.kt rename to libsession/src/main/java/org/session/libsession/messaging/jobs/MessageReceiveJob.kt diff --git a/sessionmessaging/src/main/java/org/session/messaging/jobs/MessageSendJob.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/MessageSendJob.kt similarity index 100% rename from sessionmessaging/src/main/java/org/session/messaging/jobs/MessageSendJob.kt rename to libsession/src/main/java/org/session/libsession/messaging/jobs/MessageSendJob.kt diff --git a/sessionmessaging/src/main/java/org/session/messaging/jobs/NotifyPNServerJob.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/NotifyPNServerJob.kt similarity index 100% rename from sessionmessaging/src/main/java/org/session/messaging/jobs/NotifyPNServerJob.kt rename to libsession/src/main/java/org/session/libsession/messaging/jobs/NotifyPNServerJob.kt diff --git a/sessionmessaging/src/main/java/org/session/messaging/messages/Destination.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/Destination.kt similarity index 100% rename from sessionmessaging/src/main/java/org/session/messaging/messages/Destination.kt rename to libsession/src/main/java/org/session/libsession/messaging/messages/Destination.kt diff --git a/sessionmessaging/src/main/java/org/session/messaging/messages/Message.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/Message.kt similarity index 100% rename from sessionmessaging/src/main/java/org/session/messaging/messages/Message.kt rename to libsession/src/main/java/org/session/libsession/messaging/messages/Message.kt diff --git a/sessionmessaging/src/main/java/org/session/messaging/messages/control/ClosedGroupUpdate.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/control/ClosedGroupUpdate.kt similarity index 100% rename from sessionmessaging/src/main/java/org/session/messaging/messages/control/ClosedGroupUpdate.kt rename to libsession/src/main/java/org/session/libsession/messaging/messages/control/ClosedGroupUpdate.kt diff --git a/sessionmessaging/src/main/java/org/session/messaging/messages/control/ControlMessage.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/control/ControlMessage.kt similarity index 100% rename from sessionmessaging/src/main/java/org/session/messaging/messages/control/ControlMessage.kt rename to libsession/src/main/java/org/session/libsession/messaging/messages/control/ControlMessage.kt diff --git a/sessionmessaging/src/main/java/org/session/messaging/messages/control/ExpirationTimerUpdate.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/control/ExpirationTimerUpdate.kt similarity index 100% rename from sessionmessaging/src/main/java/org/session/messaging/messages/control/ExpirationTimerUpdate.kt rename to libsession/src/main/java/org/session/libsession/messaging/messages/control/ExpirationTimerUpdate.kt diff --git a/sessionmessaging/src/main/java/org/session/messaging/messages/control/ReadReceipt.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/control/ReadReceipt.kt similarity index 100% rename from sessionmessaging/src/main/java/org/session/messaging/messages/control/ReadReceipt.kt rename to libsession/src/main/java/org/session/libsession/messaging/messages/control/ReadReceipt.kt diff --git a/sessionmessaging/src/main/java/org/session/messaging/messages/control/TypingIndicator.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/control/TypingIndicator.kt similarity index 100% rename from sessionmessaging/src/main/java/org/session/messaging/messages/control/TypingIndicator.kt rename to libsession/src/main/java/org/session/libsession/messaging/messages/control/TypingIndicator.kt diff --git a/sessionmessaging/src/main/java/org/session/messaging/messages/control/unused/NullMessage.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/control/unused/NullMessage.kt similarity index 100% rename from sessionmessaging/src/main/java/org/session/messaging/messages/control/unused/NullMessage.kt rename to libsession/src/main/java/org/session/libsession/messaging/messages/control/unused/NullMessage.kt diff --git a/sessionmessaging/src/main/java/org/session/messaging/messages/control/unused/SessionRequest.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/control/unused/SessionRequest.kt similarity index 100% rename from sessionmessaging/src/main/java/org/session/messaging/messages/control/unused/SessionRequest.kt rename to libsession/src/main/java/org/session/libsession/messaging/messages/control/unused/SessionRequest.kt diff --git a/sessionmessaging/src/main/java/org/session/messaging/messages/visible/Contact.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/visible/Contact.kt similarity index 100% rename from sessionmessaging/src/main/java/org/session/messaging/messages/visible/Contact.kt rename to libsession/src/main/java/org/session/libsession/messaging/messages/visible/Contact.kt diff --git a/sessionmessaging/src/main/java/org/session/messaging/messages/visible/LinkPreview.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/visible/LinkPreview.kt similarity index 100% rename from sessionmessaging/src/main/java/org/session/messaging/messages/visible/LinkPreview.kt rename to libsession/src/main/java/org/session/libsession/messaging/messages/visible/LinkPreview.kt diff --git a/sessionmessaging/src/main/java/org/session/messaging/messages/visible/Profile.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/visible/Profile.kt similarity index 100% rename from sessionmessaging/src/main/java/org/session/messaging/messages/visible/Profile.kt rename to libsession/src/main/java/org/session/libsession/messaging/messages/visible/Profile.kt diff --git a/sessionmessaging/src/main/java/org/session/messaging/messages/visible/Quote.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/visible/Quote.kt similarity index 100% rename from sessionmessaging/src/main/java/org/session/messaging/messages/visible/Quote.kt rename to libsession/src/main/java/org/session/libsession/messaging/messages/visible/Quote.kt diff --git a/sessionmessaging/src/main/java/org/session/messaging/messages/visible/VisibleMessage.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/visible/VisibleMessage.kt similarity index 100% rename from sessionmessaging/src/main/java/org/session/messaging/messages/visible/VisibleMessage.kt rename to libsession/src/main/java/org/session/libsession/messaging/messages/visible/VisibleMessage.kt diff --git a/sessionmessaging/src/main/java/org/session/messaging/messages/visible/attachments/Attachment.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/visible/attachments/Attachment.kt similarity index 100% rename from sessionmessaging/src/main/java/org/session/messaging/messages/visible/attachments/Attachment.kt rename to libsession/src/main/java/org/session/libsession/messaging/messages/visible/attachments/Attachment.kt diff --git a/sessionmessaging/src/main/java/org/session/messaging/sending_receiving/MessageReceiver.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageReceiver.kt similarity index 100% rename from sessionmessaging/src/main/java/org/session/messaging/sending_receiving/MessageReceiver.kt rename to libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageReceiver.kt diff --git a/sessionmessaging/src/main/java/org/session/messaging/sending_receiving/MessageReceiverDecryption.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageReceiverDecryption.kt similarity index 100% rename from sessionmessaging/src/main/java/org/session/messaging/sending_receiving/MessageReceiverDecryption.kt rename to libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageReceiverDecryption.kt diff --git a/sessionmessaging/src/main/java/org/session/messaging/sending_receiving/MessageReceiverDelegate.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageReceiverDelegate.kt similarity index 100% rename from sessionmessaging/src/main/java/org/session/messaging/sending_receiving/MessageReceiverDelegate.kt rename to libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageReceiverDelegate.kt diff --git a/sessionmessaging/src/main/java/org/session/messaging/sending_receiving/MessageSender.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSender.kt similarity index 100% rename from sessionmessaging/src/main/java/org/session/messaging/sending_receiving/MessageSender.kt rename to libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSender.kt diff --git a/sessionmessaging/src/main/java/org/session/messaging/sending_receiving/MessageSenderDelegate.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSenderDelegate.kt similarity index 100% rename from sessionmessaging/src/main/java/org/session/messaging/sending_receiving/MessageSenderDelegate.kt rename to libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSenderDelegate.kt diff --git a/sessionmessaging/src/main/java/org/session/messaging/sending_receiving/MessageSenderEncryption.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSenderEncryption.kt similarity index 100% rename from sessionmessaging/src/main/java/org/session/messaging/sending_receiving/MessageSenderEncryption.kt rename to libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSenderEncryption.kt diff --git a/sessionmessaging/src/main/java/org/session/messaging/sending_receiving/Notification.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/Notification.kt similarity index 100% rename from sessionmessaging/src/main/java/org/session/messaging/sending_receiving/Notification.kt rename to libsession/src/main/java/org/session/libsession/messaging/sending_receiving/Notification.kt diff --git a/libsession/src/test/java/org/session/libsession/ExampleUnitTest.kt b/libsession/src/test/java/org/session/libsession/ExampleUnitTest.kt new file mode 100644 index 000000000..09c29842a --- /dev/null +++ b/libsession/src/test/java/org/session/libsession/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package org.session.libsession + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/sessionprotocol/.gitignore b/libsignal/.gitignore similarity index 100% rename from sessionprotocol/.gitignore rename to libsignal/.gitignore diff --git a/libsignal/build.gradle b/libsignal/build.gradle new file mode 100644 index 000000000..a2dfc97f9 --- /dev/null +++ b/libsignal/build.gradle @@ -0,0 +1,140 @@ +apply plugin: 'com.android.library' +apply plugin: 'maven' +apply plugin: 'signing' +apply plugin: 'kotlin-android' + +archivesBaseName = "signal-service-android" +version = "1.0.0" +group = "org.session" + +repositories { + mavenLocal() + google() + jcenter() + mavenCentral() +} + +configurations.all { + resolutionStrategy.cacheChangingModulesFor 0, 'seconds' +} + +android { + compileSdkVersion androidCompileSdkVersion + buildToolsVersion androidBuildToolsVersion + + defaultConfig { + minSdkVersion androidMinSdkVersion + targetSdkVersion androidCompileSdkVersion + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + libraryVariants.all { variant -> + variant.outputs.each { output -> + def outputFile = output.outputFile + if (outputFile != null && outputFile.name.endsWith('.aar')) { + def fileName = "${archivesBaseName}-${version}.aar" + output.outputFileName = fileName + } + } + } +} + +dependencies { + + implementation "com.google.protobuf:protobuf-java:$protobufVersion" + implementation "com.googlecode.libphonenumber:libphonenumber:8.10.7" + implementation "com.fasterxml.jackson.core:jackson-databind:$jacksonDatabindVersion" + + implementation "org.whispersystems:curve25519-java:$curve25519Version" + implementation "com.squareup.okhttp3:okhttp:$okhttpVersion" + implementation "org.threeten:threetenbp:1.3.6" + + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion" + implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion" + + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9" + implementation "nl.komponents.kovenant:kovenant:$kovenantVersion" + + testImplementation "junit:junit:3.8.2" + testImplementation "org.assertj:assertj-core:1.7.1" + testImplementation "org.conscrypt:conscrypt-openjdk-uber:2.0.0" +} + +tasks.whenTaskAdded { task -> + if (task.name.equals("lint")) { + task.enabled = false + } +} + +def isReleaseBuild() { + return version.contains("SNAPSHOT") == false +} + +def getReleaseRepositoryUrl() { + return "" +} + +def getRepositoryUsername() { + return "" +} + +def getRepositoryPassword() { + return "" +} + +signing { + required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") } + sign configurations.archives +} + +uploadArchives { + configuration = configurations.archives + repositories.mavenDeployer { + beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } + + repository(url: getReleaseRepositoryUrl()) { + authentication(userName: getRepositoryUsername(), password: getRepositoryPassword()) + } + + pom.project { + name 'signal-service-android' + packaging 'aar' + description 'Signal service communication library for Android' + url 'https://github.com/loki-project/session-android-service' + + scm { + url 'scm:git@github.com:loki-project/session-android-service.git' + connection 'scm:git@github.com:loki-project/session-android-service.git' + developerConnection 'scm:git@github.com:loki-project/session-android-service.git' + } + + licenses { + license { + name 'GPLv3' + url 'https://www.gnu.org/licenses/gpl-3.0.txt' + distribution 'repo' + } + } + + developers { + developer { + name 'Niels Andriesse' + } + } + } + } +} + +task installArchives(type: Upload) { + description "Installs the artifacts to the local Maven repository." + configuration = configurations['archives'] + repositories { + mavenDeployer { + repository url: "file://${System.properties['user.home']}/.m2/repository" + } + } +} \ No newline at end of file diff --git a/libsignal/consumer-rules.pro b/libsignal/consumer-rules.pro new file mode 100644 index 000000000..e69de29bb diff --git a/libsignal/proguard-rules.pro b/libsignal/proguard-rules.pro new file mode 100644 index 000000000..481bb4348 --- /dev/null +++ b/libsignal/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/libsignal/src/androidTest/java/org/session/libsignal/ExampleInstrumentedTest.kt b/libsignal/src/androidTest/java/org/session/libsignal/ExampleInstrumentedTest.kt new file mode 100644 index 000000000..a0ce5a7f2 --- /dev/null +++ b/libsignal/src/androidTest/java/org/session/libsignal/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package org.session.libsignal + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("org.session.libsignal.test", appContext.packageName) + } +} \ No newline at end of file diff --git a/libsignal/src/main/AndroidManifest.xml b/libsignal/src/main/AndroidManifest.xml new file mode 100644 index 000000000..a49ba19ba --- /dev/null +++ b/libsignal/src/main/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/DecryptionCallback.java b/libsignal/src/main/java/org/session/libsignal/libsignal/DecryptionCallback.java new file mode 100644 index 000000000..88b107b08 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/DecryptionCallback.java @@ -0,0 +1,10 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal; + +public interface DecryptionCallback { + public void handlePlaintext(byte[] plaintext); +} \ No newline at end of file diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/DuplicateMessageException.java b/libsignal/src/main/java/org/session/libsignal/libsignal/DuplicateMessageException.java new file mode 100644 index 000000000..37273c5bc --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/DuplicateMessageException.java @@ -0,0 +1,12 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal; + +public class DuplicateMessageException extends Exception { + public DuplicateMessageException(String s) { + super(s); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/IdentityKey.java b/libsignal/src/main/java/org/session/libsignal/libsignal/IdentityKey.java new file mode 100644 index 000000000..28aa57640 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/IdentityKey.java @@ -0,0 +1,56 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal; + + +import org.session.libsignal.libsignal.InvalidKeyException; +import org.session.libsignal.libsignal.ecc.Curve; +import org.session.libsignal.libsignal.ecc.ECPublicKey; +import org.session.libsignal.libsignal.util.Hex; + +/** + * A class for representing an identity key. + * + * @author Moxie Marlinspike + */ + +public class IdentityKey { + + private final ECPublicKey publicKey; + + public IdentityKey(ECPublicKey publicKey) { + this.publicKey = publicKey; + } + + public IdentityKey(byte[] bytes, int offset) throws InvalidKeyException { + this.publicKey = Curve.decodePoint(bytes, offset); + } + + public ECPublicKey getPublicKey() { + return publicKey; + } + + public byte[] serialize() { + return publicKey.serialize(); + } + + public String getFingerprint() { + return Hex.toString(publicKey.serialize()); + } + + @Override + public boolean equals(Object other) { + if (other == null) return false; + if (!(other instanceof IdentityKey)) return false; + + return publicKey.equals(((IdentityKey) other).getPublicKey()); + } + + @Override + public int hashCode() { + return publicKey.hashCode(); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/IdentityKeyPair.java b/libsignal/src/main/java/org/session/libsignal/libsignal/IdentityKeyPair.java new file mode 100644 index 000000000..b973da211 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/IdentityKeyPair.java @@ -0,0 +1,55 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal; + +import com.google.protobuf.ByteString; +import com.google.protobuf.InvalidProtocolBufferException; + +import org.session.libsignal.libsignal.ecc.Curve; +import org.session.libsignal.libsignal.ecc.ECPrivateKey; + +import static org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructure; + +/** + * Holder for public and private identity key pair. + * + * @author Moxie Marlinspike + */ +public class IdentityKeyPair { + + private final IdentityKey publicKey; + private final ECPrivateKey privateKey; + + public IdentityKeyPair(IdentityKey publicKey, ECPrivateKey privateKey) { + this.publicKey = publicKey; + this.privateKey = privateKey; + } + + public IdentityKeyPair(byte[] serialized) throws InvalidKeyException { + try { + IdentityKeyPairStructure structure = IdentityKeyPairStructure.parseFrom(serialized); + this.publicKey = new IdentityKey(structure.getPublicKey().toByteArray(), 0); + this.privateKey = Curve.decodePrivatePoint(structure.getPrivateKey().toByteArray()); + } catch (InvalidProtocolBufferException e) { + throw new InvalidKeyException(e); + } + } + + public IdentityKey getPublicKey() { + return publicKey; + } + + public ECPrivateKey getPrivateKey() { + return privateKey; + } + + public byte[] serialize() { + return IdentityKeyPairStructure.newBuilder() + .setPublicKey(ByteString.copyFrom(publicKey.serialize())) + .setPrivateKey(ByteString.copyFrom(privateKey.serialize())) + .build().toByteArray(); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/InvalidKeyException.java b/libsignal/src/main/java/org/session/libsignal/libsignal/InvalidKeyException.java new file mode 100644 index 000000000..82ea00e42 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/InvalidKeyException.java @@ -0,0 +1,23 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal; + +public class InvalidKeyException extends Exception { + + public InvalidKeyException() {} + + public InvalidKeyException(String detailMessage) { + super(detailMessage); + } + + public InvalidKeyException(Throwable throwable) { + super(throwable); + } + + public InvalidKeyException(String detailMessage, Throwable throwable) { + super(detailMessage, throwable); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/InvalidKeyIdException.java b/libsignal/src/main/java/org/session/libsignal/libsignal/InvalidKeyIdException.java new file mode 100644 index 000000000..9d7a33a9a --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/InvalidKeyIdException.java @@ -0,0 +1,16 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal; + +public class InvalidKeyIdException extends Exception { + public InvalidKeyIdException(String detailMessage) { + super(detailMessage); + } + + public InvalidKeyIdException(Throwable throwable) { + super(throwable); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/InvalidMacException.java b/libsignal/src/main/java/org/session/libsignal/libsignal/InvalidMacException.java new file mode 100644 index 000000000..b4c2ac7ce --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/InvalidMacException.java @@ -0,0 +1,17 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal; + +public class InvalidMacException extends Exception { + + public InvalidMacException(String detailMessage) { + super(detailMessage); + } + + public InvalidMacException(Throwable throwable) { + super(throwable); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/InvalidMessageException.java b/libsignal/src/main/java/org/session/libsignal/libsignal/InvalidMessageException.java new file mode 100644 index 000000000..ee1ee6d7d --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/InvalidMessageException.java @@ -0,0 +1,29 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal; + +import java.util.List; + +public class InvalidMessageException extends Exception { + + public InvalidMessageException() {} + + public InvalidMessageException(String detailMessage) { + super(detailMessage); + } + + public InvalidMessageException(Throwable throwable) { + super(throwable); + } + + public InvalidMessageException(String detailMessage, Throwable throwable) { + super(detailMessage, throwable); + } + + public InvalidMessageException(String detailMessage, List exceptions) { + super(detailMessage, exceptions.get(0)); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/InvalidVersionException.java b/libsignal/src/main/java/org/session/libsignal/libsignal/InvalidVersionException.java new file mode 100644 index 000000000..b0ed28764 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/InvalidVersionException.java @@ -0,0 +1,12 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal; + +public class InvalidVersionException extends Exception { + public InvalidVersionException(String detailMessage) { + super(detailMessage); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/LegacyMessageException.java b/libsignal/src/main/java/org/session/libsignal/libsignal/LegacyMessageException.java new file mode 100644 index 000000000..2f1a71356 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/LegacyMessageException.java @@ -0,0 +1,12 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal; + +public class LegacyMessageException extends Exception { + public LegacyMessageException(String s) { + super(s); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/NoSessionException.java b/libsignal/src/main/java/org/session/libsignal/libsignal/NoSessionException.java new file mode 100644 index 000000000..fedb2157f --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/NoSessionException.java @@ -0,0 +1,16 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal; + +public class NoSessionException extends Exception { + public NoSessionException(String s) { + super(s); + } + + public NoSessionException(Exception nested) { + super(nested); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/SessionBuilder.java b/libsignal/src/main/java/org/session/libsignal/libsignal/SessionBuilder.java new file mode 100644 index 000000000..21cf144a0 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/SessionBuilder.java @@ -0,0 +1,212 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal; + + +import org.session.libsignal.libsignal.ecc.Curve; +import org.session.libsignal.libsignal.ecc.ECKeyPair; +import org.session.libsignal.libsignal.ecc.ECPublicKey; +import org.session.libsignal.libsignal.logging.Log; +import org.session.libsignal.libsignal.protocol.PreKeySignalMessage; +import org.session.libsignal.libsignal.protocol.SignalMessage; +import org.session.libsignal.libsignal.ratchet.AliceSignalProtocolParameters; +import org.session.libsignal.libsignal.ratchet.BobSignalProtocolParameters; +import org.session.libsignal.libsignal.ratchet.RatchetingSession; +import org.session.libsignal.libsignal.state.IdentityKeyStore; +import org.session.libsignal.libsignal.state.PreKeyBundle; +import org.session.libsignal.libsignal.state.PreKeyStore; +import org.session.libsignal.libsignal.state.SessionRecord; +import org.session.libsignal.libsignal.state.SessionStore; +import org.session.libsignal.libsignal.state.SignalProtocolStore; +import org.session.libsignal.libsignal.state.SignedPreKeyStore; +import org.session.libsignal.libsignal.util.guava.Optional; + +/** + * SessionBuilder is responsible for setting up encrypted sessions. + * Once a session has been established, {@link org.session.libsignal.libsignal.SessionCipher} + * can be used to encrypt/decrypt messages in that session. + *

+ * Sessions are built from one of three different possible vectors: + *

    + *
  1. A {@link org.session.libsignal.libsignal.state.PreKeyBundle} retrieved from a server.
  2. + *
  3. A {@link PreKeySignalMessage} received from a client.
  4. + *
+ * + * Sessions are constructed per recipientId + deviceId tuple. Remote logical users are identified + * by their recipientId, and each logical recipientId can have multiple physical devices. + * + * @author Moxie Marlinspike + */ +public class SessionBuilder { + + private static final String TAG = SessionBuilder.class.getSimpleName(); + + private final SessionStore sessionStore; + private final PreKeyStore preKeyStore; + private final SignedPreKeyStore signedPreKeyStore; + private final IdentityKeyStore identityKeyStore; + private final SignalProtocolAddress remoteAddress; + + /** + * Constructs a SessionBuilder. + * + * @param sessionStore The {@link org.session.libsignal.libsignal.state.SessionStore} to store the constructed session in. + * @param preKeyStore The {@link org.session.libsignal.libsignal.state.PreKeyStore} where the client's local {@link org.session.libsignal.libsignal.state.PreKeyRecord}s are stored. + * @param identityKeyStore The {@link org.session.libsignal.libsignal.state.IdentityKeyStore} containing the client's identity key information. + * @param remoteAddress The address of the remote user to build a session with. + */ + public SessionBuilder(SessionStore sessionStore, + PreKeyStore preKeyStore, + SignedPreKeyStore signedPreKeyStore, + IdentityKeyStore identityKeyStore, + SignalProtocolAddress remoteAddress) + { + this.sessionStore = sessionStore; + this.preKeyStore = preKeyStore; + this.signedPreKeyStore = signedPreKeyStore; + this.identityKeyStore = identityKeyStore; + this.remoteAddress = remoteAddress; + } + + /** + * Constructs a SessionBuilder + * @param store The {@link SignalProtocolStore} to store all state information in. + * @param remoteAddress The address of the remote user to build a session with. + */ + public SessionBuilder(SignalProtocolStore store, SignalProtocolAddress remoteAddress) { + this(store, store, store, store, remoteAddress); + } + + /** + * Build a new session from a received {@link PreKeySignalMessage}. + * + * After a session is constructed in this way, the embedded {@link SignalMessage} + * can be decrypted. + * + * @param message The received {@link PreKeySignalMessage}. + * @throws org.session.libsignal.libsignal.InvalidKeyIdException when there is no local + * {@link org.session.libsignal.libsignal.state.PreKeyRecord} + * that corresponds to the PreKey ID in + * the message. + * @throws org.session.libsignal.libsignal.InvalidKeyException when the message is formatted incorrectly. + * @throws org.session.libsignal.libsignal.UntrustedIdentityException when the {@link IdentityKey} of the sender is untrusted. + */ + /*package*/ Optional process(SessionRecord sessionRecord, PreKeySignalMessage message) + throws InvalidKeyIdException, InvalidKeyException, UntrustedIdentityException + { + IdentityKey theirIdentityKey = message.getIdentityKey(); + + if (!identityKeyStore.isTrustedIdentity(remoteAddress, theirIdentityKey, IdentityKeyStore.Direction.RECEIVING)) { + throw new UntrustedIdentityException(remoteAddress.getName(), theirIdentityKey); + } + + Optional unsignedPreKeyId = processV3(sessionRecord, message); + + identityKeyStore.saveIdentity(remoteAddress, theirIdentityKey); + + return unsignedPreKeyId; + } + + private Optional processV3(SessionRecord sessionRecord, PreKeySignalMessage message) + throws UntrustedIdentityException, InvalidKeyIdException, InvalidKeyException + { + + if (sessionRecord.hasSessionState(message.getMessageVersion(), message.getBaseKey().serialize())) { + Log.w(TAG, "We've already setup a session for this V3 message, letting bundled message fall through..."); + return Optional.absent(); + } + + ECKeyPair ourSignedPreKey = signedPreKeyStore.loadSignedPreKey(message.getSignedPreKeyId()).getKeyPair(); + + BobSignalProtocolParameters.Builder parameters = BobSignalProtocolParameters.newBuilder(); + + parameters.setTheirBaseKey(message.getBaseKey()) + .setTheirIdentityKey(message.getIdentityKey()) + .setOurIdentityKey(identityKeyStore.getIdentityKeyPair()) + .setOurSignedPreKey(ourSignedPreKey) + .setOurRatchetKey(ourSignedPreKey); + + if (message.getPreKeyId().isPresent()) { + parameters.setOurOneTimePreKey(Optional.of(preKeyStore.loadPreKey(message.getPreKeyId().get()).getKeyPair())); + } else { + parameters.setOurOneTimePreKey(Optional.absent()); + } + + if (!sessionRecord.isFresh()) sessionRecord.archiveCurrentState(); + + RatchetingSession.initializeSession(sessionRecord.getSessionState(), parameters.create()); + + sessionRecord.getSessionState().setLocalRegistrationId(identityKeyStore.getLocalRegistrationId()); + sessionRecord.getSessionState().setRemoteRegistrationId(message.getRegistrationId()); + sessionRecord.getSessionState().setAliceBaseKey(message.getBaseKey().serialize()); + + if (message.getPreKeyId().isPresent()) { + return message.getPreKeyId(); + } else { + return Optional.absent(); + } + } + + /** + * Build a new session from a {@link org.session.libsignal.libsignal.state.PreKeyBundle} retrieved from + * a server. + * + * @param preKey A PreKey for the destination recipient, retrieved from a server. + * @throws InvalidKeyException when the {@link org.session.libsignal.libsignal.state.PreKeyBundle} is + * badly formatted. + * @throws org.session.libsignal.libsignal.UntrustedIdentityException when the sender's + * {@link IdentityKey} is not + * trusted. + */ + public void process(PreKeyBundle preKey) throws InvalidKeyException, UntrustedIdentityException { + synchronized (SessionCipher.SESSION_LOCK) { + if (!identityKeyStore.isTrustedIdentity(remoteAddress, preKey.getIdentityKey(), IdentityKeyStore.Direction.SENDING)) { + throw new UntrustedIdentityException(remoteAddress.getName(), preKey.getIdentityKey()); + } + + if (preKey.getSignedPreKey() != null && + !Curve.verifySignature(preKey.getIdentityKey().getPublicKey(), + preKey.getSignedPreKey().serialize(), + preKey.getSignedPreKeySignature())) + { + throw new InvalidKeyException("Invalid signature on device key!"); + } + + if (preKey.getSignedPreKey() == null) { + throw new InvalidKeyException("No signed prekey!"); + } + + SessionRecord sessionRecord = sessionStore.loadSession(remoteAddress); + ECKeyPair ourBaseKey = Curve.generateKeyPair(); + ECPublicKey theirSignedPreKey = preKey.getSignedPreKey(); + Optional theirOneTimePreKey = Optional.fromNullable(preKey.getPreKey()); + Optional theirOneTimePreKeyId = theirOneTimePreKey.isPresent() ? Optional.of(preKey.getPreKeyId()) : + Optional.absent(); + + AliceSignalProtocolParameters.Builder parameters = AliceSignalProtocolParameters.newBuilder(); + + parameters.setOurBaseKey(ourBaseKey) + .setOurIdentityKey(identityKeyStore.getIdentityKeyPair()) + .setTheirIdentityKey(preKey.getIdentityKey()) + .setTheirSignedPreKey(theirSignedPreKey) + .setTheirRatchetKey(theirSignedPreKey) + .setTheirOneTimePreKey(theirOneTimePreKey); + + if (!sessionRecord.isFresh()) sessionRecord.archiveCurrentState(); + + RatchetingSession.initializeSession(sessionRecord.getSessionState(), parameters.create()); + + sessionRecord.getSessionState().setUnacknowledgedPreKeyMessage(theirOneTimePreKeyId, preKey.getSignedPreKeyId(), ourBaseKey.getPublicKey()); + sessionRecord.getSessionState().setLocalRegistrationId(identityKeyStore.getLocalRegistrationId()); + sessionRecord.getSessionState().setRemoteRegistrationId(preKey.getRegistrationId()); + sessionRecord.getSessionState().setAliceBaseKey(ourBaseKey.getPublicKey().serialize()); + + identityKeyStore.saveIdentity(remoteAddress, preKey.getIdentityKey()); + sessionStore.storeSession(remoteAddress, sessionRecord); + } + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/SessionCipher.java b/libsignal/src/main/java/org/session/libsignal/libsignal/SessionCipher.java new file mode 100644 index 000000000..8f1066a2e --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/SessionCipher.java @@ -0,0 +1,440 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal; + +import org.session.libsignal.libsignal.ecc.Curve; +import org.session.libsignal.libsignal.ecc.ECKeyPair; +import org.session.libsignal.libsignal.ecc.ECPublicKey; +import org.session.libsignal.libsignal.loki.FallbackSessionCipher; +import org.session.libsignal.libsignal.protocol.CiphertextMessage; +import org.session.libsignal.libsignal.protocol.PreKeySignalMessage; +import org.session.libsignal.libsignal.protocol.SignalMessage; +import org.session.libsignal.libsignal.ratchet.ChainKey; +import org.session.libsignal.libsignal.ratchet.MessageKeys; +import org.session.libsignal.libsignal.ratchet.RootKey; +import org.session.libsignal.libsignal.state.IdentityKeyStore; +import org.session.libsignal.libsignal.state.PreKeyStore; +import org.session.libsignal.libsignal.state.SessionRecord; +import org.session.libsignal.libsignal.state.SessionState; +import org.session.libsignal.libsignal.state.SessionStore; +import org.session.libsignal.libsignal.state.SignalProtocolStore; +import org.session.libsignal.libsignal.state.SignedPreKeyStore; +import org.session.libsignal.libsignal.util.Pair; +import org.session.libsignal.libsignal.util.guava.Optional; + +import java.security.InvalidAlgorithmParameterException; +import java.security.NoSuchAlgorithmException; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +import static org.session.libsignal.libsignal.state.SessionState.UnacknowledgedPreKeyMessageItems; + +/** + * The main entry point for Signal Protocol encrypt/decrypt operations. + * + * Once a session has been established with {@link SessionBuilder}, + * this class can be used for all encrypt/decrypt operations within + * that session. + * + * @author Moxie Marlinspike + */ +public class SessionCipher { + + public static final Object SESSION_LOCK = new Object(); + + private final SessionStore sessionStore; + private final IdentityKeyStore identityKeyStore; + private final SessionBuilder sessionBuilder; + private final PreKeyStore preKeyStore; + private final SignalProtocolAddress remoteAddress; + + /** + * Construct a SessionCipher for encrypt/decrypt operations on a session. + * In order to use SessionCipher, a session must have already been created + * and stored using {@link SessionBuilder}. + * + * @param sessionStore The {@link SessionStore} that contains a session for this recipient. + * @param remoteAddress The remote address that messages will be encrypted to or decrypted from. + */ + public SessionCipher(SessionStore sessionStore, PreKeyStore preKeyStore, + SignedPreKeyStore signedPreKeyStore, IdentityKeyStore identityKeyStore, + SignalProtocolAddress remoteAddress) + { + this.sessionStore = sessionStore; + this.preKeyStore = preKeyStore; + this.identityKeyStore = identityKeyStore; + this.remoteAddress = remoteAddress; + this.sessionBuilder = new SessionBuilder(sessionStore, preKeyStore, signedPreKeyStore, + identityKeyStore, remoteAddress); + } + + public SessionCipher(SignalProtocolStore store, SignalProtocolAddress remoteAddress) { + this(store, store, store, store, remoteAddress); + } + + /** + * Encrypt a message. + * + * @param paddedMessage The plaintext message bytes, optionally padded to a constant multiple. + * @return A ciphertext message encrypted to the recipient+device tuple. + */ + public CiphertextMessage encrypt(byte[] paddedMessage) throws UntrustedIdentityException { + synchronized (SESSION_LOCK) { + SessionRecord sessionRecord = sessionStore.loadSession(remoteAddress); + SessionState sessionState = sessionRecord.getSessionState(); + ChainKey chainKey = sessionState.getSenderChainKey(); + MessageKeys messageKeys = chainKey.getMessageKeys(); + ECPublicKey senderEphemeral = sessionState.getSenderRatchetKey(); + int previousCounter = sessionState.getPreviousCounter(); + int sessionVersion = sessionState.getSessionVersion(); + + byte[] ciphertextBody = getCiphertext(messageKeys, paddedMessage); + CiphertextMessage ciphertextMessage = new SignalMessage(sessionVersion, messageKeys.getMacKey(), + senderEphemeral, chainKey.getIndex(), + previousCounter, ciphertextBody, + sessionState.getLocalIdentityKey(), + sessionState.getRemoteIdentityKey()); + + if (sessionState.hasUnacknowledgedPreKeyMessage()) { + UnacknowledgedPreKeyMessageItems items = sessionState.getUnacknowledgedPreKeyMessageItems(); + int localRegistrationId = sessionState.getLocalRegistrationId(); + + ciphertextMessage = new PreKeySignalMessage(sessionVersion, localRegistrationId, items.getPreKeyId(), + items.getSignedPreKeyId(), items.getBaseKey(), + sessionState.getLocalIdentityKey(), + (SignalMessage) ciphertextMessage); + } + + sessionState.setSenderChainKey(chainKey.getNextChainKey()); + + if (!identityKeyStore.isTrustedIdentity(remoteAddress, sessionState.getRemoteIdentityKey(), IdentityKeyStore.Direction.SENDING)) { + throw new UntrustedIdentityException(remoteAddress.getName(), sessionState.getRemoteIdentityKey()); + } + + identityKeyStore.saveIdentity(remoteAddress, sessionState.getRemoteIdentityKey()); + sessionStore.storeSession(remoteAddress, sessionRecord); + return ciphertextMessage; + } + } + + /** + * Decrypt a message. + * + * @param ciphertext The {@link PreKeySignalMessage} to decrypt. + * + * @return The plaintext. + * @throws InvalidMessageException if the input is not valid ciphertext. + * @throws DuplicateMessageException if the input is a message that has already been received. + * @throws LegacyMessageException if the input is a message formatted by a protocol version that + * is no longer supported. + * @throws InvalidKeyIdException when there is no local {@link org.session.libsignal.libsignal.state.PreKeyRecord} + * that corresponds to the PreKey ID in the message. + * @throws InvalidKeyException when the message is formatted incorrectly. + * @throws UntrustedIdentityException when the {@link IdentityKey} of the sender is untrusted. + */ + public byte[] decrypt(PreKeySignalMessage ciphertext) + throws DuplicateMessageException, LegacyMessageException, InvalidMessageException, + InvalidKeyIdException, InvalidKeyException, UntrustedIdentityException + { + return decrypt(ciphertext, new NullDecryptionCallback()); + } + + /** + * Decrypt a message. + * + * @param ciphertext The {@link PreKeySignalMessage} to decrypt. + * @param callback A callback that is triggered after decryption is complete, + * but before the updated session state has been committed to the session + * DB. This allows some implementations to store the committed plaintext + * to a DB first, in case they are concerned with a crash happening between + * the time the session state is updated but before they're able to store + * the plaintext to disk. + * + * @return The plaintext. + * @throws InvalidMessageException if the input is not valid ciphertext. + * @throws DuplicateMessageException if the input is a message that has already been received. + * @throws LegacyMessageException if the input is a message formatted by a protocol version that + * is no longer supported. + * @throws InvalidKeyIdException when there is no local {@link org.session.libsignal.libsignal.state.PreKeyRecord} + * that corresponds to the PreKey ID in the message. + * @throws InvalidKeyException when the message is formatted incorrectly. + * @throws UntrustedIdentityException when the {@link IdentityKey} of the sender is untrusted. + */ + public byte[] decrypt(PreKeySignalMessage ciphertext, DecryptionCallback callback) + throws DuplicateMessageException, LegacyMessageException, InvalidMessageException, + InvalidKeyIdException, InvalidKeyException, UntrustedIdentityException + { + synchronized (SESSION_LOCK) { + SessionRecord sessionRecord = sessionStore.loadSession(remoteAddress); + Optional unsignedPreKeyId = sessionBuilder.process(sessionRecord, ciphertext); + byte[] plaintext = decrypt(sessionRecord, ciphertext.getWhisperMessage()); + + callback.handlePlaintext(plaintext); + + sessionStore.storeSession(remoteAddress, sessionRecord); + + if (unsignedPreKeyId.isPresent()) { + preKeyStore.removePreKey(unsignedPreKeyId.get()); + } + + return plaintext; + } + } + + /** + * Decrypt a message. + * + * @param ciphertext The {@link SignalMessage} to decrypt. + * + * @return The plaintext. + * @throws InvalidMessageException if the input is not valid ciphertext. + * @throws DuplicateMessageException if the input is a message that has already been received. + * @throws LegacyMessageException if the input is a message formatted by a protocol version that + * is no longer supported. + * @throws NoSessionException if there is no established session for this contact. + */ + public byte[] decrypt(SignalMessage ciphertext) + throws InvalidMessageException, DuplicateMessageException, LegacyMessageException, + NoSessionException, UntrustedIdentityException + { + return decrypt(ciphertext, new NullDecryptionCallback()); + } + + /** + * Decrypt a message. + * + * @param ciphertext The {@link SignalMessage} to decrypt. + * @param callback A callback that is triggered after decryption is complete, + * but before the updated session state has been committed to the session + * DB. This allows some implementations to store the committed plaintext + * to a DB first, in case they are concerned with a crash happening between + * the time the session state is updated but before they're able to store + * the plaintext to disk. + * + * @return The plaintext. + * @throws InvalidMessageException if the input is not valid ciphertext. + * @throws DuplicateMessageException if the input is a message that has already been received. + * @throws LegacyMessageException if the input is a message formatted by a protocol version that + * is no longer supported. + * @throws NoSessionException if there is no established session for this contact. + */ + public byte[] decrypt(SignalMessage ciphertext, DecryptionCallback callback) + throws InvalidMessageException, DuplicateMessageException, LegacyMessageException, + NoSessionException, UntrustedIdentityException + { + synchronized (SESSION_LOCK) { + + if (!sessionStore.containsSession(remoteAddress)) { + throw new NoSessionException("No session for: " + remoteAddress); + } + + SessionRecord sessionRecord = sessionStore.loadSession(remoteAddress); + byte[] plaintext = decrypt(sessionRecord, ciphertext); + + if (!identityKeyStore.isTrustedIdentity(remoteAddress, sessionRecord.getSessionState().getRemoteIdentityKey(), IdentityKeyStore.Direction.RECEIVING)) { + throw new UntrustedIdentityException(remoteAddress.getName(), sessionRecord.getSessionState().getRemoteIdentityKey()); + } + + identityKeyStore.saveIdentity(remoteAddress, sessionRecord.getSessionState().getRemoteIdentityKey()); + + callback.handlePlaintext(plaintext); + + sessionStore.storeSession(remoteAddress, sessionRecord); + + return plaintext; + } + } + + private byte[] decrypt(SessionRecord sessionRecord, SignalMessage ciphertext) + throws DuplicateMessageException, LegacyMessageException, InvalidMessageException + { + synchronized (SESSION_LOCK) { + Iterator previousStates = sessionRecord.getPreviousSessionStates().iterator(); + List exceptions = new LinkedList(); + + try { + SessionState sessionState = new SessionState(sessionRecord.getSessionState()); + byte[] plaintext = decrypt(sessionState, ciphertext); + + sessionRecord.setState(sessionState); + return plaintext; + } catch (InvalidMessageException e) { + exceptions.add(e); + } + + while (previousStates.hasNext()) { + try { + SessionState promotedState = new SessionState(previousStates.next()); + byte[] plaintext = decrypt(promotedState, ciphertext); + + previousStates.remove(); + sessionRecord.promoteState(promotedState); + + return plaintext; + } catch (InvalidMessageException e) { + exceptions.add(e); + } + } + + throw new InvalidMessageException("No valid sessions.", exceptions); + } + } + + private byte[] decrypt(SessionState sessionState, SignalMessage ciphertextMessage) + throws InvalidMessageException, DuplicateMessageException, LegacyMessageException + { + if (!sessionState.hasSenderChain()) { + throw new InvalidMessageException("Uninitialized session!"); + } + + if (ciphertextMessage.getMessageVersion() != sessionState.getSessionVersion()) { + throw new InvalidMessageException(String.format("Message version %d, but session version %d", + ciphertextMessage.getMessageVersion(), + sessionState.getSessionVersion())); + } + + ECPublicKey theirEphemeral = ciphertextMessage.getSenderRatchetKey(); + int counter = ciphertextMessage.getCounter(); + ChainKey chainKey = getOrCreateChainKey(sessionState, theirEphemeral); + MessageKeys messageKeys = getOrCreateMessageKeys(sessionState, theirEphemeral, + chainKey, counter); + + ciphertextMessage.verifyMac(sessionState.getRemoteIdentityKey(), + sessionState.getLocalIdentityKey(), + messageKeys.getMacKey()); + + byte[] plaintext = getPlaintext(messageKeys, ciphertextMessage.getBody()); + + sessionState.clearUnacknowledgedPreKeyMessage(); + + return plaintext; + } + + public int getRemoteRegistrationId() { + synchronized (SESSION_LOCK) { + SessionRecord record = sessionStore.loadSession(remoteAddress); + return record.getSessionState().getRemoteRegistrationId(); + } + } + + public int getSessionVersion() { + synchronized (SESSION_LOCK) { + if (!sessionStore.containsSession(remoteAddress)) { + // Loki - If we have no session then we must be using the FallbackSessionCipher + return FallbackSessionCipher.getSessionVersion(); + } + + SessionRecord record = sessionStore.loadSession(remoteAddress); + return record.getSessionState().getSessionVersion(); + } + } + + private ChainKey getOrCreateChainKey(SessionState sessionState, ECPublicKey theirEphemeral) + throws InvalidMessageException + { + try { + if (sessionState.hasReceiverChain(theirEphemeral)) { + return sessionState.getReceiverChainKey(theirEphemeral); + } else { + RootKey rootKey = sessionState.getRootKey(); + ECKeyPair ourEphemeral = sessionState.getSenderRatchetKeyPair(); + Pair receiverChain = rootKey.createChain(theirEphemeral, ourEphemeral); + ECKeyPair ourNewEphemeral = Curve.generateKeyPair(); + Pair senderChain = receiverChain.first().createChain(theirEphemeral, ourNewEphemeral); + + sessionState.setRootKey(senderChain.first()); + sessionState.addReceiverChain(theirEphemeral, receiverChain.second()); + sessionState.setPreviousCounter(Math.max(sessionState.getSenderChainKey().getIndex()-1, 0)); + sessionState.setSenderChain(ourNewEphemeral, senderChain.second()); + + return receiverChain.second(); + } + } catch (InvalidKeyException e) { + throw new InvalidMessageException(e); + } + } + + private MessageKeys getOrCreateMessageKeys(SessionState sessionState, + ECPublicKey theirEphemeral, + ChainKey chainKey, int counter) + throws InvalidMessageException, DuplicateMessageException + { + if (chainKey.getIndex() > counter) { + if (sessionState.hasMessageKeys(theirEphemeral, counter)) { + return sessionState.removeMessageKeys(theirEphemeral, counter); + } else { + throw new DuplicateMessageException("Received message with old counter: " + + chainKey.getIndex() + " , " + counter); + } + } + + if (counter - chainKey.getIndex() > 2000) { + throw new InvalidMessageException("Over 2000 messages into the future!"); + } + + while (chainKey.getIndex() < counter) { + MessageKeys messageKeys = chainKey.getMessageKeys(); + sessionState.setMessageKeys(theirEphemeral, messageKeys); + chainKey = chainKey.getNextChainKey(); + } + + sessionState.setReceiverChainKey(theirEphemeral, chainKey.getNextChainKey()); + return chainKey.getMessageKeys(); + } + + private byte[] getCiphertext(MessageKeys messageKeys, byte[] plaintext) { + try { + Cipher cipher = getCipher(Cipher.ENCRYPT_MODE, messageKeys.getCipherKey(), messageKeys.getIv()); + return cipher.doFinal(plaintext); + } catch (IllegalBlockSizeException e) { + throw new AssertionError(e); + } catch (BadPaddingException e) { + throw new AssertionError(e); + } + } + + private byte[] getPlaintext(MessageKeys messageKeys, byte[] cipherText) + throws InvalidMessageException + { + try { + Cipher cipher = getCipher(Cipher.DECRYPT_MODE, messageKeys.getCipherKey(), messageKeys.getIv()); + return cipher.doFinal(cipherText); + } catch (IllegalBlockSizeException e) { + throw new InvalidMessageException(e); + } catch (BadPaddingException e) { + throw new InvalidMessageException(e); + } + } + + private Cipher getCipher(int mode, SecretKeySpec key, IvParameterSpec iv) { + try { + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(mode, key, iv); + return cipher; + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (NoSuchPaddingException e) { + throw new AssertionError(e); + } catch (java.security.InvalidKeyException e) { + throw new AssertionError(e); + } catch (InvalidAlgorithmParameterException e) { + throw new AssertionError(e); + } + } + + private static class NullDecryptionCallback implements DecryptionCallback { + @Override + public void handlePlaintext(byte[] plaintext) {} + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/SignalProtocolAddress.java b/libsignal/src/main/java/org/session/libsignal/libsignal/SignalProtocolAddress.java new file mode 100644 index 000000000..7e329d68b --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/SignalProtocolAddress.java @@ -0,0 +1,44 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal; + +public class SignalProtocolAddress { + + private final String name; + private final int deviceId; + + public SignalProtocolAddress(String name, int deviceId) { + this.name = name; + this.deviceId = deviceId; + } + + public String getName() { + return name; + } + + public int getDeviceId() { + return deviceId; + } + + @Override + public String toString() { + return name + ":" + deviceId; + } + + @Override + public boolean equals(Object other) { + if (other == null) return false; + if (!(other instanceof SignalProtocolAddress)) return false; + + SignalProtocolAddress that = (SignalProtocolAddress)other; + return this.name.equals(that.name) && this.deviceId == that.deviceId; + } + + @Override + public int hashCode() { + return this.name.hashCode() ^ this.deviceId; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/StaleKeyExchangeException.java b/libsignal/src/main/java/org/session/libsignal/libsignal/StaleKeyExchangeException.java new file mode 100644 index 000000000..54d832e00 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/StaleKeyExchangeException.java @@ -0,0 +1,9 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal; + +public class StaleKeyExchangeException extends Throwable { +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/UntrustedIdentityException.java b/libsignal/src/main/java/org/session/libsignal/libsignal/UntrustedIdentityException.java new file mode 100644 index 000000000..56ee6c895 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/UntrustedIdentityException.java @@ -0,0 +1,25 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal; + +public class UntrustedIdentityException extends Exception { + + private final String name; + private final IdentityKey key; + + public UntrustedIdentityException(String name, IdentityKey key) { + this.name = name; + this.key = key; + } + + public IdentityKey getUntrustedIdentity() { + return key; + } + + public String getName() { + return name; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/devices/DeviceConsistencyCodeGenerator.java b/libsignal/src/main/java/org/session/libsignal/libsignal/devices/DeviceConsistencyCodeGenerator.java new file mode 100644 index 000000000..1132f74a9 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/devices/DeviceConsistencyCodeGenerator.java @@ -0,0 +1,54 @@ +package org.session.libsignal.libsignal.devices; + +import org.session.libsignal.libsignal.util.ByteArrayComparator; +import org.session.libsignal.libsignal.util.ByteUtil; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +public class DeviceConsistencyCodeGenerator { + + private static final int CODE_VERSION = 0; + + public static String generateFor(DeviceConsistencyCommitment commitment, + List signatures) + { + try { + ArrayList sortedSignatures = new ArrayList(signatures); + Collections.sort(sortedSignatures, new SignatureComparator()); + + MessageDigest messageDigest = MessageDigest.getInstance("SHA-512"); + messageDigest.update(ByteUtil.shortToByteArray(CODE_VERSION)); + messageDigest.update(commitment.toByteArray()); + + for (DeviceConsistencySignature signature : sortedSignatures) { + messageDigest.update(signature.getVrfOutput()); + } + + byte[] hash = messageDigest.digest(); + + String digits = getEncodedChunk(hash, 0) + getEncodedChunk(hash, 5); + return digits.substring(0, 6); + + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } + } + + private static String getEncodedChunk(byte[] hash, int offset) { + long chunk = ByteUtil.byteArray5ToLong(hash, offset) % 100000; + return String.format("%05d", chunk); + } + + + private static class SignatureComparator extends ByteArrayComparator implements Comparator { + @Override + public int compare(DeviceConsistencySignature first, DeviceConsistencySignature second) { + return compare(first.getVrfOutput(), second.getVrfOutput()); + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/devices/DeviceConsistencyCommitment.java b/libsignal/src/main/java/org/session/libsignal/libsignal/devices/DeviceConsistencyCommitment.java new file mode 100644 index 000000000..5fbf7b563 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/devices/DeviceConsistencyCommitment.java @@ -0,0 +1,49 @@ +package org.session.libsignal.libsignal.devices; + +import org.session.libsignal.libsignal.IdentityKey; +import org.session.libsignal.libsignal.util.ByteUtil; +import org.session.libsignal.libsignal.util.IdentityKeyComparator; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class DeviceConsistencyCommitment { + + private static final String VERSION = "DeviceConsistencyCommitment_V0"; + + private final int generation; + private final byte[] serialized; + + public DeviceConsistencyCommitment(int generation, List identityKeys) { + try { + ArrayList sortedIdentityKeys = new ArrayList(identityKeys); + Collections.sort(sortedIdentityKeys, new IdentityKeyComparator()); + + MessageDigest messageDigest = MessageDigest.getInstance("SHA-512"); + messageDigest.update(VERSION.getBytes()); + messageDigest.update(ByteUtil.intToByteArray(generation)); + + for (IdentityKey commitment : sortedIdentityKeys) { + messageDigest.update(commitment.getPublicKey().serialize()); + } + + this.generation = generation; + this.serialized = messageDigest.digest(); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } + } + + public byte[] toByteArray() { + return serialized; + } + + public int getGeneration() { + return generation; + } + + +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/devices/DeviceConsistencySignature.java b/libsignal/src/main/java/org/session/libsignal/libsignal/devices/DeviceConsistencySignature.java new file mode 100644 index 000000000..de029ba86 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/devices/DeviceConsistencySignature.java @@ -0,0 +1,21 @@ +package org.session.libsignal.libsignal.devices; + +public class DeviceConsistencySignature { + + private final byte[] signature; + private final byte[] vrfOutput; + + public DeviceConsistencySignature(byte[] signature, byte[] vrfOutput) { + this.signature = signature; + this.vrfOutput = vrfOutput; + } + + public byte[] getVrfOutput() { + return vrfOutput; + } + + public byte[] getSignature() { + return signature; + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/ecc/Curve.java b/libsignal/src/main/java/org/session/libsignal/libsignal/ecc/Curve.java new file mode 100644 index 000000000..2ba2b70d8 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/ecc/Curve.java @@ -0,0 +1,144 @@ +/** + * Copyright (C) 2013-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.ecc; + +import org.whispersystems.curve25519.Curve25519; +import org.whispersystems.curve25519.Curve25519KeyPair; +import org.whispersystems.curve25519.VrfSignatureVerificationFailedException; +import org.session.libsignal.libsignal.InvalidKeyException; +import org.session.libsignal.libsignal.ecc.DjbECPrivateKey; +import org.session.libsignal.libsignal.ecc.DjbECPublicKey; +import org.session.libsignal.libsignal.ecc.ECKeyPair; +import org.session.libsignal.libsignal.ecc.ECPrivateKey; +import org.session.libsignal.libsignal.ecc.ECPublicKey; + +import static org.whispersystems.curve25519.Curve25519.BEST; + +public class Curve { + + public static final int DJB_TYPE = 0x05; + + public static boolean isNative() { + return Curve25519.getInstance(BEST).isNative(); + } + + public static ECKeyPair generateKeyPair() { + Curve25519KeyPair keyPair = Curve25519.getInstance(BEST).generateKeyPair(); + return new ECKeyPair(new DjbECPublicKey(keyPair.getPublicKey()), new DjbECPrivateKey(keyPair.getPrivateKey())); + } + + public static ECPublicKey decodePoint(byte[] bytes, int offset) + throws InvalidKeyException + { + if (bytes == null || bytes.length - offset < 1) { + throw new InvalidKeyException("No key type identifier"); + } + + int type = bytes[offset] & 0xFF; + + switch (type) { + case Curve.DJB_TYPE: + if (bytes.length - offset < 33) { + throw new InvalidKeyException("Bad key length: " + bytes.length); + } + + byte[] keyBytes = new byte[32]; + System.arraycopy(bytes, offset+1, keyBytes, 0, keyBytes.length); + return new DjbECPublicKey(keyBytes); + default: + throw new InvalidKeyException("Bad key type: " + type); + } + } + + public static ECPrivateKey decodePrivatePoint(byte[] bytes) { + return new DjbECPrivateKey(bytes); + } + + public static byte[] calculateAgreement(ECPublicKey publicKey, ECPrivateKey privateKey) + throws InvalidKeyException + { + if (publicKey == null) { + throw new InvalidKeyException("public value is null"); + } + + if (privateKey == null) { + throw new InvalidKeyException("private value is null"); + } + + if (publicKey.getType() != privateKey.getType()) { + throw new InvalidKeyException("Public and private keys must be of the same type!"); + } + + if (publicKey.getType() == DJB_TYPE) { + return Curve25519.getInstance(BEST) + .calculateAgreement(((DjbECPublicKey) publicKey).getPublicKey(), + ((DjbECPrivateKey) privateKey).getPrivateKey()); + } else { + throw new InvalidKeyException("Unknown type: " + publicKey.getType()); + } + } + + public static boolean verifySignature(ECPublicKey signingKey, byte[] message, byte[] signature) + throws InvalidKeyException + { + if (signingKey == null || message == null || signature == null) { + throw new InvalidKeyException("Values must not be null"); + } + + if (signingKey.getType() == DJB_TYPE) { + return Curve25519.getInstance(BEST) + .verifySignature(((DjbECPublicKey) signingKey).getPublicKey(), message, signature); + } else { + throw new InvalidKeyException("Unknown type: " + signingKey.getType()); + } + } + + public static byte[] calculateSignature(ECPrivateKey signingKey, byte[] message) + throws InvalidKeyException + { + if (signingKey == null || message == null) { + throw new InvalidKeyException("Values must not be null"); + } + + if (signingKey.getType() == DJB_TYPE) { + return Curve25519.getInstance(BEST) + .calculateSignature(((DjbECPrivateKey) signingKey).getPrivateKey(), message); + } else { + throw new InvalidKeyException("Unknown type: " + signingKey.getType()); + } + } + + public static byte[] calculateVrfSignature(ECPrivateKey signingKey, byte[] message) + throws InvalidKeyException + { + if (signingKey == null || message == null) { + throw new InvalidKeyException("Values must not be null"); + } + + if (signingKey.getType() == DJB_TYPE) { + return Curve25519.getInstance(BEST) + .calculateVrfSignature(((DjbECPrivateKey)signingKey).getPrivateKey(), message); + } else { + throw new InvalidKeyException("Unknown type: " + signingKey.getType()); + } + } + + public static byte[] verifyVrfSignature(ECPublicKey signingKey, byte[] message, byte[] signature) + throws InvalidKeyException, VrfSignatureVerificationFailedException + { + if (signingKey == null || message == null || signature == null) { + throw new InvalidKeyException("Values must not be null"); + } + + if (signingKey.getType() == DJB_TYPE) { + return Curve25519.getInstance(BEST) + .verifyVrfSignature(((DjbECPublicKey) signingKey).getPublicKey(), message, signature); + } else { + throw new InvalidKeyException("Unknown type: " + signingKey.getType()); + } + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/ecc/DjbECPrivateKey.java b/libsignal/src/main/java/org/session/libsignal/libsignal/ecc/DjbECPrivateKey.java new file mode 100644 index 000000000..377de7625 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/ecc/DjbECPrivateKey.java @@ -0,0 +1,30 @@ +/** + * Copyright (C) 2013-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.libsignal.ecc; + +public class DjbECPrivateKey implements ECPrivateKey { + + private final byte[] privateKey; + + public DjbECPrivateKey(byte[] privateKey) { + this.privateKey = privateKey; + } + + @Override + public byte[] serialize() { + return privateKey; + } + + @Override + public int getType() { + return Curve.DJB_TYPE; + } + + public byte[] getPrivateKey() { + return privateKey; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/ecc/DjbECPublicKey.java b/libsignal/src/main/java/org/session/libsignal/libsignal/ecc/DjbECPublicKey.java new file mode 100644 index 000000000..b6c2d3e40 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/ecc/DjbECPublicKey.java @@ -0,0 +1,55 @@ +/** + * Copyright (C) 2013-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.libsignal.ecc; + +import org.session.libsignal.libsignal.util.ByteUtil; + +import java.math.BigInteger; +import java.util.Arrays; + +public class DjbECPublicKey implements ECPublicKey { + + private final byte[] publicKey; + + public DjbECPublicKey(byte[] publicKey) { + this.publicKey = publicKey; + } + + @Override + public byte[] serialize() { + byte[] type = {Curve.DJB_TYPE}; + return ByteUtil.combine(type, publicKey); + } + + @Override + public int getType() { + return Curve.DJB_TYPE; + } + + @Override + public boolean equals(Object other) { + if (other == null) return false; + if (!(other instanceof DjbECPublicKey)) return false; + + DjbECPublicKey that = (DjbECPublicKey)other; + return Arrays.equals(this.publicKey, that.publicKey); + } + + @Override + public int hashCode() { + return Arrays.hashCode(publicKey); + } + + @Override + public int compareTo(ECPublicKey another) { + return new BigInteger(publicKey).compareTo(new BigInteger(((DjbECPublicKey)another).publicKey)); + } + + public byte[] getPublicKey() { + return publicKey; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/ecc/ECKeyPair.java b/libsignal/src/main/java/org/session/libsignal/libsignal/ecc/ECKeyPair.java new file mode 100644 index 000000000..afe5c39f7 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/ecc/ECKeyPair.java @@ -0,0 +1,28 @@ +/** + * Copyright (C) 2013-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.ecc; + +import org.session.libsignal.libsignal.ecc.ECPrivateKey; +import org.session.libsignal.libsignal.ecc.ECPublicKey; + +public class ECKeyPair { + + private final ECPublicKey publicKey; + private final ECPrivateKey privateKey; + + public ECKeyPair(ECPublicKey publicKey, ECPrivateKey privateKey) { + this.publicKey = publicKey; + this.privateKey = privateKey; + } + + public ECPublicKey getPublicKey() { + return publicKey; + } + + public ECPrivateKey getPrivateKey() { + return privateKey; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/ecc/ECPrivateKey.java b/libsignal/src/main/java/org/session/libsignal/libsignal/ecc/ECPrivateKey.java new file mode 100644 index 000000000..b7398ee1b --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/ecc/ECPrivateKey.java @@ -0,0 +1,12 @@ +/** + * Copyright (C) 2013-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.libsignal.ecc; + +public interface ECPrivateKey { + public byte[] serialize(); + public int getType(); +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/ecc/ECPublicKey.java b/libsignal/src/main/java/org/session/libsignal/libsignal/ecc/ECPublicKey.java new file mode 100644 index 000000000..c4cbca439 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/ecc/ECPublicKey.java @@ -0,0 +1,16 @@ +/** + * Copyright (C) 2013-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.libsignal.ecc; + +public interface ECPublicKey extends Comparable { + + public static final int KEY_SIZE = 33; + + public byte[] serialize(); + + public int getType(); +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/fingerprint/DisplayableFingerprint.java b/libsignal/src/main/java/org/session/libsignal/libsignal/fingerprint/DisplayableFingerprint.java new file mode 100644 index 000000000..2cbbfef68 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/fingerprint/DisplayableFingerprint.java @@ -0,0 +1,43 @@ +/** + * Copyright (C) 2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.fingerprint; + +import org.session.libsignal.libsignal.util.ByteUtil; + +public class DisplayableFingerprint { + + private final String localFingerprintNumbers; + private final String remoteFingerprintNumbers; + + DisplayableFingerprint(byte[] localFingerprint, byte[] remoteFingerprint) + { + this.localFingerprintNumbers = getDisplayStringFor(localFingerprint); + this.remoteFingerprintNumbers = getDisplayStringFor(remoteFingerprint); + } + + public String getDisplayText() { + if (localFingerprintNumbers.compareTo(remoteFingerprintNumbers) <= 0) { + return localFingerprintNumbers + remoteFingerprintNumbers; + } else { + return remoteFingerprintNumbers + localFingerprintNumbers; + } + } + + private String getDisplayStringFor(byte[] fingerprint) { + return getEncodedChunk(fingerprint, 0) + + getEncodedChunk(fingerprint, 5) + + getEncodedChunk(fingerprint, 10) + + getEncodedChunk(fingerprint, 15) + + getEncodedChunk(fingerprint, 20) + + getEncodedChunk(fingerprint, 25); + } + + private String getEncodedChunk(byte[] hash, int offset) { + long chunk = ByteUtil.byteArray5ToLong(hash, offset) % 100000; + return String.format("%05d", chunk); + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/fingerprint/Fingerprint.java b/libsignal/src/main/java/org/session/libsignal/libsignal/fingerprint/Fingerprint.java new file mode 100644 index 000000000..08a63f792 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/fingerprint/Fingerprint.java @@ -0,0 +1,36 @@ +/** + * Copyright (C) 2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.fingerprint; + +import org.session.libsignal.libsignal.fingerprint.DisplayableFingerprint; +import org.session.libsignal.libsignal.fingerprint.ScannableFingerprint; + +public class Fingerprint { + + private final DisplayableFingerprint displayableFingerprint; + private final ScannableFingerprint scannableFingerprint; + + public Fingerprint(DisplayableFingerprint displayableFingerprint, + ScannableFingerprint scannableFingerprint) + { + this.displayableFingerprint = displayableFingerprint; + this.scannableFingerprint = scannableFingerprint; + } + + /** + * @return A text fingerprint that can be displayed and compared remotely. + */ + public DisplayableFingerprint getDisplayableFingerprint() { + return displayableFingerprint; + } + + /** + * @return A scannable fingerprint that can be scanned anc compared locally. + */ + public ScannableFingerprint getScannableFingerprint() { + return scannableFingerprint; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/fingerprint/FingerprintGenerator.java b/libsignal/src/main/java/org/session/libsignal/libsignal/fingerprint/FingerprintGenerator.java new file mode 100644 index 000000000..a9bda64c9 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/fingerprint/FingerprintGenerator.java @@ -0,0 +1,18 @@ +/** + * Copyright (C) 2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.fingerprint; + +import org.session.libsignal.libsignal.IdentityKey; + +import java.util.List; + +public interface FingerprintGenerator { + public Fingerprint createFor(String localStableIdentifier, IdentityKey localIdentityKey, + String remoteStableIdentifier, IdentityKey remoteIdentityKey); + + public Fingerprint createFor(String localStableIdentifier, List localIdentityKey, + String remoteStableIdentifier, List remoteIdentityKey); +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/fingerprint/FingerprintIdentifierMismatchException.java b/libsignal/src/main/java/org/session/libsignal/libsignal/fingerprint/FingerprintIdentifierMismatchException.java new file mode 100644 index 000000000..ee350b6b5 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/fingerprint/FingerprintIdentifierMismatchException.java @@ -0,0 +1,39 @@ +/** + * Copyright (C) 2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.fingerprint; + +public class FingerprintIdentifierMismatchException extends Exception { + + private final String localIdentifier; + private final String remoteIdentifier; + private final String scannedLocalIdentifier; + private final String scannedRemoteIdentifier; + + public FingerprintIdentifierMismatchException(String localIdentifier, String remoteIdentifier, + String scannedLocalIdentifier, String scannedRemoteIdentifier) + { + this.localIdentifier = localIdentifier; + this.remoteIdentifier = remoteIdentifier; + this.scannedLocalIdentifier = scannedLocalIdentifier; + this.scannedRemoteIdentifier = scannedRemoteIdentifier; + } + + public String getScannedRemoteIdentifier() { + return scannedRemoteIdentifier; + } + + public String getScannedLocalIdentifier() { + return scannedLocalIdentifier; + } + + public String getRemoteIdentifier() { + return remoteIdentifier; + } + + public String getLocalIdentifier() { + return localIdentifier; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/fingerprint/FingerprintParsingException.java b/libsignal/src/main/java/org/session/libsignal/libsignal/fingerprint/FingerprintParsingException.java new file mode 100644 index 000000000..fcd2432ee --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/fingerprint/FingerprintParsingException.java @@ -0,0 +1,14 @@ +/** + * Copyright (C) 2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.fingerprint; + +public class FingerprintParsingException extends Exception { + + public FingerprintParsingException(Exception nested) { + super(nested); + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/fingerprint/FingerprintProtos.java b/libsignal/src/main/java/org/session/libsignal/libsignal/fingerprint/FingerprintProtos.java new file mode 100644 index 000000000..87f49738e --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/fingerprint/FingerprintProtos.java @@ -0,0 +1,1277 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: FingerprintProtocol.proto + +package org.session.libsignal.libsignal.fingerprint; + +public final class FingerprintProtos { + private FingerprintProtos() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + } + public interface LogicalFingerprintOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional bytes content = 1; + /** + * optional bytes content = 1; + * + *
+     *  optional bytes identifier = 2;
+     * 
+ */ + boolean hasContent(); + /** + * optional bytes content = 1; + * + *
+     *  optional bytes identifier = 2;
+     * 
+ */ + com.google.protobuf.ByteString getContent(); + } + /** + * Protobuf type {@code textsecure.LogicalFingerprint} + */ + public static final class LogicalFingerprint extends + com.google.protobuf.GeneratedMessage + implements LogicalFingerprintOrBuilder { + // Use LogicalFingerprint.newBuilder() to construct. + private LogicalFingerprint(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private LogicalFingerprint(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final LogicalFingerprint defaultInstance; + public static LogicalFingerprint getDefaultInstance() { + return defaultInstance; + } + + public LogicalFingerprint getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private LogicalFingerprint( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + content_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.fingerprint.FingerprintProtos.internal_static_textsecure_LogicalFingerprint_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.fingerprint.FingerprintProtos.internal_static_textsecure_LogicalFingerprint_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.class, org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public LogicalFingerprint parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new LogicalFingerprint(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional bytes content = 1; + public static final int CONTENT_FIELD_NUMBER = 1; + private com.google.protobuf.ByteString content_; + /** + * optional bytes content = 1; + * + *
+     *  optional bytes identifier = 2;
+     * 
+ */ + public boolean hasContent() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes content = 1; + * + *
+     *  optional bytes identifier = 2;
+     * 
+ */ + public com.google.protobuf.ByteString getContent() { + return content_; + } + + private void initFields() { + content_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, content_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, content_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code textsecure.LogicalFingerprint} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprintOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.fingerprint.FingerprintProtos.internal_static_textsecure_LogicalFingerprint_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.fingerprint.FingerprintProtos.internal_static_textsecure_LogicalFingerprint_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.class, org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.Builder.class); + } + + // Construct using org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + content_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.libsignal.fingerprint.FingerprintProtos.internal_static_textsecure_LogicalFingerprint_descriptor; + } + + public org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint getDefaultInstanceForType() { + return org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.getDefaultInstance(); + } + + public org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint build() { + org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint buildPartial() { + org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint result = new org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.content_ = content_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint) { + return mergeFrom((org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint other) { + if (other == org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.getDefaultInstance()) return this; + if (other.hasContent()) { + setContent(other.getContent()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional bytes content = 1; + private com.google.protobuf.ByteString content_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes content = 1; + * + *
+       *  optional bytes identifier = 2;
+       * 
+ */ + public boolean hasContent() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes content = 1; + * + *
+       *  optional bytes identifier = 2;
+       * 
+ */ + public com.google.protobuf.ByteString getContent() { + return content_; + } + /** + * optional bytes content = 1; + * + *
+       *  optional bytes identifier = 2;
+       * 
+ */ + public Builder setContent(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + content_ = value; + onChanged(); + return this; + } + /** + * optional bytes content = 1; + * + *
+       *  optional bytes identifier = 2;
+       * 
+ */ + public Builder clearContent() { + bitField0_ = (bitField0_ & ~0x00000001); + content_ = getDefaultInstance().getContent(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:textsecure.LogicalFingerprint) + } + + static { + defaultInstance = new LogicalFingerprint(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:textsecure.LogicalFingerprint) + } + + public interface CombinedFingerprintsOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional uint32 version = 1; + /** + * optional uint32 version = 1; + */ + boolean hasVersion(); + /** + * optional uint32 version = 1; + */ + int getVersion(); + + // optional .textsecure.LogicalFingerprint localFingerprint = 2; + /** + * optional .textsecure.LogicalFingerprint localFingerprint = 2; + */ + boolean hasLocalFingerprint(); + /** + * optional .textsecure.LogicalFingerprint localFingerprint = 2; + */ + org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint getLocalFingerprint(); + /** + * optional .textsecure.LogicalFingerprint localFingerprint = 2; + */ + org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprintOrBuilder getLocalFingerprintOrBuilder(); + + // optional .textsecure.LogicalFingerprint remoteFingerprint = 3; + /** + * optional .textsecure.LogicalFingerprint remoteFingerprint = 3; + */ + boolean hasRemoteFingerprint(); + /** + * optional .textsecure.LogicalFingerprint remoteFingerprint = 3; + */ + org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint getRemoteFingerprint(); + /** + * optional .textsecure.LogicalFingerprint remoteFingerprint = 3; + */ + org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprintOrBuilder getRemoteFingerprintOrBuilder(); + } + /** + * Protobuf type {@code textsecure.CombinedFingerprints} + */ + public static final class CombinedFingerprints extends + com.google.protobuf.GeneratedMessage + implements CombinedFingerprintsOrBuilder { + // Use CombinedFingerprints.newBuilder() to construct. + private CombinedFingerprints(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private CombinedFingerprints(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final CombinedFingerprints defaultInstance; + public static CombinedFingerprints getDefaultInstance() { + return defaultInstance; + } + + public CombinedFingerprints getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private CombinedFingerprints( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + version_ = input.readUInt32(); + break; + } + case 18: { + org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.Builder subBuilder = null; + if (((bitField0_ & 0x00000002) == 0x00000002)) { + subBuilder = localFingerprint_.toBuilder(); + } + localFingerprint_ = input.readMessage(org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(localFingerprint_); + localFingerprint_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000002; + break; + } + case 26: { + org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.Builder subBuilder = null; + if (((bitField0_ & 0x00000004) == 0x00000004)) { + subBuilder = remoteFingerprint_.toBuilder(); + } + remoteFingerprint_ = input.readMessage(org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(remoteFingerprint_); + remoteFingerprint_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000004; + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.fingerprint.FingerprintProtos.internal_static_textsecure_CombinedFingerprints_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.fingerprint.FingerprintProtos.internal_static_textsecure_CombinedFingerprints_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprints.class, org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprints.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public CombinedFingerprints parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new CombinedFingerprints(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional uint32 version = 1; + public static final int VERSION_FIELD_NUMBER = 1; + private int version_; + /** + * optional uint32 version = 1; + */ + public boolean hasVersion() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 version = 1; + */ + public int getVersion() { + return version_; + } + + // optional .textsecure.LogicalFingerprint localFingerprint = 2; + public static final int LOCALFINGERPRINT_FIELD_NUMBER = 2; + private org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint localFingerprint_; + /** + * optional .textsecure.LogicalFingerprint localFingerprint = 2; + */ + public boolean hasLocalFingerprint() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .textsecure.LogicalFingerprint localFingerprint = 2; + */ + public org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint getLocalFingerprint() { + return localFingerprint_; + } + /** + * optional .textsecure.LogicalFingerprint localFingerprint = 2; + */ + public org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprintOrBuilder getLocalFingerprintOrBuilder() { + return localFingerprint_; + } + + // optional .textsecure.LogicalFingerprint remoteFingerprint = 3; + public static final int REMOTEFINGERPRINT_FIELD_NUMBER = 3; + private org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint remoteFingerprint_; + /** + * optional .textsecure.LogicalFingerprint remoteFingerprint = 3; + */ + public boolean hasRemoteFingerprint() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .textsecure.LogicalFingerprint remoteFingerprint = 3; + */ + public org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint getRemoteFingerprint() { + return remoteFingerprint_; + } + /** + * optional .textsecure.LogicalFingerprint remoteFingerprint = 3; + */ + public org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprintOrBuilder getRemoteFingerprintOrBuilder() { + return remoteFingerprint_; + } + + private void initFields() { + version_ = 0; + localFingerprint_ = org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.getDefaultInstance(); + remoteFingerprint_ = org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.getDefaultInstance(); + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt32(1, version_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeMessage(2, localFingerprint_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeMessage(3, remoteFingerprint_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, version_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, localFingerprint_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, remoteFingerprint_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprints parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprints parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprints parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprints parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprints parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprints parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprints parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprints parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprints parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprints parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprints prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code textsecure.CombinedFingerprints} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprintsOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.fingerprint.FingerprintProtos.internal_static_textsecure_CombinedFingerprints_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.fingerprint.FingerprintProtos.internal_static_textsecure_CombinedFingerprints_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprints.class, org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprints.Builder.class); + } + + // Construct using org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprints.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getLocalFingerprintFieldBuilder(); + getRemoteFingerprintFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + version_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + if (localFingerprintBuilder_ == null) { + localFingerprint_ = org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.getDefaultInstance(); + } else { + localFingerprintBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + if (remoteFingerprintBuilder_ == null) { + remoteFingerprint_ = org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.getDefaultInstance(); + } else { + remoteFingerprintBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.libsignal.fingerprint.FingerprintProtos.internal_static_textsecure_CombinedFingerprints_descriptor; + } + + public org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprints getDefaultInstanceForType() { + return org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprints.getDefaultInstance(); + } + + public org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprints build() { + org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprints result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprints buildPartial() { + org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprints result = new org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprints(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.version_ = version_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + if (localFingerprintBuilder_ == null) { + result.localFingerprint_ = localFingerprint_; + } else { + result.localFingerprint_ = localFingerprintBuilder_.build(); + } + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + if (remoteFingerprintBuilder_ == null) { + result.remoteFingerprint_ = remoteFingerprint_; + } else { + result.remoteFingerprint_ = remoteFingerprintBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprints) { + return mergeFrom((org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprints)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprints other) { + if (other == org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprints.getDefaultInstance()) return this; + if (other.hasVersion()) { + setVersion(other.getVersion()); + } + if (other.hasLocalFingerprint()) { + mergeLocalFingerprint(other.getLocalFingerprint()); + } + if (other.hasRemoteFingerprint()) { + mergeRemoteFingerprint(other.getRemoteFingerprint()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprints parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprints) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional uint32 version = 1; + private int version_ ; + /** + * optional uint32 version = 1; + */ + public boolean hasVersion() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 version = 1; + */ + public int getVersion() { + return version_; + } + /** + * optional uint32 version = 1; + */ + public Builder setVersion(int value) { + bitField0_ |= 0x00000001; + version_ = value; + onChanged(); + return this; + } + /** + * optional uint32 version = 1; + */ + public Builder clearVersion() { + bitField0_ = (bitField0_ & ~0x00000001); + version_ = 0; + onChanged(); + return this; + } + + // optional .textsecure.LogicalFingerprint localFingerprint = 2; + private org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint localFingerprint_ = org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint, org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.Builder, org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprintOrBuilder> localFingerprintBuilder_; + /** + * optional .textsecure.LogicalFingerprint localFingerprint = 2; + */ + public boolean hasLocalFingerprint() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .textsecure.LogicalFingerprint localFingerprint = 2; + */ + public org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint getLocalFingerprint() { + if (localFingerprintBuilder_ == null) { + return localFingerprint_; + } else { + return localFingerprintBuilder_.getMessage(); + } + } + /** + * optional .textsecure.LogicalFingerprint localFingerprint = 2; + */ + public Builder setLocalFingerprint(org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint value) { + if (localFingerprintBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + localFingerprint_ = value; + onChanged(); + } else { + localFingerprintBuilder_.setMessage(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .textsecure.LogicalFingerprint localFingerprint = 2; + */ + public Builder setLocalFingerprint( + org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.Builder builderForValue) { + if (localFingerprintBuilder_ == null) { + localFingerprint_ = builderForValue.build(); + onChanged(); + } else { + localFingerprintBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .textsecure.LogicalFingerprint localFingerprint = 2; + */ + public Builder mergeLocalFingerprint(org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint value) { + if (localFingerprintBuilder_ == null) { + if (((bitField0_ & 0x00000002) == 0x00000002) && + localFingerprint_ != org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.getDefaultInstance()) { + localFingerprint_ = + org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.newBuilder(localFingerprint_).mergeFrom(value).buildPartial(); + } else { + localFingerprint_ = value; + } + onChanged(); + } else { + localFingerprintBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .textsecure.LogicalFingerprint localFingerprint = 2; + */ + public Builder clearLocalFingerprint() { + if (localFingerprintBuilder_ == null) { + localFingerprint_ = org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.getDefaultInstance(); + onChanged(); + } else { + localFingerprintBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + /** + * optional .textsecure.LogicalFingerprint localFingerprint = 2; + */ + public org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.Builder getLocalFingerprintBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getLocalFingerprintFieldBuilder().getBuilder(); + } + /** + * optional .textsecure.LogicalFingerprint localFingerprint = 2; + */ + public org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprintOrBuilder getLocalFingerprintOrBuilder() { + if (localFingerprintBuilder_ != null) { + return localFingerprintBuilder_.getMessageOrBuilder(); + } else { + return localFingerprint_; + } + } + /** + * optional .textsecure.LogicalFingerprint localFingerprint = 2; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint, org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.Builder, org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprintOrBuilder> + getLocalFingerprintFieldBuilder() { + if (localFingerprintBuilder_ == null) { + localFingerprintBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint, org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.Builder, org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprintOrBuilder>( + localFingerprint_, + getParentForChildren(), + isClean()); + localFingerprint_ = null; + } + return localFingerprintBuilder_; + } + + // optional .textsecure.LogicalFingerprint remoteFingerprint = 3; + private org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint remoteFingerprint_ = org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint, org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.Builder, org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprintOrBuilder> remoteFingerprintBuilder_; + /** + * optional .textsecure.LogicalFingerprint remoteFingerprint = 3; + */ + public boolean hasRemoteFingerprint() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .textsecure.LogicalFingerprint remoteFingerprint = 3; + */ + public org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint getRemoteFingerprint() { + if (remoteFingerprintBuilder_ == null) { + return remoteFingerprint_; + } else { + return remoteFingerprintBuilder_.getMessage(); + } + } + /** + * optional .textsecure.LogicalFingerprint remoteFingerprint = 3; + */ + public Builder setRemoteFingerprint(org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint value) { + if (remoteFingerprintBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + remoteFingerprint_ = value; + onChanged(); + } else { + remoteFingerprintBuilder_.setMessage(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .textsecure.LogicalFingerprint remoteFingerprint = 3; + */ + public Builder setRemoteFingerprint( + org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.Builder builderForValue) { + if (remoteFingerprintBuilder_ == null) { + remoteFingerprint_ = builderForValue.build(); + onChanged(); + } else { + remoteFingerprintBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .textsecure.LogicalFingerprint remoteFingerprint = 3; + */ + public Builder mergeRemoteFingerprint(org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint value) { + if (remoteFingerprintBuilder_ == null) { + if (((bitField0_ & 0x00000004) == 0x00000004) && + remoteFingerprint_ != org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.getDefaultInstance()) { + remoteFingerprint_ = + org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.newBuilder(remoteFingerprint_).mergeFrom(value).buildPartial(); + } else { + remoteFingerprint_ = value; + } + onChanged(); + } else { + remoteFingerprintBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .textsecure.LogicalFingerprint remoteFingerprint = 3; + */ + public Builder clearRemoteFingerprint() { + if (remoteFingerprintBuilder_ == null) { + remoteFingerprint_ = org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.getDefaultInstance(); + onChanged(); + } else { + remoteFingerprintBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + /** + * optional .textsecure.LogicalFingerprint remoteFingerprint = 3; + */ + public org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.Builder getRemoteFingerprintBuilder() { + bitField0_ |= 0x00000004; + onChanged(); + return getRemoteFingerprintFieldBuilder().getBuilder(); + } + /** + * optional .textsecure.LogicalFingerprint remoteFingerprint = 3; + */ + public org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprintOrBuilder getRemoteFingerprintOrBuilder() { + if (remoteFingerprintBuilder_ != null) { + return remoteFingerprintBuilder_.getMessageOrBuilder(); + } else { + return remoteFingerprint_; + } + } + /** + * optional .textsecure.LogicalFingerprint remoteFingerprint = 3; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint, org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.Builder, org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprintOrBuilder> + getRemoteFingerprintFieldBuilder() { + if (remoteFingerprintBuilder_ == null) { + remoteFingerprintBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint, org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint.Builder, org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprintOrBuilder>( + remoteFingerprint_, + getParentForChildren(), + isClean()); + remoteFingerprint_ = null; + } + return remoteFingerprintBuilder_; + } + + // @@protoc_insertion_point(builder_scope:textsecure.CombinedFingerprints) + } + + static { + defaultInstance = new CombinedFingerprints(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:textsecure.CombinedFingerprints) + } + + private static com.google.protobuf.Descriptors.Descriptor + internal_static_textsecure_LogicalFingerprint_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_textsecure_LogicalFingerprint_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_textsecure_CombinedFingerprints_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_textsecure_CombinedFingerprints_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + String[] descriptorData = { + "\n\031FingerprintProtocol.proto\022\ntextsecure\"" + + "%\n\022LogicalFingerprint\022\017\n\007content\030\001 \001(\014\"\234" + + "\001\n\024CombinedFingerprints\022\017\n\007version\030\001 \001(\r" + + "\0228\n\020localFingerprint\030\002 \001(\0132\036.textsecure." + + "LogicalFingerprint\0229\n\021remoteFingerprint\030" + + "\003 \001(\0132\036.textsecure.LogicalFingerprintB=\n" + + "(org.session.libsignal.libsignal.fingerprin" + + "tB\021FingerprintProtos" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + internal_static_textsecure_LogicalFingerprint_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_textsecure_LogicalFingerprint_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_textsecure_LogicalFingerprint_descriptor, + new String[] { "Content", }); + internal_static_textsecure_CombinedFingerprints_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_textsecure_CombinedFingerprints_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_textsecure_CombinedFingerprints_descriptor, + new String[] { "Version", "LocalFingerprint", "RemoteFingerprint", }); + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/fingerprint/FingerprintVersionMismatchException.java b/libsignal/src/main/java/org/session/libsignal/libsignal/fingerprint/FingerprintVersionMismatchException.java new file mode 100644 index 000000000..efb2fcea0 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/fingerprint/FingerprintVersionMismatchException.java @@ -0,0 +1,26 @@ +/** + * Copyright (C) 2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.fingerprint; + +public class FingerprintVersionMismatchException extends Exception { + + private final int theirVersion; + private final int ourVersion; + + public FingerprintVersionMismatchException(int theirVersion, int ourVersion) { + super(); + this.theirVersion = theirVersion; + this.ourVersion = ourVersion; + } + + public int getTheirVersion() { + return theirVersion; + } + + public int getOurVersion() { + return ourVersion; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/fingerprint/NumericFingerprintGenerator.java b/libsignal/src/main/java/org/session/libsignal/libsignal/fingerprint/NumericFingerprintGenerator.java new file mode 100644 index 000000000..ee7c21986 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/fingerprint/NumericFingerprintGenerator.java @@ -0,0 +1,127 @@ +/** + * Copyright (C) 2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.fingerprint; + +import org.session.libsignal.libsignal.IdentityKey; +import org.session.libsignal.libsignal.util.ByteUtil; +import org.session.libsignal.libsignal.util.IdentityKeyComparator; + +import java.io.ByteArrayOutputStream; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + +public class NumericFingerprintGenerator implements FingerprintGenerator { + + private static final int FINGERPRINT_VERSION = 0; + + private final int iterations; + + /** + * Construct a fingerprint generator for 60 digit numerics. + * + * @param iterations The number of internal iterations to perform in the process of + * generating a fingerprint. This needs to be constant, and synchronized + * across all clients. + * + * The higher the iteration count, the higher the security level: + * + * - 1024 ~ 109.7 bits + * - 1400 > 110 bits + * - 5200 > 112 bits + */ + public NumericFingerprintGenerator(int iterations) { + this.iterations = iterations; + } + + /** + * Generate a scannable and displayble fingerprint. + * + * @param localStableIdentifier The client's "stable" identifier. + * @param localIdentityKey The client's identity key. + * @param remoteStableIdentifier The remote party's "stable" identifier. + * @param remoteIdentityKey The remote party's identity key. + * @return A unique fingerprint for this conversation. + */ + @Override + public Fingerprint createFor(String localStableIdentifier, final IdentityKey localIdentityKey, + String remoteStableIdentifier, final IdentityKey remoteIdentityKey) + { + return createFor(localStableIdentifier, + new LinkedList() {{ + add(localIdentityKey); + }}, + remoteStableIdentifier, + new LinkedList() {{ + add(remoteIdentityKey); + }}); + } + + /** + * Generate a scannable and displayble fingerprint for logical identities that have multiple + * physical keys. + * + * Do not trust the output of this unless you've been through the device consistency process + * for the provided localIdentityKeys. + * + * @param localStableIdentifier The client's "stable" identifier. + * @param localIdentityKeys The client's collection of physical identity keys. + * @param remoteStableIdentifier The remote party's "stable" identifier. + * @param remoteIdentityKeys The remote party's collection of physical identity key. + * @return A unique fingerprint for this conversation. + */ + public Fingerprint createFor(String localStableIdentifier, List localIdentityKeys, + String remoteStableIdentifier, List remoteIdentityKeys) + { + byte[] localFingerprint = getFingerprint(iterations, localStableIdentifier, localIdentityKeys); + byte[] remoteFingerprint = getFingerprint(iterations, remoteStableIdentifier, remoteIdentityKeys); + + DisplayableFingerprint displayableFingerprint = new DisplayableFingerprint(localFingerprint, + remoteFingerprint); + + ScannableFingerprint scannableFingerprint = new ScannableFingerprint(localFingerprint, + remoteFingerprint); + + return new Fingerprint(displayableFingerprint, scannableFingerprint); + } + + private byte[] getFingerprint(int iterations, String stableIdentifier, List unsortedIdentityKeys) { + try { + MessageDigest digest = MessageDigest.getInstance("SHA-512"); + byte[] publicKey = getLogicalKeyBytes(unsortedIdentityKeys); + byte[] hash = ByteUtil.combine(ByteUtil.shortToByteArray(FINGERPRINT_VERSION), + publicKey, stableIdentifier.getBytes()); + + for (int i=0;i identityKeys) { + ArrayList sortedIdentityKeys = new ArrayList(identityKeys); + Collections.sort(sortedIdentityKeys, new IdentityKeyComparator()); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + for (IdentityKey identityKey : sortedIdentityKeys) { + byte[] publicKeyBytes = identityKey.getPublicKey().serialize(); + baos.write(publicKeyBytes, 0, publicKeyBytes.length); + } + + return baos.toByteArray(); + } + + +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/fingerprint/ScannableFingerprint.java b/libsignal/src/main/java/org/session/libsignal/libsignal/fingerprint/ScannableFingerprint.java new file mode 100644 index 000000000..33b25b71a --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/fingerprint/ScannableFingerprint.java @@ -0,0 +1,75 @@ +/** + * Copyright (C) 2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.fingerprint; + +import com.google.protobuf.ByteString; +import com.google.protobuf.InvalidProtocolBufferException; + +import org.session.libsignal.libsignal.fingerprint.FingerprintParsingException; +import org.session.libsignal.libsignal.fingerprint.FingerprintProtos.CombinedFingerprints; +import org.session.libsignal.libsignal.fingerprint.FingerprintProtos.LogicalFingerprint; +import org.session.libsignal.libsignal.fingerprint.FingerprintVersionMismatchException; +import org.session.libsignal.libsignal.util.ByteUtil; + +import java.security.MessageDigest; + +public class ScannableFingerprint { + + private static final int VERSION = 1; + + private final CombinedFingerprints fingerprints; + + ScannableFingerprint(byte[] localFingerprintData, byte[] remoteFingerprintData) + { + LogicalFingerprint localFingerprint = LogicalFingerprint.newBuilder() + .setContent(ByteString.copyFrom(ByteUtil.trim(localFingerprintData, 32))) + .build(); + + LogicalFingerprint remoteFingerprint = LogicalFingerprint.newBuilder() + .setContent(ByteString.copyFrom(ByteUtil.trim(remoteFingerprintData, 32))) + .build(); + + this.fingerprints = CombinedFingerprints.newBuilder() + .setVersion(VERSION) + .setLocalFingerprint(localFingerprint) + .setRemoteFingerprint(remoteFingerprint) + .build(); + } + + /** + * @return A byte string to be displayed in a QR code. + */ + public byte[] getSerialized() { + return fingerprints.toByteArray(); + } + + /** + * Compare a scanned QR code with what we expect. + * + * @param scannedFingerprintData The scanned data + * @return True if matching, otehrwise false. + * @throws FingerprintVersionMismatchException if the scanned fingerprint is the wrong version. + */ + public boolean compareTo(byte[] scannedFingerprintData) + throws FingerprintVersionMismatchException, + FingerprintParsingException + { + try { + CombinedFingerprints scanned = CombinedFingerprints.parseFrom(scannedFingerprintData); + + if (!scanned.hasRemoteFingerprint() || !scanned.hasLocalFingerprint() || + !scanned.hasVersion() || scanned.getVersion() != VERSION) + { + throw new FingerprintVersionMismatchException(scanned.getVersion(), VERSION); + } + + return MessageDigest.isEqual(fingerprints.getLocalFingerprint().getContent().toByteArray(), scanned.getRemoteFingerprint().getContent().toByteArray()) && + MessageDigest.isEqual(fingerprints.getRemoteFingerprint().getContent().toByteArray(), scanned.getLocalFingerprint().getContent().toByteArray()); + } catch (InvalidProtocolBufferException e) { + throw new FingerprintParsingException(e); + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/groups/GroupCipher.java b/libsignal/src/main/java/org/session/libsignal/libsignal/groups/GroupCipher.java new file mode 100644 index 000000000..84f754081 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/groups/GroupCipher.java @@ -0,0 +1,229 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.groups; + +import org.session.libsignal.libsignal.DecryptionCallback; +import org.session.libsignal.libsignal.DuplicateMessageException; +import org.session.libsignal.libsignal.InvalidKeyIdException; +import org.session.libsignal.libsignal.InvalidMessageException; +import org.session.libsignal.libsignal.LegacyMessageException; +import org.session.libsignal.libsignal.NoSessionException; +import org.session.libsignal.libsignal.groups.SenderKeyName; +import org.session.libsignal.libsignal.groups.ratchet.SenderChainKey; +import org.session.libsignal.libsignal.groups.ratchet.SenderMessageKey; +import org.session.libsignal.libsignal.groups.state.SenderKeyRecord; +import org.session.libsignal.libsignal.groups.state.SenderKeyState; +import org.session.libsignal.libsignal.groups.state.SenderKeyStore; +import org.session.libsignal.libsignal.protocol.SenderKeyMessage; + +import java.security.InvalidAlgorithmParameterException; +import java.security.NoSuchAlgorithmException; + +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +/** + * The main entry point for Signal Protocol group encrypt/decrypt operations. + * + * Once a session has been established with {@link org.session.libsignal.libsignal.groups.GroupSessionBuilder} + * and a {@link org.session.libsignal.libsignal.protocol.SenderKeyDistributionMessage} has been + * distributed to each member of the group, this class can be used for all subsequent encrypt/decrypt + * operations within that session (ie: until group membership changes). + * + * @author Moxie Marlinspike + */ +public class GroupCipher { + + static final Object LOCK = new Object(); + + private final SenderKeyStore senderKeyStore; + private final SenderKeyName senderKeyId; + + public GroupCipher(SenderKeyStore senderKeyStore, SenderKeyName senderKeyId) { + this.senderKeyStore = senderKeyStore; + this.senderKeyId = senderKeyId; + } + + /** + * Encrypt a message. + * + * @param paddedPlaintext The plaintext message bytes, optionally padded. + * @return Ciphertext. + * @throws NoSessionException + */ + public byte[] encrypt(byte[] paddedPlaintext) throws NoSessionException { + synchronized (LOCK) { + try { + SenderKeyRecord record = senderKeyStore.loadSenderKey(senderKeyId); + SenderKeyState senderKeyState = record.getSenderKeyState(); + SenderMessageKey senderKey = senderKeyState.getSenderChainKey().getSenderMessageKey(); + byte[] ciphertext = getCipherText(senderKey.getIv(), senderKey.getCipherKey(), paddedPlaintext); + + SenderKeyMessage senderKeyMessage = new SenderKeyMessage(senderKeyState.getKeyId(), + senderKey.getIteration(), + ciphertext, + senderKeyState.getSigningKeyPrivate()); + + senderKeyState.setSenderChainKey(senderKeyState.getSenderChainKey().getNext()); + + senderKeyStore.storeSenderKey(senderKeyId, record); + + return senderKeyMessage.serialize(); + } catch (InvalidKeyIdException e) { + throw new NoSessionException(e); + } + } + } + + /** + * Decrypt a SenderKey group message. + * + * @param senderKeyMessageBytes The received ciphertext. + * @return Plaintext + * @throws LegacyMessageException + * @throws InvalidMessageException + * @throws DuplicateMessageException + */ + public byte[] decrypt(byte[] senderKeyMessageBytes) + throws LegacyMessageException, DuplicateMessageException, InvalidMessageException, NoSessionException + { + return decrypt(senderKeyMessageBytes, new NullDecryptionCallback()); + } + + /** + * Decrypt a SenderKey group message. + * + * @param senderKeyMessageBytes The received ciphertext. + * @param callback A callback that is triggered after decryption is complete, + * but before the updated session state has been committed to the session + * DB. This allows some implementations to store the committed plaintext + * to a DB first, in case they are concerned with a crash happening between + * the time the session state is updated but before they're able to store + * the plaintext to disk. + * @return Plaintext + * @throws LegacyMessageException + * @throws InvalidMessageException + * @throws DuplicateMessageException + */ + public byte[] decrypt(byte[] senderKeyMessageBytes, DecryptionCallback callback) + throws LegacyMessageException, InvalidMessageException, DuplicateMessageException, + NoSessionException + { + synchronized (LOCK) { + try { + SenderKeyRecord record = senderKeyStore.loadSenderKey(senderKeyId); + + if (record.isEmpty()) { + throw new NoSessionException("No sender key for: " + senderKeyId); + } + + SenderKeyMessage senderKeyMessage = new SenderKeyMessage(senderKeyMessageBytes); + SenderKeyState senderKeyState = record.getSenderKeyState(senderKeyMessage.getKeyId()); + + senderKeyMessage.verifySignature(senderKeyState.getSigningKeyPublic()); + + SenderMessageKey senderKey = getSenderKey(senderKeyState, senderKeyMessage.getIteration()); + + byte[] plaintext = getPlainText(senderKey.getIv(), senderKey.getCipherKey(), senderKeyMessage.getCipherText()); + + callback.handlePlaintext(plaintext); + + senderKeyStore.storeSenderKey(senderKeyId, record); + + return plaintext; + } catch (org.session.libsignal.libsignal.InvalidKeyException e) { + throw new InvalidMessageException(e); + } catch (InvalidKeyIdException e) { + throw new InvalidMessageException(e); + } + } + } + + private SenderMessageKey getSenderKey(SenderKeyState senderKeyState, int iteration) + throws DuplicateMessageException, InvalidMessageException + { + SenderChainKey senderChainKey = senderKeyState.getSenderChainKey(); + + if (senderChainKey.getIteration() > iteration) { + if (senderKeyState.hasSenderMessageKey(iteration)) { + return senderKeyState.removeSenderMessageKey(iteration); + } else { + throw new DuplicateMessageException("Received message with old counter: " + + senderChainKey.getIteration() + " , " + iteration); + } + } + + if (iteration - senderChainKey.getIteration() > 2000) { + throw new InvalidMessageException("Over 2000 messages into the future!"); + } + + while (senderChainKey.getIteration() < iteration) { + senderKeyState.addSenderMessageKey(senderChainKey.getSenderMessageKey()); + senderChainKey = senderChainKey.getNext(); + } + + senderKeyState.setSenderChainKey(senderChainKey.getNext()); + return senderChainKey.getSenderMessageKey(); + } + + private byte[] getPlainText(byte[] iv, byte[] key, byte[] ciphertext) + throws InvalidMessageException + { + try { + IvParameterSpec ivParameterSpec = new IvParameterSpec(iv); + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + + cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"), ivParameterSpec); + + return cipher.doFinal(ciphertext); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (NoSuchPaddingException e) { + throw new AssertionError(e); + } catch(java.security.InvalidKeyException e) { + throw new AssertionError(e); + } catch (InvalidAlgorithmParameterException e) { + throw new AssertionError(e); + } catch (IllegalBlockSizeException e) { + throw new InvalidMessageException(e); + } catch (BadPaddingException e) { + throw new InvalidMessageException(e); + } + } + + private byte[] getCipherText(byte[] iv, byte[] key, byte[] plaintext) { + try { + IvParameterSpec ivParameterSpec = new IvParameterSpec(iv); + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + + cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES"), ivParameterSpec); + + return cipher.doFinal(plaintext); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (NoSuchPaddingException e) { + throw new AssertionError(e); + } catch (InvalidAlgorithmParameterException e) { + throw new AssertionError(e); + } catch (IllegalBlockSizeException e) { + throw new AssertionError(e); + } catch (BadPaddingException e) { + throw new AssertionError(e); + } catch (java.security.InvalidKeyException e) { + throw new AssertionError(e); + } + } + + private static class NullDecryptionCallback implements DecryptionCallback { + @Override + public void handlePlaintext(byte[] plaintext) {} + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/groups/GroupSessionBuilder.java b/libsignal/src/main/java/org/session/libsignal/libsignal/groups/GroupSessionBuilder.java new file mode 100644 index 000000000..9f71c18d5 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/groups/GroupSessionBuilder.java @@ -0,0 +1,90 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.groups; + +import org.session.libsignal.libsignal.InvalidKeyException; +import org.session.libsignal.libsignal.InvalidKeyIdException; +import org.session.libsignal.libsignal.groups.state.SenderKeyRecord; +import org.session.libsignal.libsignal.groups.state.SenderKeyState; +import org.session.libsignal.libsignal.groups.state.SenderKeyStore; +import org.session.libsignal.libsignal.protocol.SenderKeyDistributionMessage; +import org.session.libsignal.libsignal.util.KeyHelper; + +/** + * GroupSessionBuilder is responsible for setting up group SenderKey encrypted sessions. + * + * Once a session has been established, {@link org.session.libsignal.libsignal.groups.GroupCipher} + * can be used to encrypt/decrypt messages in that session. + *

+ * The built sessions are unidirectional: they can be used either for sending or for receiving, + * but not both. + * + * Sessions are constructed per (groupId + senderId + deviceId) tuple. Remote logical users + * are identified by their senderId, and each logical recipientId can have multiple physical + * devices. + * + * @author Moxie Marlinspike + */ + +public class GroupSessionBuilder { + + private final SenderKeyStore senderKeyStore; + + public GroupSessionBuilder(SenderKeyStore senderKeyStore) { + this.senderKeyStore = senderKeyStore; + } + + /** + * Construct a group session for receiving messages from senderKeyName. + * + * @param senderKeyName The (groupId, senderId, deviceId) tuple associated with the SenderKeyDistributionMessage. + * @param senderKeyDistributionMessage A received SenderKeyDistributionMessage. + */ + public void process(SenderKeyName senderKeyName, SenderKeyDistributionMessage senderKeyDistributionMessage) { + synchronized (GroupCipher.LOCK) { + SenderKeyRecord senderKeyRecord = senderKeyStore.loadSenderKey(senderKeyName); + senderKeyRecord.addSenderKeyState(senderKeyDistributionMessage.getId(), + senderKeyDistributionMessage.getIteration(), + senderKeyDistributionMessage.getChainKey(), + senderKeyDistributionMessage.getSignatureKey()); + senderKeyStore.storeSenderKey(senderKeyName, senderKeyRecord); + } + } + + /** + * Construct a group session for sending messages. + * + * @param senderKeyName The (groupId, senderId, deviceId) tuple. In this case, 'senderId' should be the caller. + * @return A SenderKeyDistributionMessage that is individually distributed to each member of the group. + */ + public SenderKeyDistributionMessage create(SenderKeyName senderKeyName) { + synchronized (GroupCipher.LOCK) { + try { + SenderKeyRecord senderKeyRecord = senderKeyStore.loadSenderKey(senderKeyName); + + if (senderKeyRecord.isEmpty()) { + senderKeyRecord.setSenderKeyState(KeyHelper.generateSenderKeyId(), + 0, + KeyHelper.generateSenderKey(), + KeyHelper.generateSenderSigningKey()); + senderKeyStore.storeSenderKey(senderKeyName, senderKeyRecord); + } + + SenderKeyState state = senderKeyRecord.getSenderKeyState(); + + return new SenderKeyDistributionMessage(state.getKeyId(), + state.getSenderChainKey().getIteration(), + state.getSenderChainKey().getSeed(), + state.getSigningKeyPublic()); + + } catch (InvalidKeyIdException e) { + throw new AssertionError(e); + } catch (InvalidKeyException e) { + throw new AssertionError(e); + } + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/groups/SenderKeyName.java b/libsignal/src/main/java/org/session/libsignal/libsignal/groups/SenderKeyName.java new file mode 100644 index 000000000..836c7ca6c --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/groups/SenderKeyName.java @@ -0,0 +1,52 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.groups; + +import org.session.libsignal.libsignal.SignalProtocolAddress; + +/** + * A representation of a (groupId + senderId + deviceId) tuple. + */ +public class SenderKeyName { + + private final String groupId; + private final SignalProtocolAddress sender; + + public SenderKeyName(String groupId, SignalProtocolAddress sender) { + this.groupId = groupId; + this.sender = sender; + } + + public String getGroupId() { + return groupId; + } + + public SignalProtocolAddress getSender() { + return sender; + } + + public String serialize() { + return groupId + "::" + sender.getName() + "::" + String.valueOf(sender.getDeviceId()); + } + + @Override + public boolean equals(Object other) { + if (other == null) return false; + if (!(other instanceof SenderKeyName)) return false; + + SenderKeyName that = (SenderKeyName)other; + + return + this.groupId.equals(that.groupId) && + this.sender.equals(that.sender); + } + + @Override + public int hashCode() { + return this.groupId.hashCode() ^ this.sender.hashCode(); + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/groups/ratchet/SenderChainKey.java b/libsignal/src/main/java/org/session/libsignal/libsignal/groups/ratchet/SenderChainKey.java new file mode 100644 index 000000000..38a0d0520 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/groups/ratchet/SenderChainKey.java @@ -0,0 +1,68 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.groups.ratchet; + +import org.session.libsignal.libsignal.groups.ratchet.SenderMessageKey; + +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; + +/** + * Each SenderKey is a "chain" of keys, each derived from the previous. + * + * At any given point in time, the state of a SenderKey can be represented + * as the current chain key value, along with its iteration count. From there, + * subsequent iterations can be derived, as well as individual message keys from + * each chain key. + * + * @author Moxie Marlinspike + */ +public class SenderChainKey { + + private static final byte[] MESSAGE_KEY_SEED = {0x01}; + private static final byte[] CHAIN_KEY_SEED = {0x02}; + + private final int iteration; + private final byte[] chainKey; + + public SenderChainKey(int iteration, byte[] chainKey) { + this.iteration = iteration; + this.chainKey = chainKey; + } + + public int getIteration() { + return iteration; + } + + public SenderMessageKey getSenderMessageKey() { + return new SenderMessageKey(iteration, getDerivative(MESSAGE_KEY_SEED, chainKey)); + } + + public SenderChainKey getNext() { + return new SenderChainKey(iteration + 1, getDerivative(CHAIN_KEY_SEED, chainKey)); + } + + public byte[] getSeed() { + return chainKey; + } + + private byte[] getDerivative(byte[] seed, byte[] key) { + try { + Mac mac = Mac.getInstance("HmacSHA256"); + mac.init(new SecretKeySpec(key, "HmacSHA256")); + + return mac.doFinal(seed); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (InvalidKeyException e) { + throw new AssertionError(e); + } + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/groups/ratchet/SenderMessageKey.java b/libsignal/src/main/java/org/session/libsignal/libsignal/groups/ratchet/SenderMessageKey.java new file mode 100644 index 000000000..e27f788ea --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/groups/ratchet/SenderMessageKey.java @@ -0,0 +1,50 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.libsignal.groups.ratchet; + +import org.session.libsignal.libsignal.kdf.HKDFv3; +import org.session.libsignal.libsignal.util.ByteUtil; + +/** + * The final symmetric material (IV and Cipher Key) used for encrypting + * individual SenderKey messages. + * + * @author Moxie Marlinspike + */ +public class SenderMessageKey { + + private final int iteration; + private final byte[] iv; + private final byte[] cipherKey; + private final byte[] seed; + + public SenderMessageKey(int iteration, byte[] seed) { + byte[] derivative = new HKDFv3().deriveSecrets(seed, "WhisperGroup".getBytes(), 48); + byte[][] parts = ByteUtil.split(derivative, 16, 32); + + this.iteration = iteration; + this.seed = seed; + this.iv = parts[0]; + this.cipherKey = parts[1]; + } + + public int getIteration() { + return iteration; + } + + public byte[] getIv() { + return iv; + } + + public byte[] getCipherKey() { + return cipherKey; + } + + public byte[] getSeed() { + return seed; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/groups/state/SenderKeyRecord.java b/libsignal/src/main/java/org/session/libsignal/libsignal/groups/state/SenderKeyRecord.java new file mode 100644 index 000000000..12c0446b5 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/groups/state/SenderKeyRecord.java @@ -0,0 +1,85 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.groups.state; + +import org.session.libsignal.libsignal.InvalidKeyIdException; +import org.session.libsignal.libsignal.ecc.ECKeyPair; +import org.session.libsignal.libsignal.ecc.ECPublicKey; +import org.session.libsignal.libsignal.state.StorageProtos; + +import java.io.IOException; +import java.util.LinkedList; +import java.util.List; + +import static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructure; + +/** + * A durable representation of a set of SenderKeyStates for a specific + * SenderKeyName. + * + * @author Moxie Marlisnpike + */ +public class SenderKeyRecord { + + private static final int MAX_STATES = 5; + + private LinkedList senderKeyStates = new LinkedList(); + + public SenderKeyRecord() {} + + public SenderKeyRecord(byte[] serialized) throws IOException { + SenderKeyRecordStructure senderKeyRecordStructure = SenderKeyRecordStructure.parseFrom(serialized); + + for (StorageProtos.SenderKeyStateStructure structure : senderKeyRecordStructure.getSenderKeyStatesList()) { + this.senderKeyStates.add(new SenderKeyState(structure)); + } + } + + public boolean isEmpty() { + return senderKeyStates.isEmpty(); + } + + public SenderKeyState getSenderKeyState() throws InvalidKeyIdException { + if (!senderKeyStates.isEmpty()) { + return senderKeyStates.get(0); + } else { + throw new InvalidKeyIdException("No key state in record!"); + } + } + + public SenderKeyState getSenderKeyState(int keyId) throws InvalidKeyIdException { + for (SenderKeyState state : senderKeyStates) { + if (state.getKeyId() == keyId) { + return state; + } + } + + throw new InvalidKeyIdException("No keys for: " + keyId); + } + + public void addSenderKeyState(int id, int iteration, byte[] chainKey, ECPublicKey signatureKey) { + senderKeyStates.addFirst(new SenderKeyState(id, iteration, chainKey, signatureKey)); + + if (senderKeyStates.size() > MAX_STATES) { + senderKeyStates.removeLast(); + } + } + + public void setSenderKeyState(int id, int iteration, byte[] chainKey, ECKeyPair signatureKey) { + senderKeyStates.clear(); + senderKeyStates.add(new SenderKeyState(id, iteration, chainKey, signatureKey)); + } + + public byte[] serialize() { + SenderKeyRecordStructure.Builder recordStructure = SenderKeyRecordStructure.newBuilder(); + + for (SenderKeyState senderKeyState : senderKeyStates) { + recordStructure.addSenderKeyStates(senderKeyState.getStructure()); + } + + return recordStructure.build().toByteArray(); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/groups/state/SenderKeyState.java b/libsignal/src/main/java/org/session/libsignal/libsignal/groups/state/SenderKeyState.java new file mode 100644 index 000000000..34417523a --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/groups/state/SenderKeyState.java @@ -0,0 +1,162 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.groups.state; + +import com.google.protobuf.ByteString; + +import org.session.libsignal.libsignal.InvalidKeyException; +import org.session.libsignal.libsignal.ecc.Curve; +import org.session.libsignal.libsignal.ecc.ECKeyPair; +import org.session.libsignal.libsignal.ecc.ECPrivateKey; +import org.session.libsignal.libsignal.ecc.ECPublicKey; +import org.session.libsignal.libsignal.groups.ratchet.SenderChainKey; +import org.session.libsignal.libsignal.groups.ratchet.SenderMessageKey; +import org.session.libsignal.libsignal.util.guava.Optional; + +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + +import static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure; + +/** + * Represents the state of an individual SenderKey ratchet. + * + * @author Moxie Marlinspike + */ +public class SenderKeyState { + + private static final int MAX_MESSAGE_KEYS = 2000; + + private SenderKeyStateStructure senderKeyStateStructure; + + public SenderKeyState(int id, int iteration, byte[] chainKey, ECPublicKey signatureKey) { + this(id, iteration, chainKey, signatureKey, Optional.absent()); + } + + public SenderKeyState(int id, int iteration, byte[] chainKey, ECKeyPair signatureKey) { + this(id, iteration, chainKey, signatureKey.getPublicKey(), Optional.of(signatureKey.getPrivateKey())); + } + + private SenderKeyState(int id, int iteration, byte[] chainKey, + ECPublicKey signatureKeyPublic, + Optional signatureKeyPrivate) + { + SenderKeyStateStructure.SenderChainKey senderChainKeyStructure = + SenderKeyStateStructure.SenderChainKey.newBuilder() + .setIteration(iteration) + .setSeed(ByteString.copyFrom(chainKey)) + .build(); + + SenderKeyStateStructure.SenderSigningKey.Builder signingKeyStructure = + SenderKeyStateStructure.SenderSigningKey.newBuilder() + .setPublic(ByteString.copyFrom(signatureKeyPublic.serialize())); + + if (signatureKeyPrivate.isPresent()) { + signingKeyStructure.setPrivate(ByteString.copyFrom(signatureKeyPrivate.get().serialize())); + } + + this.senderKeyStateStructure = SenderKeyStateStructure.newBuilder() + .setSenderKeyId(id) + .setSenderChainKey(senderChainKeyStructure) + .setSenderSigningKey(signingKeyStructure) + .build(); + } + + public SenderKeyState(SenderKeyStateStructure senderKeyStateStructure) { + this.senderKeyStateStructure = senderKeyStateStructure; + } + + public int getKeyId() { + return senderKeyStateStructure.getSenderKeyId(); + } + + public SenderChainKey getSenderChainKey() { + return new SenderChainKey(senderKeyStateStructure.getSenderChainKey().getIteration(), + senderKeyStateStructure.getSenderChainKey().getSeed().toByteArray()); + } + + public void setSenderChainKey(SenderChainKey chainKey) { + SenderKeyStateStructure.SenderChainKey senderChainKeyStructure = + SenderKeyStateStructure.SenderChainKey.newBuilder() + .setIteration(chainKey.getIteration()) + .setSeed(ByteString.copyFrom(chainKey.getSeed())) + .build(); + + this.senderKeyStateStructure = senderKeyStateStructure.toBuilder() + .setSenderChainKey(senderChainKeyStructure) + .build(); + } + + public ECPublicKey getSigningKeyPublic() throws InvalidKeyException { + return Curve.decodePoint(senderKeyStateStructure.getSenderSigningKey() + .getPublic() + .toByteArray(), 0); + } + + public ECPrivateKey getSigningKeyPrivate() { + return Curve.decodePrivatePoint(senderKeyStateStructure.getSenderSigningKey() + .getPrivate().toByteArray()); + } + + public boolean hasSenderMessageKey(int iteration) { + for (SenderKeyStateStructure.SenderMessageKey senderMessageKey : senderKeyStateStructure.getSenderMessageKeysList()) { + if (senderMessageKey.getIteration() == iteration) return true; + } + + return false; + } + + public void addSenderMessageKey(SenderMessageKey senderMessageKey) { + SenderKeyStateStructure.SenderMessageKey senderMessageKeyStructure = + SenderKeyStateStructure.SenderMessageKey.newBuilder() + .setIteration(senderMessageKey.getIteration()) + .setSeed(ByteString.copyFrom(senderMessageKey.getSeed())) + .build(); + + SenderKeyStateStructure.Builder builder = this.senderKeyStateStructure.toBuilder(); + + builder.addSenderMessageKeys(senderMessageKeyStructure); + + if (builder.getSenderMessageKeysCount() > MAX_MESSAGE_KEYS) { + builder.removeSenderMessageKeys(0); + } + + this.senderKeyStateStructure = builder.build(); + } + + public SenderMessageKey removeSenderMessageKey(int iteration) { + List keys = new LinkedList(senderKeyStateStructure.getSenderMessageKeysList()); + Iterator iterator = keys.iterator(); + + SenderKeyStateStructure.SenderMessageKey result = null; + + while (iterator.hasNext()) { + SenderKeyStateStructure.SenderMessageKey senderMessageKey = iterator.next(); + + if (senderMessageKey.getIteration() == iteration) { + result = senderMessageKey; + iterator.remove(); + break; + } + } + + this.senderKeyStateStructure = this.senderKeyStateStructure.toBuilder() + .clearSenderMessageKeys() + .addAllSenderMessageKeys(keys) + .build(); + + if (result != null) { + return new SenderMessageKey(result.getIteration(), result.getSeed().toByteArray()); + } else { + return null; + } + } + + public SenderKeyStateStructure getStructure() { + return senderKeyStateStructure; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/groups/state/SenderKeyStore.java b/libsignal/src/main/java/org/session/libsignal/libsignal/groups/state/SenderKeyStore.java new file mode 100644 index 000000000..10f0df997 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/groups/state/SenderKeyStore.java @@ -0,0 +1,38 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.groups.state; + +import org.session.libsignal.libsignal.groups.SenderKeyName; +import org.session.libsignal.libsignal.groups.state.SenderKeyRecord; + +public interface SenderKeyStore { + + /** + * Commit to storage the {@link org.session.libsignal.libsignal.groups.state.SenderKeyRecord} for a + * given (groupId + senderId + deviceId) tuple. + * + * @param senderKeyName the (groupId + senderId + deviceId) tuple. + * @param record the current SenderKeyRecord for the specified senderKeyName. + */ + public void storeSenderKey(SenderKeyName senderKeyName, SenderKeyRecord record); + + /** + * Returns a copy of the {@link SenderKeyRecord} + * corresponding to the (groupId + senderId + deviceId) tuple, or a new SenderKeyRecord if + * one does not currently exist. + *

+ * It is important that implementations return a copy of the current durable information. The + * returned SenderKeyRecord may be modified, but those changes should not have an effect on the + * durable session state (what is returned by subsequent calls to this method) without the + * store method being called here first. + * + * @param senderKeyName The (groupId + senderId + deviceId) tuple. + * @return a copy of the SenderKeyRecord corresponding to the (groupId + senderId + deviceId tuple, or + * a new SenderKeyRecord if one does not currently exist. + */ + + public SenderKeyRecord loadSenderKey(SenderKeyName senderKeyName); +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/kdf/DerivedMessageSecrets.java b/libsignal/src/main/java/org/session/libsignal/libsignal/kdf/DerivedMessageSecrets.java new file mode 100644 index 000000000..ef1c28cda --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/kdf/DerivedMessageSecrets.java @@ -0,0 +1,50 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.libsignal.kdf; + +import org.session.libsignal.libsignal.util.ByteUtil; + +import java.text.ParseException; + +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +public class DerivedMessageSecrets { + + public static final int SIZE = 80; + private static final int CIPHER_KEY_LENGTH = 32; + private static final int MAC_KEY_LENGTH = 32; + private static final int IV_LENGTH = 16; + + private final SecretKeySpec cipherKey; + private final SecretKeySpec macKey; + private final IvParameterSpec iv; + + public DerivedMessageSecrets(byte[] okm) { + try { + byte[][] keys = ByteUtil.split(okm, CIPHER_KEY_LENGTH, MAC_KEY_LENGTH, IV_LENGTH); + + this.cipherKey = new SecretKeySpec(keys[0], "AES"); + this.macKey = new SecretKeySpec(keys[1], "HmacSHA256"); + this.iv = new IvParameterSpec(keys[2]); + } catch (ParseException e) { + throw new AssertionError(e); + } + } + + public SecretKeySpec getCipherKey() { + return cipherKey; + } + + public SecretKeySpec getMacKey() { + return macKey; + } + + public IvParameterSpec getIv() { + return iv; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/kdf/DerivedRootSecrets.java b/libsignal/src/main/java/org/session/libsignal/libsignal/kdf/DerivedRootSecrets.java new file mode 100644 index 000000000..e43bcccdd --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/kdf/DerivedRootSecrets.java @@ -0,0 +1,31 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.kdf; + +import org.session.libsignal.libsignal.util.ByteUtil; + +public class DerivedRootSecrets { + + public static final int SIZE = 64; + + private final byte[] rootKey; + private final byte[] chainKey; + + public DerivedRootSecrets(byte[] okm) { + byte[][] keys = ByteUtil.split(okm, 32, 32); + this.rootKey = keys[0]; + this.chainKey = keys[1]; + } + + public byte[] getRootKey() { + return rootKey; + } + + public byte[] getChainKey() { + return chainKey; + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/kdf/HKDF.java b/libsignal/src/main/java/org/session/libsignal/libsignal/kdf/HKDF.java new file mode 100644 index 000000000..546529b2d --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/kdf/HKDF.java @@ -0,0 +1,89 @@ +/** + * Copyright (C) 2013-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.libsignal.kdf; + +import org.session.libsignal.libsignal.kdf.HKDFv2; +import org.session.libsignal.libsignal.kdf.HKDFv3; + +import java.io.ByteArrayOutputStream; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; + +public abstract class HKDF { + + private static final int HASH_OUTPUT_SIZE = 32; + + public static HKDF createFor(int messageVersion) { + switch (messageVersion) { + case 2: return new HKDFv2(); + case 3: return new HKDFv3(); + default: throw new AssertionError("Unknown version: " + messageVersion); + } + } + + public byte[] deriveSecrets(byte[] inputKeyMaterial, byte[] info, int outputLength) { + byte[] salt = new byte[HASH_OUTPUT_SIZE]; + return deriveSecrets(inputKeyMaterial, salt, info, outputLength); + } + + public byte[] deriveSecrets(byte[] inputKeyMaterial, byte[] salt, byte[] info, int outputLength) { + byte[] prk = extract(salt, inputKeyMaterial); + return expand(prk, info, outputLength); + } + + private byte[] extract(byte[] salt, byte[] inputKeyMaterial) { + try { + Mac mac = Mac.getInstance("HmacSHA256"); + mac.init(new SecretKeySpec(salt, "HmacSHA256")); + return mac.doFinal(inputKeyMaterial); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (InvalidKeyException e) { + throw new AssertionError(e); + } + } + + private byte[] expand(byte[] prk, byte[] info, int outputSize) { + try { + int iterations = (int) Math.ceil((double) outputSize / (double) HASH_OUTPUT_SIZE); + byte[] mixin = new byte[0]; + ByteArrayOutputStream results = new ByteArrayOutputStream(); + int remainingBytes = outputSize; + + for (int i= getIterationStartOffset();i + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.protocol; + +public interface CiphertextMessage { + + public static final int CURRENT_VERSION = 3; + + public static final int WHISPER_TYPE = 2; + public static final int PREKEY_TYPE = 3; + public static final int SENDERKEY_TYPE = 4; + public static final int SENDERKEY_DISTRIBUTION_TYPE = 5; + public static final int CLOSED_GROUP_CIPHERTEXT = 6; + public static final int FALLBACK_MESSAGE_TYPE = 999; // Loki + + // This should be the worst case (worse than V2). So not always accurate, but good enough for padding. + public static final int ENCRYPTED_MESSAGE_OVERHEAD = 53; + + public byte[] serialize(); + + public int getType(); + +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/protocol/DeviceConsistencyMessage.java b/libsignal/src/main/java/org/session/libsignal/libsignal/protocol/DeviceConsistencyMessage.java new file mode 100644 index 000000000..3badd860c --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/protocol/DeviceConsistencyMessage.java @@ -0,0 +1,68 @@ +package org.session.libsignal.libsignal.protocol; + +import com.google.protobuf.ByteString; +import com.google.protobuf.InvalidProtocolBufferException; + +import org.whispersystems.curve25519.VrfSignatureVerificationFailedException; +import org.session.libsignal.libsignal.IdentityKey; +import org.session.libsignal.libsignal.IdentityKeyPair; +import org.session.libsignal.libsignal.InvalidKeyException; +import org.session.libsignal.libsignal.InvalidMessageException; +import org.session.libsignal.libsignal.devices.DeviceConsistencyCommitment; +import org.session.libsignal.libsignal.devices.DeviceConsistencySignature; +import org.session.libsignal.libsignal.ecc.Curve; + +public class DeviceConsistencyMessage { + + private final DeviceConsistencySignature signature; + private final int generation; + private final byte[] serialized; + + public DeviceConsistencyMessage(DeviceConsistencyCommitment commitment, IdentityKeyPair identityKeyPair) { + try { + byte[] signatureBytes = Curve.calculateVrfSignature(identityKeyPair.getPrivateKey(), commitment.toByteArray()); + byte[] vrfOutputBytes = Curve.verifyVrfSignature(identityKeyPair.getPublicKey().getPublicKey(), commitment.toByteArray(), signatureBytes); + + this.generation = commitment.getGeneration(); + this.signature = new DeviceConsistencySignature(signatureBytes, vrfOutputBytes); + this.serialized = SignalProtos.DeviceConsistencyCodeMessage.newBuilder() + .setGeneration(commitment.getGeneration()) + .setSignature(ByteString.copyFrom(signature.getSignature())) + .build() + .toByteArray(); + } catch (InvalidKeyException e) { + throw new AssertionError(e); + } catch (VrfSignatureVerificationFailedException e) { + throw new AssertionError(e); + } + } + + public DeviceConsistencyMessage(DeviceConsistencyCommitment commitment, byte[] serialized, IdentityKey identityKey) throws InvalidMessageException { + try { + SignalProtos.DeviceConsistencyCodeMessage message = SignalProtos.DeviceConsistencyCodeMessage.parseFrom(serialized); + byte[] vrfOutputBytes = Curve.verifyVrfSignature(identityKey.getPublicKey(), commitment.toByteArray(), message.getSignature().toByteArray()); + + this.generation = message.getGeneration(); + this.signature = new DeviceConsistencySignature(message.getSignature().toByteArray(), vrfOutputBytes); + this.serialized = serialized; + } catch (InvalidProtocolBufferException e) { + throw new InvalidMessageException(e); + } catch (InvalidKeyException e) { + throw new InvalidMessageException(e); + } catch (VrfSignatureVerificationFailedException e) { + throw new InvalidMessageException(e); + } + } + + public byte[] getSerialized() { + return serialized; + } + + public DeviceConsistencySignature getSignature() { + return signature; + } + + public int getGeneration() { + return generation; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/protocol/PreKeySignalMessage.java b/libsignal/src/main/java/org/session/libsignal/libsignal/protocol/PreKeySignalMessage.java new file mode 100644 index 000000000..135651858 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/protocol/PreKeySignalMessage.java @@ -0,0 +1,143 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.protocol; + +import com.google.protobuf.ByteString; +import com.google.protobuf.InvalidProtocolBufferException; + +import org.session.libsignal.libsignal.IdentityKey; +import org.session.libsignal.libsignal.InvalidKeyException; +import org.session.libsignal.libsignal.InvalidMessageException; +import org.session.libsignal.libsignal.InvalidVersionException; +import org.session.libsignal.libsignal.LegacyMessageException; +import org.session.libsignal.libsignal.ecc.Curve; +import org.session.libsignal.libsignal.ecc.ECPublicKey; +import org.session.libsignal.libsignal.util.ByteUtil; +import org.session.libsignal.libsignal.util.guava.Optional; + + +public class PreKeySignalMessage implements CiphertextMessage { + + private final int version; + private final int registrationId; + private final Optional preKeyId; + private final int signedPreKeyId; + private final ECPublicKey baseKey; + private final IdentityKey identityKey; + private final SignalMessage message; + private final byte[] serialized; + + public PreKeySignalMessage(byte[] serialized) + throws InvalidMessageException, InvalidVersionException + { + try { + this.version = ByteUtil.highBitsToInt(serialized[0]); + + if (this.version > CiphertextMessage.CURRENT_VERSION) { + throw new InvalidVersionException("Unknown version: " + this.version); + } + + if (this.version < CiphertextMessage.CURRENT_VERSION) { + throw new LegacyMessageException("Legacy version: " + this.version); + } + + SignalProtos.PreKeySignalMessage preKeyWhisperMessage + = SignalProtos.PreKeySignalMessage.parseFrom(ByteString.copyFrom(serialized, 1, + serialized.length-1)); + + if (!preKeyWhisperMessage.hasSignedPreKeyId() || + !preKeyWhisperMessage.hasBaseKey() || + !preKeyWhisperMessage.hasIdentityKey() || + !preKeyWhisperMessage.hasMessage()) + { + throw new InvalidMessageException("Incomplete message."); + } + + this.serialized = serialized; + this.registrationId = preKeyWhisperMessage.getRegistrationId(); + this.preKeyId = preKeyWhisperMessage.hasPreKeyId() ? Optional.of(preKeyWhisperMessage.getPreKeyId()) : Optional.absent(); + this.signedPreKeyId = preKeyWhisperMessage.hasSignedPreKeyId() ? preKeyWhisperMessage.getSignedPreKeyId() : -1; + this.baseKey = Curve.decodePoint(preKeyWhisperMessage.getBaseKey().toByteArray(), 0); + this.identityKey = new IdentityKey(Curve.decodePoint(preKeyWhisperMessage.getIdentityKey().toByteArray(), 0)); + this.message = new SignalMessage(preKeyWhisperMessage.getMessage().toByteArray()); + } catch (InvalidProtocolBufferException e) { + throw new InvalidMessageException(e); + } catch (InvalidKeyException e) { + throw new InvalidMessageException(e); + } catch (LegacyMessageException e) { + throw new InvalidMessageException(e); + } + } + + public PreKeySignalMessage(int messageVersion, int registrationId, Optional preKeyId, + int signedPreKeyId, ECPublicKey baseKey, IdentityKey identityKey, + SignalMessage message) + { + this.version = messageVersion; + this.registrationId = registrationId; + this.preKeyId = preKeyId; + this.signedPreKeyId = signedPreKeyId; + this.baseKey = baseKey; + this.identityKey = identityKey; + this.message = message; + + SignalProtos.PreKeySignalMessage.Builder builder = + SignalProtos.PreKeySignalMessage.newBuilder() + .setSignedPreKeyId(signedPreKeyId) + .setBaseKey(ByteString.copyFrom(baseKey.serialize())) + .setIdentityKey(ByteString.copyFrom(identityKey.serialize())) + .setMessage(ByteString.copyFrom(message.serialize())) + .setRegistrationId(registrationId); + + if (preKeyId.isPresent()) { + builder.setPreKeyId(preKeyId.get()); + } + + byte[] versionBytes = {ByteUtil.intsToByteHighAndLow(this.version, CURRENT_VERSION)}; + byte[] messageBytes = builder.build().toByteArray(); + + this.serialized = ByteUtil.combine(versionBytes, messageBytes); + } + + public int getMessageVersion() { + return version; + } + + public IdentityKey getIdentityKey() { + return identityKey; + } + + public int getRegistrationId() { + return registrationId; + } + + public Optional getPreKeyId() { + return preKeyId; + } + + public int getSignedPreKeyId() { + return signedPreKeyId; + } + + public ECPublicKey getBaseKey() { + return baseKey; + } + + public SignalMessage getWhisperMessage() { + return message; + } + + @Override + public byte[] serialize() { + return serialized; + } + + @Override + public int getType() { + return CiphertextMessage.PREKEY_TYPE; + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/protocol/SenderKeyDistributionMessage.java b/libsignal/src/main/java/org/session/libsignal/libsignal/protocol/SenderKeyDistributionMessage.java new file mode 100644 index 000000000..290f121cd --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/protocol/SenderKeyDistributionMessage.java @@ -0,0 +1,103 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.protocol; + +import com.google.protobuf.ByteString; +import com.google.protobuf.InvalidProtocolBufferException; + +import org.session.libsignal.libsignal.InvalidKeyException; +import org.session.libsignal.libsignal.InvalidMessageException; +import org.session.libsignal.libsignal.LegacyMessageException; +import org.session.libsignal.libsignal.ecc.Curve; +import org.session.libsignal.libsignal.ecc.ECPublicKey; +import org.session.libsignal.libsignal.util.ByteUtil; + +public class SenderKeyDistributionMessage implements CiphertextMessage { + + private final int id; + private final int iteration; + private final byte[] chainKey; + private final ECPublicKey signatureKey; + private final byte[] serialized; + + public SenderKeyDistributionMessage(int id, int iteration, byte[] chainKey, ECPublicKey signatureKey) { + byte[] version = {ByteUtil.intsToByteHighAndLow(CURRENT_VERSION, CURRENT_VERSION)}; + byte[] protobuf = SignalProtos.SenderKeyDistributionMessage.newBuilder() + .setId(id) + .setIteration(iteration) + .setChainKey(ByteString.copyFrom(chainKey)) + .setSigningKey(ByteString.copyFrom(signatureKey.serialize())) + .build().toByteArray(); + + this.id = id; + this.iteration = iteration; + this.chainKey = chainKey; + this.signatureKey = signatureKey; + this.serialized = ByteUtil.combine(version, protobuf); + } + + public SenderKeyDistributionMessage(byte[] serialized) throws LegacyMessageException, InvalidMessageException { + try { + byte[][] messageParts = ByteUtil.split(serialized, 1, serialized.length - 1); + byte version = messageParts[0][0]; + byte[] message = messageParts[1]; + + if (ByteUtil.highBitsToInt(version) < CiphertextMessage.CURRENT_VERSION) { + throw new LegacyMessageException("Legacy message: " + ByteUtil.highBitsToInt(version)); + } + + if (ByteUtil.highBitsToInt(version) > CURRENT_VERSION) { + throw new InvalidMessageException("Unknown version: " + ByteUtil.highBitsToInt(version)); + } + + SignalProtos.SenderKeyDistributionMessage distributionMessage = SignalProtos.SenderKeyDistributionMessage.parseFrom(message); + + if (!distributionMessage.hasId() || + !distributionMessage.hasIteration() || + !distributionMessage.hasChainKey() || + !distributionMessage.hasSigningKey()) + { + throw new InvalidMessageException("Incomplete message."); + } + + this.serialized = serialized; + this.id = distributionMessage.getId(); + this.iteration = distributionMessage.getIteration(); + this.chainKey = distributionMessage.getChainKey().toByteArray(); + this.signatureKey = Curve.decodePoint(distributionMessage.getSigningKey().toByteArray(), 0); + } catch (InvalidProtocolBufferException e) { + throw new InvalidMessageException(e); + } catch (InvalidKeyException e) { + throw new InvalidMessageException(e); + } + } + + @Override + public byte[] serialize() { + return serialized; + } + + @Override + public int getType() { + return SENDERKEY_DISTRIBUTION_TYPE; + } + + public int getIteration() { + return iteration; + } + + public byte[] getChainKey() { + return chainKey; + } + + public ECPublicKey getSignatureKey() { + return signatureKey; + } + + public int getId() { + return id; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/protocol/SenderKeyMessage.java b/libsignal/src/main/java/org/session/libsignal/libsignal/protocol/SenderKeyMessage.java new file mode 100644 index 000000000..da40f6f37 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/protocol/SenderKeyMessage.java @@ -0,0 +1,129 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.protocol; + +import com.google.protobuf.ByteString; +import com.google.protobuf.InvalidProtocolBufferException; + +import org.session.libsignal.libsignal.InvalidKeyException; +import org.session.libsignal.libsignal.InvalidMessageException; +import org.session.libsignal.libsignal.LegacyMessageException; +import org.session.libsignal.libsignal.ecc.Curve; +import org.session.libsignal.libsignal.ecc.ECPrivateKey; +import org.session.libsignal.libsignal.ecc.ECPublicKey; +import org.session.libsignal.libsignal.protocol.CiphertextMessage; +import org.session.libsignal.libsignal.util.ByteUtil; + +import java.text.ParseException; + +public class SenderKeyMessage implements CiphertextMessage { + + private static final int SIGNATURE_LENGTH = 64; + + private final int messageVersion; + private final int keyId; + private final int iteration; + private final byte[] ciphertext; + private final byte[] serialized; + + public SenderKeyMessage(byte[] serialized) throws InvalidMessageException, LegacyMessageException { + try { + byte[][] messageParts = ByteUtil.split(serialized, 1, serialized.length - 1 - SIGNATURE_LENGTH, SIGNATURE_LENGTH); + byte version = messageParts[0][0]; + byte[] message = messageParts[1]; + byte[] signature = messageParts[2]; + + if (ByteUtil.highBitsToInt(version) < 3) { + throw new LegacyMessageException("Legacy message: " + ByteUtil.highBitsToInt(version)); + } + + if (ByteUtil.highBitsToInt(version) > CURRENT_VERSION) { + throw new InvalidMessageException("Unknown version: " + ByteUtil.highBitsToInt(version)); + } + + SignalProtos.SenderKeyMessage senderKeyMessage = SignalProtos.SenderKeyMessage.parseFrom(message); + + if (!senderKeyMessage.hasId() || + !senderKeyMessage.hasIteration() || + !senderKeyMessage.hasCiphertext()) + { + throw new InvalidMessageException("Incomplete message."); + } + + this.serialized = serialized; + this.messageVersion = ByteUtil.highBitsToInt(version); + this.keyId = senderKeyMessage.getId(); + this.iteration = senderKeyMessage.getIteration(); + this.ciphertext = senderKeyMessage.getCiphertext().toByteArray(); + } catch (InvalidProtocolBufferException e) { + throw new InvalidMessageException(e); + } catch (ParseException e) { + throw new InvalidMessageException(e); + } + } + + public SenderKeyMessage(int keyId, int iteration, byte[] ciphertext, ECPrivateKey signatureKey) { + byte[] version = {ByteUtil.intsToByteHighAndLow(CURRENT_VERSION, CURRENT_VERSION)}; + byte[] message = SignalProtos.SenderKeyMessage.newBuilder() + .setId(keyId) + .setIteration(iteration) + .setCiphertext(ByteString.copyFrom(ciphertext)) + .build().toByteArray(); + + byte[] signature = getSignature(signatureKey, ByteUtil.combine(version, message)); + + this.serialized = ByteUtil.combine(version, message, signature); + this.messageVersion = CURRENT_VERSION; + this.keyId = keyId; + this.iteration = iteration; + this.ciphertext = ciphertext; + } + + public int getKeyId() { + return keyId; + } + + public int getIteration() { + return iteration; + } + + public byte[] getCipherText() { + return ciphertext; + } + + public void verifySignature(ECPublicKey signatureKey) + throws InvalidMessageException + { + try { + byte[][] parts = ByteUtil.split(serialized, serialized.length - SIGNATURE_LENGTH, SIGNATURE_LENGTH); + + if (!Curve.verifySignature(signatureKey, parts[0], parts[1])) { + throw new InvalidMessageException("Invalid signature!"); + } + + } catch (InvalidKeyException e) { + throw new InvalidMessageException(e); + } + } + + private byte[] getSignature(ECPrivateKey signatureKey, byte[] serialized) { + try { + return Curve.calculateSignature(signatureKey, serialized); + } catch (InvalidKeyException e) { + throw new AssertionError(e); + } + } + + @Override + public byte[] serialize() { + return serialized; + } + + @Override + public int getType() { + return CiphertextMessage.SENDERKEY_TYPE; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/protocol/SignalMessage.java b/libsignal/src/main/java/org/session/libsignal/libsignal/protocol/SignalMessage.java new file mode 100644 index 000000000..04709a36c --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/protocol/SignalMessage.java @@ -0,0 +1,163 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.protocol; + +import com.google.protobuf.ByteString; +import com.google.protobuf.InvalidProtocolBufferException; + +import org.session.libsignal.libsignal.IdentityKey; +import org.session.libsignal.libsignal.InvalidKeyException; +import org.session.libsignal.libsignal.InvalidMessageException; +import org.session.libsignal.libsignal.LegacyMessageException; +import org.session.libsignal.libsignal.ecc.Curve; +import org.session.libsignal.libsignal.ecc.ECPublicKey; +import org.session.libsignal.libsignal.protocol.CiphertextMessage; +import org.session.libsignal.libsignal.util.ByteUtil; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.text.ParseException; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; + +public class SignalMessage implements CiphertextMessage { + + private static final int MAC_LENGTH = 8; + + private final int messageVersion; + private final ECPublicKey senderRatchetKey; + private final int counter; + private final int previousCounter; + private final byte[] ciphertext; + private final byte[] serialized; + + public SignalMessage(byte[] serialized) throws InvalidMessageException, LegacyMessageException { + try { + byte[][] messageParts = ByteUtil.split(serialized, 1, serialized.length - 1 - MAC_LENGTH, MAC_LENGTH); + byte version = messageParts[0][0]; + byte[] message = messageParts[1]; + byte[] mac = messageParts[2]; + + if (ByteUtil.highBitsToInt(version) < CURRENT_VERSION) { + throw new LegacyMessageException("Legacy message: " + ByteUtil.highBitsToInt(version)); + } + + if (ByteUtil.highBitsToInt(version) > CURRENT_VERSION) { + throw new InvalidMessageException("Unknown version: " + ByteUtil.highBitsToInt(version)); + } + + SignalProtos.SignalMessage whisperMessage = SignalProtos.SignalMessage.parseFrom(message); + + if (!whisperMessage.hasCiphertext() || + !whisperMessage.hasCounter() || + !whisperMessage.hasRatchetKey()) + { + throw new InvalidMessageException("Incomplete message."); + } + + this.serialized = serialized; + this.senderRatchetKey = Curve.decodePoint(whisperMessage.getRatchetKey().toByteArray(), 0); + this.messageVersion = ByteUtil.highBitsToInt(version); + this.counter = whisperMessage.getCounter(); + this.previousCounter = whisperMessage.getPreviousCounter(); + this.ciphertext = whisperMessage.getCiphertext().toByteArray(); + } catch (InvalidProtocolBufferException e) { + throw new InvalidMessageException(e); + } catch (InvalidKeyException e) { + throw new InvalidMessageException(e); + } catch (ParseException e) { + throw new InvalidMessageException(e); + } + } + + public SignalMessage(int messageVersion, SecretKeySpec macKey, ECPublicKey senderRatchetKey, + int counter, int previousCounter, byte[] ciphertext, + IdentityKey senderIdentityKey, + IdentityKey receiverIdentityKey) + { + byte[] version = {ByteUtil.intsToByteHighAndLow(messageVersion, CURRENT_VERSION)}; + byte[] message = SignalProtos.SignalMessage.newBuilder() + .setRatchetKey(ByteString.copyFrom(senderRatchetKey.serialize())) + .setCounter(counter) + .setPreviousCounter(previousCounter) + .setCiphertext(ByteString.copyFrom(ciphertext)) + .build().toByteArray(); + + byte[] mac = getMac(senderIdentityKey, receiverIdentityKey, macKey, ByteUtil.combine(version, message)); + + this.serialized = ByteUtil.combine(version, message, mac); + this.senderRatchetKey = senderRatchetKey; + this.counter = counter; + this.previousCounter = previousCounter; + this.ciphertext = ciphertext; + this.messageVersion = messageVersion; + } + + public ECPublicKey getSenderRatchetKey() { + return senderRatchetKey; + } + + public int getMessageVersion() { + return messageVersion; + } + + public int getCounter() { + return counter; + } + + public byte[] getBody() { + return ciphertext; + } + + public void verifyMac(IdentityKey senderIdentityKey, IdentityKey receiverIdentityKey, SecretKeySpec macKey) + throws InvalidMessageException + { + byte[][] parts = ByteUtil.split(serialized, serialized.length - MAC_LENGTH, MAC_LENGTH); + byte[] ourMac = getMac(senderIdentityKey, receiverIdentityKey, macKey, parts[0]); + byte[] theirMac = parts[1]; + + if (!MessageDigest.isEqual(ourMac, theirMac)) { + throw new InvalidMessageException("Bad Mac!"); + } + } + + private byte[] getMac(IdentityKey senderIdentityKey, + IdentityKey receiverIdentityKey, + SecretKeySpec macKey, byte[] serialized) + { + try { + Mac mac = Mac.getInstance("HmacSHA256"); + mac.init(macKey); + + mac.update(senderIdentityKey.getPublicKey().serialize()); + mac.update(receiverIdentityKey.getPublicKey().serialize()); + + byte[] fullMac = mac.doFinal(serialized); + return ByteUtil.trim(fullMac, MAC_LENGTH); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (java.security.InvalidKeyException e) { + throw new AssertionError(e); + } + } + + @Override + public byte[] serialize() { + return serialized; + } + + @Override + public int getType() { + return CiphertextMessage.WHISPER_TYPE; + } + + public static boolean isLegacy(byte[] message) { + return message != null && message.length >= 1 && + ByteUtil.highBitsToInt(message[0]) != CiphertextMessage.CURRENT_VERSION; + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/protocol/SignalProtos.java b/libsignal/src/main/java/org/session/libsignal/libsignal/protocol/SignalProtos.java new file mode 100644 index 000000000..0341f058c --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/protocol/SignalProtos.java @@ -0,0 +1,4698 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: WhisperTextProtocol.proto + +package org.session.libsignal.libsignal.protocol; + +public final class SignalProtos { + private SignalProtos() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + } + public interface SignalMessageOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional bytes ratchetKey = 1; + /** + * optional bytes ratchetKey = 1; + */ + boolean hasRatchetKey(); + /** + * optional bytes ratchetKey = 1; + */ + com.google.protobuf.ByteString getRatchetKey(); + + // optional uint32 counter = 2; + /** + * optional uint32 counter = 2; + */ + boolean hasCounter(); + /** + * optional uint32 counter = 2; + */ + int getCounter(); + + // optional uint32 previousCounter = 3; + /** + * optional uint32 previousCounter = 3; + */ + boolean hasPreviousCounter(); + /** + * optional uint32 previousCounter = 3; + */ + int getPreviousCounter(); + + // optional bytes ciphertext = 4; + /** + * optional bytes ciphertext = 4; + */ + boolean hasCiphertext(); + /** + * optional bytes ciphertext = 4; + */ + com.google.protobuf.ByteString getCiphertext(); + } + /** + * Protobuf type {@code textsecure.SignalMessage} + */ + public static final class SignalMessage extends + com.google.protobuf.GeneratedMessage + implements SignalMessageOrBuilder { + // Use SignalMessage.newBuilder() to construct. + private SignalMessage(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private SignalMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final SignalMessage defaultInstance; + public static SignalMessage getDefaultInstance() { + return defaultInstance; + } + + public SignalMessage getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private SignalMessage( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + ratchetKey_ = input.readBytes(); + break; + } + case 16: { + bitField0_ |= 0x00000002; + counter_ = input.readUInt32(); + break; + } + case 24: { + bitField0_ |= 0x00000004; + previousCounter_ = input.readUInt32(); + break; + } + case 34: { + bitField0_ |= 0x00000008; + ciphertext_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_SignalMessage_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_SignalMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.protocol.SignalProtos.SignalMessage.class, org.session.libsignal.libsignal.protocol.SignalProtos.SignalMessage.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public SignalMessage parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new SignalMessage(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional bytes ratchetKey = 1; + public static final int RATCHETKEY_FIELD_NUMBER = 1; + private com.google.protobuf.ByteString ratchetKey_; + /** + * optional bytes ratchetKey = 1; + */ + public boolean hasRatchetKey() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes ratchetKey = 1; + */ + public com.google.protobuf.ByteString getRatchetKey() { + return ratchetKey_; + } + + // optional uint32 counter = 2; + public static final int COUNTER_FIELD_NUMBER = 2; + private int counter_; + /** + * optional uint32 counter = 2; + */ + public boolean hasCounter() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional uint32 counter = 2; + */ + public int getCounter() { + return counter_; + } + + // optional uint32 previousCounter = 3; + public static final int PREVIOUSCOUNTER_FIELD_NUMBER = 3; + private int previousCounter_; + /** + * optional uint32 previousCounter = 3; + */ + public boolean hasPreviousCounter() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional uint32 previousCounter = 3; + */ + public int getPreviousCounter() { + return previousCounter_; + } + + // optional bytes ciphertext = 4; + public static final int CIPHERTEXT_FIELD_NUMBER = 4; + private com.google.protobuf.ByteString ciphertext_; + /** + * optional bytes ciphertext = 4; + */ + public boolean hasCiphertext() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional bytes ciphertext = 4; + */ + public com.google.protobuf.ByteString getCiphertext() { + return ciphertext_; + } + + private void initFields() { + ratchetKey_ = com.google.protobuf.ByteString.EMPTY; + counter_ = 0; + previousCounter_ = 0; + ciphertext_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, ratchetKey_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeUInt32(2, counter_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeUInt32(3, previousCounter_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeBytes(4, ciphertext_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, ratchetKey_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(2, counter_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(3, previousCounter_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(4, ciphertext_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.libsignal.protocol.SignalProtos.SignalMessage parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.SignalMessage parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.SignalMessage parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.SignalMessage parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.SignalMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.SignalMessage parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.SignalMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.SignalMessage parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.SignalMessage parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.SignalMessage parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.libsignal.protocol.SignalProtos.SignalMessage prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code textsecure.SignalMessage} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.libsignal.protocol.SignalProtos.SignalMessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_SignalMessage_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_SignalMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.protocol.SignalProtos.SignalMessage.class, org.session.libsignal.libsignal.protocol.SignalProtos.SignalMessage.Builder.class); + } + + // Construct using org.session.libsignal.libsignal.protocol.SignalProtos.SignalMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + ratchetKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + counter_ = 0; + bitField0_ = (bitField0_ & ~0x00000002); + previousCounter_ = 0; + bitField0_ = (bitField0_ & ~0x00000004); + ciphertext_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_SignalMessage_descriptor; + } + + public org.session.libsignal.libsignal.protocol.SignalProtos.SignalMessage getDefaultInstanceForType() { + return org.session.libsignal.libsignal.protocol.SignalProtos.SignalMessage.getDefaultInstance(); + } + + public org.session.libsignal.libsignal.protocol.SignalProtos.SignalMessage build() { + org.session.libsignal.libsignal.protocol.SignalProtos.SignalMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.libsignal.protocol.SignalProtos.SignalMessage buildPartial() { + org.session.libsignal.libsignal.protocol.SignalProtos.SignalMessage result = new org.session.libsignal.libsignal.protocol.SignalProtos.SignalMessage(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.ratchetKey_ = ratchetKey_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.counter_ = counter_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.previousCounter_ = previousCounter_; + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000008; + } + result.ciphertext_ = ciphertext_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.libsignal.protocol.SignalProtos.SignalMessage) { + return mergeFrom((org.session.libsignal.libsignal.protocol.SignalProtos.SignalMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.libsignal.protocol.SignalProtos.SignalMessage other) { + if (other == org.session.libsignal.libsignal.protocol.SignalProtos.SignalMessage.getDefaultInstance()) return this; + if (other.hasRatchetKey()) { + setRatchetKey(other.getRatchetKey()); + } + if (other.hasCounter()) { + setCounter(other.getCounter()); + } + if (other.hasPreviousCounter()) { + setPreviousCounter(other.getPreviousCounter()); + } + if (other.hasCiphertext()) { + setCiphertext(other.getCiphertext()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.libsignal.protocol.SignalProtos.SignalMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.libsignal.protocol.SignalProtos.SignalMessage) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional bytes ratchetKey = 1; + private com.google.protobuf.ByteString ratchetKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes ratchetKey = 1; + */ + public boolean hasRatchetKey() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes ratchetKey = 1; + */ + public com.google.protobuf.ByteString getRatchetKey() { + return ratchetKey_; + } + /** + * optional bytes ratchetKey = 1; + */ + public Builder setRatchetKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + ratchetKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes ratchetKey = 1; + */ + public Builder clearRatchetKey() { + bitField0_ = (bitField0_ & ~0x00000001); + ratchetKey_ = getDefaultInstance().getRatchetKey(); + onChanged(); + return this; + } + + // optional uint32 counter = 2; + private int counter_ ; + /** + * optional uint32 counter = 2; + */ + public boolean hasCounter() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional uint32 counter = 2; + */ + public int getCounter() { + return counter_; + } + /** + * optional uint32 counter = 2; + */ + public Builder setCounter(int value) { + bitField0_ |= 0x00000002; + counter_ = value; + onChanged(); + return this; + } + /** + * optional uint32 counter = 2; + */ + public Builder clearCounter() { + bitField0_ = (bitField0_ & ~0x00000002); + counter_ = 0; + onChanged(); + return this; + } + + // optional uint32 previousCounter = 3; + private int previousCounter_ ; + /** + * optional uint32 previousCounter = 3; + */ + public boolean hasPreviousCounter() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional uint32 previousCounter = 3; + */ + public int getPreviousCounter() { + return previousCounter_; + } + /** + * optional uint32 previousCounter = 3; + */ + public Builder setPreviousCounter(int value) { + bitField0_ |= 0x00000004; + previousCounter_ = value; + onChanged(); + return this; + } + /** + * optional uint32 previousCounter = 3; + */ + public Builder clearPreviousCounter() { + bitField0_ = (bitField0_ & ~0x00000004); + previousCounter_ = 0; + onChanged(); + return this; + } + + // optional bytes ciphertext = 4; + private com.google.protobuf.ByteString ciphertext_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes ciphertext = 4; + */ + public boolean hasCiphertext() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional bytes ciphertext = 4; + */ + public com.google.protobuf.ByteString getCiphertext() { + return ciphertext_; + } + /** + * optional bytes ciphertext = 4; + */ + public Builder setCiphertext(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + ciphertext_ = value; + onChanged(); + return this; + } + /** + * optional bytes ciphertext = 4; + */ + public Builder clearCiphertext() { + bitField0_ = (bitField0_ & ~0x00000008); + ciphertext_ = getDefaultInstance().getCiphertext(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:textsecure.SignalMessage) + } + + static { + defaultInstance = new SignalMessage(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:textsecure.SignalMessage) + } + + public interface PreKeySignalMessageOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional uint32 registrationId = 5; + /** + * optional uint32 registrationId = 5; + */ + boolean hasRegistrationId(); + /** + * optional uint32 registrationId = 5; + */ + int getRegistrationId(); + + // optional uint32 preKeyId = 1; + /** + * optional uint32 preKeyId = 1; + */ + boolean hasPreKeyId(); + /** + * optional uint32 preKeyId = 1; + */ + int getPreKeyId(); + + // optional uint32 signedPreKeyId = 6; + /** + * optional uint32 signedPreKeyId = 6; + */ + boolean hasSignedPreKeyId(); + /** + * optional uint32 signedPreKeyId = 6; + */ + int getSignedPreKeyId(); + + // optional bytes baseKey = 2; + /** + * optional bytes baseKey = 2; + */ + boolean hasBaseKey(); + /** + * optional bytes baseKey = 2; + */ + com.google.protobuf.ByteString getBaseKey(); + + // optional bytes identityKey = 3; + /** + * optional bytes identityKey = 3; + */ + boolean hasIdentityKey(); + /** + * optional bytes identityKey = 3; + */ + com.google.protobuf.ByteString getIdentityKey(); + + // optional bytes message = 4; + /** + * optional bytes message = 4; + * + *

+     * SignalMessage
+     * 
+ */ + boolean hasMessage(); + /** + * optional bytes message = 4; + * + *
+     * SignalMessage
+     * 
+ */ + com.google.protobuf.ByteString getMessage(); + } + /** + * Protobuf type {@code textsecure.PreKeySignalMessage} + */ + public static final class PreKeySignalMessage extends + com.google.protobuf.GeneratedMessage + implements PreKeySignalMessageOrBuilder { + // Use PreKeySignalMessage.newBuilder() to construct. + private PreKeySignalMessage(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private PreKeySignalMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final PreKeySignalMessage defaultInstance; + public static PreKeySignalMessage getDefaultInstance() { + return defaultInstance; + } + + public PreKeySignalMessage getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private PreKeySignalMessage( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000002; + preKeyId_ = input.readUInt32(); + break; + } + case 18: { + bitField0_ |= 0x00000008; + baseKey_ = input.readBytes(); + break; + } + case 26: { + bitField0_ |= 0x00000010; + identityKey_ = input.readBytes(); + break; + } + case 34: { + bitField0_ |= 0x00000020; + message_ = input.readBytes(); + break; + } + case 40: { + bitField0_ |= 0x00000001; + registrationId_ = input.readUInt32(); + break; + } + case 48: { + bitField0_ |= 0x00000004; + signedPreKeyId_ = input.readUInt32(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_PreKeySignalMessage_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_PreKeySignalMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.protocol.SignalProtos.PreKeySignalMessage.class, org.session.libsignal.libsignal.protocol.SignalProtos.PreKeySignalMessage.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public PreKeySignalMessage parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new PreKeySignalMessage(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional uint32 registrationId = 5; + public static final int REGISTRATIONID_FIELD_NUMBER = 5; + private int registrationId_; + /** + * optional uint32 registrationId = 5; + */ + public boolean hasRegistrationId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 registrationId = 5; + */ + public int getRegistrationId() { + return registrationId_; + } + + // optional uint32 preKeyId = 1; + public static final int PREKEYID_FIELD_NUMBER = 1; + private int preKeyId_; + /** + * optional uint32 preKeyId = 1; + */ + public boolean hasPreKeyId() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional uint32 preKeyId = 1; + */ + public int getPreKeyId() { + return preKeyId_; + } + + // optional uint32 signedPreKeyId = 6; + public static final int SIGNEDPREKEYID_FIELD_NUMBER = 6; + private int signedPreKeyId_; + /** + * optional uint32 signedPreKeyId = 6; + */ + public boolean hasSignedPreKeyId() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional uint32 signedPreKeyId = 6; + */ + public int getSignedPreKeyId() { + return signedPreKeyId_; + } + + // optional bytes baseKey = 2; + public static final int BASEKEY_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString baseKey_; + /** + * optional bytes baseKey = 2; + */ + public boolean hasBaseKey() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional bytes baseKey = 2; + */ + public com.google.protobuf.ByteString getBaseKey() { + return baseKey_; + } + + // optional bytes identityKey = 3; + public static final int IDENTITYKEY_FIELD_NUMBER = 3; + private com.google.protobuf.ByteString identityKey_; + /** + * optional bytes identityKey = 3; + */ + public boolean hasIdentityKey() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional bytes identityKey = 3; + */ + public com.google.protobuf.ByteString getIdentityKey() { + return identityKey_; + } + + // optional bytes message = 4; + public static final int MESSAGE_FIELD_NUMBER = 4; + private com.google.protobuf.ByteString message_; + /** + * optional bytes message = 4; + * + *
+     * SignalMessage
+     * 
+ */ + public boolean hasMessage() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional bytes message = 4; + * + *
+     * SignalMessage
+     * 
+ */ + public com.google.protobuf.ByteString getMessage() { + return message_; + } + + private void initFields() { + registrationId_ = 0; + preKeyId_ = 0; + signedPreKeyId_ = 0; + baseKey_ = com.google.protobuf.ByteString.EMPTY; + identityKey_ = com.google.protobuf.ByteString.EMPTY; + message_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeUInt32(1, preKeyId_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeBytes(2, baseKey_); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + output.writeBytes(3, identityKey_); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + output.writeBytes(4, message_); + } + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt32(5, registrationId_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeUInt32(6, signedPreKeyId_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, preKeyId_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, baseKey_); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, identityKey_); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(4, message_); + } + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(5, registrationId_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(6, signedPreKeyId_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.libsignal.protocol.SignalProtos.PreKeySignalMessage parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.PreKeySignalMessage parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.PreKeySignalMessage parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.PreKeySignalMessage parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.PreKeySignalMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.PreKeySignalMessage parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.PreKeySignalMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.PreKeySignalMessage parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.PreKeySignalMessage parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.PreKeySignalMessage parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.libsignal.protocol.SignalProtos.PreKeySignalMessage prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code textsecure.PreKeySignalMessage} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.libsignal.protocol.SignalProtos.PreKeySignalMessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_PreKeySignalMessage_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_PreKeySignalMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.protocol.SignalProtos.PreKeySignalMessage.class, org.session.libsignal.libsignal.protocol.SignalProtos.PreKeySignalMessage.Builder.class); + } + + // Construct using org.session.libsignal.libsignal.protocol.SignalProtos.PreKeySignalMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + registrationId_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + preKeyId_ = 0; + bitField0_ = (bitField0_ & ~0x00000002); + signedPreKeyId_ = 0; + bitField0_ = (bitField0_ & ~0x00000004); + baseKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000008); + identityKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000010); + message_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000020); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_PreKeySignalMessage_descriptor; + } + + public org.session.libsignal.libsignal.protocol.SignalProtos.PreKeySignalMessage getDefaultInstanceForType() { + return org.session.libsignal.libsignal.protocol.SignalProtos.PreKeySignalMessage.getDefaultInstance(); + } + + public org.session.libsignal.libsignal.protocol.SignalProtos.PreKeySignalMessage build() { + org.session.libsignal.libsignal.protocol.SignalProtos.PreKeySignalMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.libsignal.protocol.SignalProtos.PreKeySignalMessage buildPartial() { + org.session.libsignal.libsignal.protocol.SignalProtos.PreKeySignalMessage result = new org.session.libsignal.libsignal.protocol.SignalProtos.PreKeySignalMessage(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.registrationId_ = registrationId_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.preKeyId_ = preKeyId_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.signedPreKeyId_ = signedPreKeyId_; + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000008; + } + result.baseKey_ = baseKey_; + if (((from_bitField0_ & 0x00000010) == 0x00000010)) { + to_bitField0_ |= 0x00000010; + } + result.identityKey_ = identityKey_; + if (((from_bitField0_ & 0x00000020) == 0x00000020)) { + to_bitField0_ |= 0x00000020; + } + result.message_ = message_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.libsignal.protocol.SignalProtos.PreKeySignalMessage) { + return mergeFrom((org.session.libsignal.libsignal.protocol.SignalProtos.PreKeySignalMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.libsignal.protocol.SignalProtos.PreKeySignalMessage other) { + if (other == org.session.libsignal.libsignal.protocol.SignalProtos.PreKeySignalMessage.getDefaultInstance()) return this; + if (other.hasRegistrationId()) { + setRegistrationId(other.getRegistrationId()); + } + if (other.hasPreKeyId()) { + setPreKeyId(other.getPreKeyId()); + } + if (other.hasSignedPreKeyId()) { + setSignedPreKeyId(other.getSignedPreKeyId()); + } + if (other.hasBaseKey()) { + setBaseKey(other.getBaseKey()); + } + if (other.hasIdentityKey()) { + setIdentityKey(other.getIdentityKey()); + } + if (other.hasMessage()) { + setMessage(other.getMessage()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.libsignal.protocol.SignalProtos.PreKeySignalMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.libsignal.protocol.SignalProtos.PreKeySignalMessage) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional uint32 registrationId = 5; + private int registrationId_ ; + /** + * optional uint32 registrationId = 5; + */ + public boolean hasRegistrationId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 registrationId = 5; + */ + public int getRegistrationId() { + return registrationId_; + } + /** + * optional uint32 registrationId = 5; + */ + public Builder setRegistrationId(int value) { + bitField0_ |= 0x00000001; + registrationId_ = value; + onChanged(); + return this; + } + /** + * optional uint32 registrationId = 5; + */ + public Builder clearRegistrationId() { + bitField0_ = (bitField0_ & ~0x00000001); + registrationId_ = 0; + onChanged(); + return this; + } + + // optional uint32 preKeyId = 1; + private int preKeyId_ ; + /** + * optional uint32 preKeyId = 1; + */ + public boolean hasPreKeyId() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional uint32 preKeyId = 1; + */ + public int getPreKeyId() { + return preKeyId_; + } + /** + * optional uint32 preKeyId = 1; + */ + public Builder setPreKeyId(int value) { + bitField0_ |= 0x00000002; + preKeyId_ = value; + onChanged(); + return this; + } + /** + * optional uint32 preKeyId = 1; + */ + public Builder clearPreKeyId() { + bitField0_ = (bitField0_ & ~0x00000002); + preKeyId_ = 0; + onChanged(); + return this; + } + + // optional uint32 signedPreKeyId = 6; + private int signedPreKeyId_ ; + /** + * optional uint32 signedPreKeyId = 6; + */ + public boolean hasSignedPreKeyId() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional uint32 signedPreKeyId = 6; + */ + public int getSignedPreKeyId() { + return signedPreKeyId_; + } + /** + * optional uint32 signedPreKeyId = 6; + */ + public Builder setSignedPreKeyId(int value) { + bitField0_ |= 0x00000004; + signedPreKeyId_ = value; + onChanged(); + return this; + } + /** + * optional uint32 signedPreKeyId = 6; + */ + public Builder clearSignedPreKeyId() { + bitField0_ = (bitField0_ & ~0x00000004); + signedPreKeyId_ = 0; + onChanged(); + return this; + } + + // optional bytes baseKey = 2; + private com.google.protobuf.ByteString baseKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes baseKey = 2; + */ + public boolean hasBaseKey() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional bytes baseKey = 2; + */ + public com.google.protobuf.ByteString getBaseKey() { + return baseKey_; + } + /** + * optional bytes baseKey = 2; + */ + public Builder setBaseKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + baseKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes baseKey = 2; + */ + public Builder clearBaseKey() { + bitField0_ = (bitField0_ & ~0x00000008); + baseKey_ = getDefaultInstance().getBaseKey(); + onChanged(); + return this; + } + + // optional bytes identityKey = 3; + private com.google.protobuf.ByteString identityKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes identityKey = 3; + */ + public boolean hasIdentityKey() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional bytes identityKey = 3; + */ + public com.google.protobuf.ByteString getIdentityKey() { + return identityKey_; + } + /** + * optional bytes identityKey = 3; + */ + public Builder setIdentityKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000010; + identityKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes identityKey = 3; + */ + public Builder clearIdentityKey() { + bitField0_ = (bitField0_ & ~0x00000010); + identityKey_ = getDefaultInstance().getIdentityKey(); + onChanged(); + return this; + } + + // optional bytes message = 4; + private com.google.protobuf.ByteString message_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes message = 4; + * + *
+       * SignalMessage
+       * 
+ */ + public boolean hasMessage() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional bytes message = 4; + * + *
+       * SignalMessage
+       * 
+ */ + public com.google.protobuf.ByteString getMessage() { + return message_; + } + /** + * optional bytes message = 4; + * + *
+       * SignalMessage
+       * 
+ */ + public Builder setMessage(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000020; + message_ = value; + onChanged(); + return this; + } + /** + * optional bytes message = 4; + * + *
+       * SignalMessage
+       * 
+ */ + public Builder clearMessage() { + bitField0_ = (bitField0_ & ~0x00000020); + message_ = getDefaultInstance().getMessage(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:textsecure.PreKeySignalMessage) + } + + static { + defaultInstance = new PreKeySignalMessage(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:textsecure.PreKeySignalMessage) + } + + public interface KeyExchangeMessageOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional uint32 id = 1; + /** + * optional uint32 id = 1; + */ + boolean hasId(); + /** + * optional uint32 id = 1; + */ + int getId(); + + // optional bytes baseKey = 2; + /** + * optional bytes baseKey = 2; + */ + boolean hasBaseKey(); + /** + * optional bytes baseKey = 2; + */ + com.google.protobuf.ByteString getBaseKey(); + + // optional bytes ratchetKey = 3; + /** + * optional bytes ratchetKey = 3; + */ + boolean hasRatchetKey(); + /** + * optional bytes ratchetKey = 3; + */ + com.google.protobuf.ByteString getRatchetKey(); + + // optional bytes identityKey = 4; + /** + * optional bytes identityKey = 4; + */ + boolean hasIdentityKey(); + /** + * optional bytes identityKey = 4; + */ + com.google.protobuf.ByteString getIdentityKey(); + + // optional bytes baseKeySignature = 5; + /** + * optional bytes baseKeySignature = 5; + */ + boolean hasBaseKeySignature(); + /** + * optional bytes baseKeySignature = 5; + */ + com.google.protobuf.ByteString getBaseKeySignature(); + } + /** + * Protobuf type {@code textsecure.KeyExchangeMessage} + */ + public static final class KeyExchangeMessage extends + com.google.protobuf.GeneratedMessage + implements KeyExchangeMessageOrBuilder { + // Use KeyExchangeMessage.newBuilder() to construct. + private KeyExchangeMessage(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private KeyExchangeMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final KeyExchangeMessage defaultInstance; + public static KeyExchangeMessage getDefaultInstance() { + return defaultInstance; + } + + public KeyExchangeMessage getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private KeyExchangeMessage( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + id_ = input.readUInt32(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + baseKey_ = input.readBytes(); + break; + } + case 26: { + bitField0_ |= 0x00000004; + ratchetKey_ = input.readBytes(); + break; + } + case 34: { + bitField0_ |= 0x00000008; + identityKey_ = input.readBytes(); + break; + } + case 42: { + bitField0_ |= 0x00000010; + baseKeySignature_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_KeyExchangeMessage_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_KeyExchangeMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.protocol.SignalProtos.KeyExchangeMessage.class, org.session.libsignal.libsignal.protocol.SignalProtos.KeyExchangeMessage.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public KeyExchangeMessage parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new KeyExchangeMessage(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional uint32 id = 1; + public static final int ID_FIELD_NUMBER = 1; + private int id_; + /** + * optional uint32 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 id = 1; + */ + public int getId() { + return id_; + } + + // optional bytes baseKey = 2; + public static final int BASEKEY_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString baseKey_; + /** + * optional bytes baseKey = 2; + */ + public boolean hasBaseKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes baseKey = 2; + */ + public com.google.protobuf.ByteString getBaseKey() { + return baseKey_; + } + + // optional bytes ratchetKey = 3; + public static final int RATCHETKEY_FIELD_NUMBER = 3; + private com.google.protobuf.ByteString ratchetKey_; + /** + * optional bytes ratchetKey = 3; + */ + public boolean hasRatchetKey() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes ratchetKey = 3; + */ + public com.google.protobuf.ByteString getRatchetKey() { + return ratchetKey_; + } + + // optional bytes identityKey = 4; + public static final int IDENTITYKEY_FIELD_NUMBER = 4; + private com.google.protobuf.ByteString identityKey_; + /** + * optional bytes identityKey = 4; + */ + public boolean hasIdentityKey() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional bytes identityKey = 4; + */ + public com.google.protobuf.ByteString getIdentityKey() { + return identityKey_; + } + + // optional bytes baseKeySignature = 5; + public static final int BASEKEYSIGNATURE_FIELD_NUMBER = 5; + private com.google.protobuf.ByteString baseKeySignature_; + /** + * optional bytes baseKeySignature = 5; + */ + public boolean hasBaseKeySignature() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional bytes baseKeySignature = 5; + */ + public com.google.protobuf.ByteString getBaseKeySignature() { + return baseKeySignature_; + } + + private void initFields() { + id_ = 0; + baseKey_ = com.google.protobuf.ByteString.EMPTY; + ratchetKey_ = com.google.protobuf.ByteString.EMPTY; + identityKey_ = com.google.protobuf.ByteString.EMPTY; + baseKeySignature_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt32(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, baseKey_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(3, ratchetKey_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeBytes(4, identityKey_); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + output.writeBytes(5, baseKeySignature_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, baseKey_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, ratchetKey_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(4, identityKey_); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(5, baseKeySignature_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.libsignal.protocol.SignalProtos.KeyExchangeMessage parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.KeyExchangeMessage parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.KeyExchangeMessage parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.KeyExchangeMessage parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.KeyExchangeMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.KeyExchangeMessage parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.KeyExchangeMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.KeyExchangeMessage parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.KeyExchangeMessage parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.KeyExchangeMessage parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.libsignal.protocol.SignalProtos.KeyExchangeMessage prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code textsecure.KeyExchangeMessage} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.libsignal.protocol.SignalProtos.KeyExchangeMessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_KeyExchangeMessage_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_KeyExchangeMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.protocol.SignalProtos.KeyExchangeMessage.class, org.session.libsignal.libsignal.protocol.SignalProtos.KeyExchangeMessage.Builder.class); + } + + // Construct using org.session.libsignal.libsignal.protocol.SignalProtos.KeyExchangeMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + id_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + baseKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + ratchetKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000004); + identityKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000008); + baseKeySignature_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000010); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_KeyExchangeMessage_descriptor; + } + + public org.session.libsignal.libsignal.protocol.SignalProtos.KeyExchangeMessage getDefaultInstanceForType() { + return org.session.libsignal.libsignal.protocol.SignalProtos.KeyExchangeMessage.getDefaultInstance(); + } + + public org.session.libsignal.libsignal.protocol.SignalProtos.KeyExchangeMessage build() { + org.session.libsignal.libsignal.protocol.SignalProtos.KeyExchangeMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.libsignal.protocol.SignalProtos.KeyExchangeMessage buildPartial() { + org.session.libsignal.libsignal.protocol.SignalProtos.KeyExchangeMessage result = new org.session.libsignal.libsignal.protocol.SignalProtos.KeyExchangeMessage(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.id_ = id_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.baseKey_ = baseKey_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.ratchetKey_ = ratchetKey_; + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000008; + } + result.identityKey_ = identityKey_; + if (((from_bitField0_ & 0x00000010) == 0x00000010)) { + to_bitField0_ |= 0x00000010; + } + result.baseKeySignature_ = baseKeySignature_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.libsignal.protocol.SignalProtos.KeyExchangeMessage) { + return mergeFrom((org.session.libsignal.libsignal.protocol.SignalProtos.KeyExchangeMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.libsignal.protocol.SignalProtos.KeyExchangeMessage other) { + if (other == org.session.libsignal.libsignal.protocol.SignalProtos.KeyExchangeMessage.getDefaultInstance()) return this; + if (other.hasId()) { + setId(other.getId()); + } + if (other.hasBaseKey()) { + setBaseKey(other.getBaseKey()); + } + if (other.hasRatchetKey()) { + setRatchetKey(other.getRatchetKey()); + } + if (other.hasIdentityKey()) { + setIdentityKey(other.getIdentityKey()); + } + if (other.hasBaseKeySignature()) { + setBaseKeySignature(other.getBaseKeySignature()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.libsignal.protocol.SignalProtos.KeyExchangeMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.libsignal.protocol.SignalProtos.KeyExchangeMessage) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional uint32 id = 1; + private int id_ ; + /** + * optional uint32 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 id = 1; + */ + public int getId() { + return id_; + } + /** + * optional uint32 id = 1; + */ + public Builder setId(int value) { + bitField0_ |= 0x00000001; + id_ = value; + onChanged(); + return this; + } + /** + * optional uint32 id = 1; + */ + public Builder clearId() { + bitField0_ = (bitField0_ & ~0x00000001); + id_ = 0; + onChanged(); + return this; + } + + // optional bytes baseKey = 2; + private com.google.protobuf.ByteString baseKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes baseKey = 2; + */ + public boolean hasBaseKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes baseKey = 2; + */ + public com.google.protobuf.ByteString getBaseKey() { + return baseKey_; + } + /** + * optional bytes baseKey = 2; + */ + public Builder setBaseKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + baseKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes baseKey = 2; + */ + public Builder clearBaseKey() { + bitField0_ = (bitField0_ & ~0x00000002); + baseKey_ = getDefaultInstance().getBaseKey(); + onChanged(); + return this; + } + + // optional bytes ratchetKey = 3; + private com.google.protobuf.ByteString ratchetKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes ratchetKey = 3; + */ + public boolean hasRatchetKey() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes ratchetKey = 3; + */ + public com.google.protobuf.ByteString getRatchetKey() { + return ratchetKey_; + } + /** + * optional bytes ratchetKey = 3; + */ + public Builder setRatchetKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + ratchetKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes ratchetKey = 3; + */ + public Builder clearRatchetKey() { + bitField0_ = (bitField0_ & ~0x00000004); + ratchetKey_ = getDefaultInstance().getRatchetKey(); + onChanged(); + return this; + } + + // optional bytes identityKey = 4; + private com.google.protobuf.ByteString identityKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes identityKey = 4; + */ + public boolean hasIdentityKey() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional bytes identityKey = 4; + */ + public com.google.protobuf.ByteString getIdentityKey() { + return identityKey_; + } + /** + * optional bytes identityKey = 4; + */ + public Builder setIdentityKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + identityKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes identityKey = 4; + */ + public Builder clearIdentityKey() { + bitField0_ = (bitField0_ & ~0x00000008); + identityKey_ = getDefaultInstance().getIdentityKey(); + onChanged(); + return this; + } + + // optional bytes baseKeySignature = 5; + private com.google.protobuf.ByteString baseKeySignature_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes baseKeySignature = 5; + */ + public boolean hasBaseKeySignature() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional bytes baseKeySignature = 5; + */ + public com.google.protobuf.ByteString getBaseKeySignature() { + return baseKeySignature_; + } + /** + * optional bytes baseKeySignature = 5; + */ + public Builder setBaseKeySignature(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000010; + baseKeySignature_ = value; + onChanged(); + return this; + } + /** + * optional bytes baseKeySignature = 5; + */ + public Builder clearBaseKeySignature() { + bitField0_ = (bitField0_ & ~0x00000010); + baseKeySignature_ = getDefaultInstance().getBaseKeySignature(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:textsecure.KeyExchangeMessage) + } + + static { + defaultInstance = new KeyExchangeMessage(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:textsecure.KeyExchangeMessage) + } + + public interface SenderKeyMessageOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional uint32 id = 1; + /** + * optional uint32 id = 1; + */ + boolean hasId(); + /** + * optional uint32 id = 1; + */ + int getId(); + + // optional uint32 iteration = 2; + /** + * optional uint32 iteration = 2; + */ + boolean hasIteration(); + /** + * optional uint32 iteration = 2; + */ + int getIteration(); + + // optional bytes ciphertext = 3; + /** + * optional bytes ciphertext = 3; + */ + boolean hasCiphertext(); + /** + * optional bytes ciphertext = 3; + */ + com.google.protobuf.ByteString getCiphertext(); + } + /** + * Protobuf type {@code textsecure.SenderKeyMessage} + */ + public static final class SenderKeyMessage extends + com.google.protobuf.GeneratedMessage + implements SenderKeyMessageOrBuilder { + // Use SenderKeyMessage.newBuilder() to construct. + private SenderKeyMessage(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private SenderKeyMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final SenderKeyMessage defaultInstance; + public static SenderKeyMessage getDefaultInstance() { + return defaultInstance; + } + + public SenderKeyMessage getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private SenderKeyMessage( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + id_ = input.readUInt32(); + break; + } + case 16: { + bitField0_ |= 0x00000002; + iteration_ = input.readUInt32(); + break; + } + case 26: { + bitField0_ |= 0x00000004; + ciphertext_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_SenderKeyMessage_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_SenderKeyMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyMessage.class, org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyMessage.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public SenderKeyMessage parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new SenderKeyMessage(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional uint32 id = 1; + public static final int ID_FIELD_NUMBER = 1; + private int id_; + /** + * optional uint32 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 id = 1; + */ + public int getId() { + return id_; + } + + // optional uint32 iteration = 2; + public static final int ITERATION_FIELD_NUMBER = 2; + private int iteration_; + /** + * optional uint32 iteration = 2; + */ + public boolean hasIteration() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional uint32 iteration = 2; + */ + public int getIteration() { + return iteration_; + } + + // optional bytes ciphertext = 3; + public static final int CIPHERTEXT_FIELD_NUMBER = 3; + private com.google.protobuf.ByteString ciphertext_; + /** + * optional bytes ciphertext = 3; + */ + public boolean hasCiphertext() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes ciphertext = 3; + */ + public com.google.protobuf.ByteString getCiphertext() { + return ciphertext_; + } + + private void initFields() { + id_ = 0; + iteration_ = 0; + ciphertext_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt32(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeUInt32(2, iteration_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(3, ciphertext_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(2, iteration_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, ciphertext_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyMessage parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyMessage parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyMessage parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyMessage parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyMessage parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyMessage parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyMessage parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyMessage parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyMessage prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code textsecure.SenderKeyMessage} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyMessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_SenderKeyMessage_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_SenderKeyMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyMessage.class, org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyMessage.Builder.class); + } + + // Construct using org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + id_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + iteration_ = 0; + bitField0_ = (bitField0_ & ~0x00000002); + ciphertext_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_SenderKeyMessage_descriptor; + } + + public org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyMessage getDefaultInstanceForType() { + return org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyMessage.getDefaultInstance(); + } + + public org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyMessage build() { + org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyMessage buildPartial() { + org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyMessage result = new org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyMessage(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.id_ = id_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.iteration_ = iteration_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.ciphertext_ = ciphertext_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyMessage) { + return mergeFrom((org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyMessage other) { + if (other == org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyMessage.getDefaultInstance()) return this; + if (other.hasId()) { + setId(other.getId()); + } + if (other.hasIteration()) { + setIteration(other.getIteration()); + } + if (other.hasCiphertext()) { + setCiphertext(other.getCiphertext()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyMessage) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional uint32 id = 1; + private int id_ ; + /** + * optional uint32 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 id = 1; + */ + public int getId() { + return id_; + } + /** + * optional uint32 id = 1; + */ + public Builder setId(int value) { + bitField0_ |= 0x00000001; + id_ = value; + onChanged(); + return this; + } + /** + * optional uint32 id = 1; + */ + public Builder clearId() { + bitField0_ = (bitField0_ & ~0x00000001); + id_ = 0; + onChanged(); + return this; + } + + // optional uint32 iteration = 2; + private int iteration_ ; + /** + * optional uint32 iteration = 2; + */ + public boolean hasIteration() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional uint32 iteration = 2; + */ + public int getIteration() { + return iteration_; + } + /** + * optional uint32 iteration = 2; + */ + public Builder setIteration(int value) { + bitField0_ |= 0x00000002; + iteration_ = value; + onChanged(); + return this; + } + /** + * optional uint32 iteration = 2; + */ + public Builder clearIteration() { + bitField0_ = (bitField0_ & ~0x00000002); + iteration_ = 0; + onChanged(); + return this; + } + + // optional bytes ciphertext = 3; + private com.google.protobuf.ByteString ciphertext_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes ciphertext = 3; + */ + public boolean hasCiphertext() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes ciphertext = 3; + */ + public com.google.protobuf.ByteString getCiphertext() { + return ciphertext_; + } + /** + * optional bytes ciphertext = 3; + */ + public Builder setCiphertext(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + ciphertext_ = value; + onChanged(); + return this; + } + /** + * optional bytes ciphertext = 3; + */ + public Builder clearCiphertext() { + bitField0_ = (bitField0_ & ~0x00000004); + ciphertext_ = getDefaultInstance().getCiphertext(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:textsecure.SenderKeyMessage) + } + + static { + defaultInstance = new SenderKeyMessage(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:textsecure.SenderKeyMessage) + } + + public interface SenderKeyDistributionMessageOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional uint32 id = 1; + /** + * optional uint32 id = 1; + */ + boolean hasId(); + /** + * optional uint32 id = 1; + */ + int getId(); + + // optional uint32 iteration = 2; + /** + * optional uint32 iteration = 2; + */ + boolean hasIteration(); + /** + * optional uint32 iteration = 2; + */ + int getIteration(); + + // optional bytes chainKey = 3; + /** + * optional bytes chainKey = 3; + */ + boolean hasChainKey(); + /** + * optional bytes chainKey = 3; + */ + com.google.protobuf.ByteString getChainKey(); + + // optional bytes signingKey = 4; + /** + * optional bytes signingKey = 4; + */ + boolean hasSigningKey(); + /** + * optional bytes signingKey = 4; + */ + com.google.protobuf.ByteString getSigningKey(); + } + /** + * Protobuf type {@code textsecure.SenderKeyDistributionMessage} + */ + public static final class SenderKeyDistributionMessage extends + com.google.protobuf.GeneratedMessage + implements SenderKeyDistributionMessageOrBuilder { + // Use SenderKeyDistributionMessage.newBuilder() to construct. + private SenderKeyDistributionMessage(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private SenderKeyDistributionMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final SenderKeyDistributionMessage defaultInstance; + public static SenderKeyDistributionMessage getDefaultInstance() { + return defaultInstance; + } + + public SenderKeyDistributionMessage getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private SenderKeyDistributionMessage( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + id_ = input.readUInt32(); + break; + } + case 16: { + bitField0_ |= 0x00000002; + iteration_ = input.readUInt32(); + break; + } + case 26: { + bitField0_ |= 0x00000004; + chainKey_ = input.readBytes(); + break; + } + case 34: { + bitField0_ |= 0x00000008; + signingKey_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_SenderKeyDistributionMessage_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_SenderKeyDistributionMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyDistributionMessage.class, org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyDistributionMessage.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public SenderKeyDistributionMessage parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new SenderKeyDistributionMessage(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional uint32 id = 1; + public static final int ID_FIELD_NUMBER = 1; + private int id_; + /** + * optional uint32 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 id = 1; + */ + public int getId() { + return id_; + } + + // optional uint32 iteration = 2; + public static final int ITERATION_FIELD_NUMBER = 2; + private int iteration_; + /** + * optional uint32 iteration = 2; + */ + public boolean hasIteration() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional uint32 iteration = 2; + */ + public int getIteration() { + return iteration_; + } + + // optional bytes chainKey = 3; + public static final int CHAINKEY_FIELD_NUMBER = 3; + private com.google.protobuf.ByteString chainKey_; + /** + * optional bytes chainKey = 3; + */ + public boolean hasChainKey() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes chainKey = 3; + */ + public com.google.protobuf.ByteString getChainKey() { + return chainKey_; + } + + // optional bytes signingKey = 4; + public static final int SIGNINGKEY_FIELD_NUMBER = 4; + private com.google.protobuf.ByteString signingKey_; + /** + * optional bytes signingKey = 4; + */ + public boolean hasSigningKey() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional bytes signingKey = 4; + */ + public com.google.protobuf.ByteString getSigningKey() { + return signingKey_; + } + + private void initFields() { + id_ = 0; + iteration_ = 0; + chainKey_ = com.google.protobuf.ByteString.EMPTY; + signingKey_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt32(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeUInt32(2, iteration_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(3, chainKey_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeBytes(4, signingKey_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(2, iteration_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, chainKey_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(4, signingKey_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyDistributionMessage parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyDistributionMessage parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyDistributionMessage parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyDistributionMessage parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyDistributionMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyDistributionMessage parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyDistributionMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyDistributionMessage parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyDistributionMessage parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyDistributionMessage parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyDistributionMessage prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code textsecure.SenderKeyDistributionMessage} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyDistributionMessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_SenderKeyDistributionMessage_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_SenderKeyDistributionMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyDistributionMessage.class, org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyDistributionMessage.Builder.class); + } + + // Construct using org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyDistributionMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + id_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + iteration_ = 0; + bitField0_ = (bitField0_ & ~0x00000002); + chainKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000004); + signingKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_SenderKeyDistributionMessage_descriptor; + } + + public org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyDistributionMessage getDefaultInstanceForType() { + return org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyDistributionMessage.getDefaultInstance(); + } + + public org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyDistributionMessage build() { + org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyDistributionMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyDistributionMessage buildPartial() { + org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyDistributionMessage result = new org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyDistributionMessage(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.id_ = id_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.iteration_ = iteration_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.chainKey_ = chainKey_; + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000008; + } + result.signingKey_ = signingKey_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyDistributionMessage) { + return mergeFrom((org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyDistributionMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyDistributionMessage other) { + if (other == org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyDistributionMessage.getDefaultInstance()) return this; + if (other.hasId()) { + setId(other.getId()); + } + if (other.hasIteration()) { + setIteration(other.getIteration()); + } + if (other.hasChainKey()) { + setChainKey(other.getChainKey()); + } + if (other.hasSigningKey()) { + setSigningKey(other.getSigningKey()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyDistributionMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.libsignal.protocol.SignalProtos.SenderKeyDistributionMessage) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional uint32 id = 1; + private int id_ ; + /** + * optional uint32 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 id = 1; + */ + public int getId() { + return id_; + } + /** + * optional uint32 id = 1; + */ + public Builder setId(int value) { + bitField0_ |= 0x00000001; + id_ = value; + onChanged(); + return this; + } + /** + * optional uint32 id = 1; + */ + public Builder clearId() { + bitField0_ = (bitField0_ & ~0x00000001); + id_ = 0; + onChanged(); + return this; + } + + // optional uint32 iteration = 2; + private int iteration_ ; + /** + * optional uint32 iteration = 2; + */ + public boolean hasIteration() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional uint32 iteration = 2; + */ + public int getIteration() { + return iteration_; + } + /** + * optional uint32 iteration = 2; + */ + public Builder setIteration(int value) { + bitField0_ |= 0x00000002; + iteration_ = value; + onChanged(); + return this; + } + /** + * optional uint32 iteration = 2; + */ + public Builder clearIteration() { + bitField0_ = (bitField0_ & ~0x00000002); + iteration_ = 0; + onChanged(); + return this; + } + + // optional bytes chainKey = 3; + private com.google.protobuf.ByteString chainKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes chainKey = 3; + */ + public boolean hasChainKey() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes chainKey = 3; + */ + public com.google.protobuf.ByteString getChainKey() { + return chainKey_; + } + /** + * optional bytes chainKey = 3; + */ + public Builder setChainKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + chainKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes chainKey = 3; + */ + public Builder clearChainKey() { + bitField0_ = (bitField0_ & ~0x00000004); + chainKey_ = getDefaultInstance().getChainKey(); + onChanged(); + return this; + } + + // optional bytes signingKey = 4; + private com.google.protobuf.ByteString signingKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes signingKey = 4; + */ + public boolean hasSigningKey() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional bytes signingKey = 4; + */ + public com.google.protobuf.ByteString getSigningKey() { + return signingKey_; + } + /** + * optional bytes signingKey = 4; + */ + public Builder setSigningKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + signingKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes signingKey = 4; + */ + public Builder clearSigningKey() { + bitField0_ = (bitField0_ & ~0x00000008); + signingKey_ = getDefaultInstance().getSigningKey(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:textsecure.SenderKeyDistributionMessage) + } + + static { + defaultInstance = new SenderKeyDistributionMessage(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:textsecure.SenderKeyDistributionMessage) + } + + public interface DeviceConsistencyCodeMessageOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional uint32 generation = 1; + /** + * optional uint32 generation = 1; + */ + boolean hasGeneration(); + /** + * optional uint32 generation = 1; + */ + int getGeneration(); + + // optional bytes signature = 2; + /** + * optional bytes signature = 2; + */ + boolean hasSignature(); + /** + * optional bytes signature = 2; + */ + com.google.protobuf.ByteString getSignature(); + } + /** + * Protobuf type {@code textsecure.DeviceConsistencyCodeMessage} + */ + public static final class DeviceConsistencyCodeMessage extends + com.google.protobuf.GeneratedMessage + implements DeviceConsistencyCodeMessageOrBuilder { + // Use DeviceConsistencyCodeMessage.newBuilder() to construct. + private DeviceConsistencyCodeMessage(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private DeviceConsistencyCodeMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final DeviceConsistencyCodeMessage defaultInstance; + public static DeviceConsistencyCodeMessage getDefaultInstance() { + return defaultInstance; + } + + public DeviceConsistencyCodeMessage getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private DeviceConsistencyCodeMessage( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + generation_ = input.readUInt32(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + signature_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_DeviceConsistencyCodeMessage_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_DeviceConsistencyCodeMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.protocol.SignalProtos.DeviceConsistencyCodeMessage.class, org.session.libsignal.libsignal.protocol.SignalProtos.DeviceConsistencyCodeMessage.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public DeviceConsistencyCodeMessage parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new DeviceConsistencyCodeMessage(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional uint32 generation = 1; + public static final int GENERATION_FIELD_NUMBER = 1; + private int generation_; + /** + * optional uint32 generation = 1; + */ + public boolean hasGeneration() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 generation = 1; + */ + public int getGeneration() { + return generation_; + } + + // optional bytes signature = 2; + public static final int SIGNATURE_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString signature_; + /** + * optional bytes signature = 2; + */ + public boolean hasSignature() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes signature = 2; + */ + public com.google.protobuf.ByteString getSignature() { + return signature_; + } + + private void initFields() { + generation_ = 0; + signature_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt32(1, generation_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, signature_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, generation_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, signature_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.libsignal.protocol.SignalProtos.DeviceConsistencyCodeMessage parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.DeviceConsistencyCodeMessage parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.DeviceConsistencyCodeMessage parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.DeviceConsistencyCodeMessage parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.DeviceConsistencyCodeMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.DeviceConsistencyCodeMessage parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.DeviceConsistencyCodeMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.DeviceConsistencyCodeMessage parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.DeviceConsistencyCodeMessage parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.DeviceConsistencyCodeMessage parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.libsignal.protocol.SignalProtos.DeviceConsistencyCodeMessage prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code textsecure.DeviceConsistencyCodeMessage} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.libsignal.protocol.SignalProtos.DeviceConsistencyCodeMessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_DeviceConsistencyCodeMessage_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_DeviceConsistencyCodeMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.protocol.SignalProtos.DeviceConsistencyCodeMessage.class, org.session.libsignal.libsignal.protocol.SignalProtos.DeviceConsistencyCodeMessage.Builder.class); + } + + // Construct using org.session.libsignal.libsignal.protocol.SignalProtos.DeviceConsistencyCodeMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + generation_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + signature_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_DeviceConsistencyCodeMessage_descriptor; + } + + public org.session.libsignal.libsignal.protocol.SignalProtos.DeviceConsistencyCodeMessage getDefaultInstanceForType() { + return org.session.libsignal.libsignal.protocol.SignalProtos.DeviceConsistencyCodeMessage.getDefaultInstance(); + } + + public org.session.libsignal.libsignal.protocol.SignalProtos.DeviceConsistencyCodeMessage build() { + org.session.libsignal.libsignal.protocol.SignalProtos.DeviceConsistencyCodeMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.libsignal.protocol.SignalProtos.DeviceConsistencyCodeMessage buildPartial() { + org.session.libsignal.libsignal.protocol.SignalProtos.DeviceConsistencyCodeMessage result = new org.session.libsignal.libsignal.protocol.SignalProtos.DeviceConsistencyCodeMessage(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.generation_ = generation_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.signature_ = signature_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.libsignal.protocol.SignalProtos.DeviceConsistencyCodeMessage) { + return mergeFrom((org.session.libsignal.libsignal.protocol.SignalProtos.DeviceConsistencyCodeMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.libsignal.protocol.SignalProtos.DeviceConsistencyCodeMessage other) { + if (other == org.session.libsignal.libsignal.protocol.SignalProtos.DeviceConsistencyCodeMessage.getDefaultInstance()) return this; + if (other.hasGeneration()) { + setGeneration(other.getGeneration()); + } + if (other.hasSignature()) { + setSignature(other.getSignature()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.libsignal.protocol.SignalProtos.DeviceConsistencyCodeMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.libsignal.protocol.SignalProtos.DeviceConsistencyCodeMessage) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional uint32 generation = 1; + private int generation_ ; + /** + * optional uint32 generation = 1; + */ + public boolean hasGeneration() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 generation = 1; + */ + public int getGeneration() { + return generation_; + } + /** + * optional uint32 generation = 1; + */ + public Builder setGeneration(int value) { + bitField0_ |= 0x00000001; + generation_ = value; + onChanged(); + return this; + } + /** + * optional uint32 generation = 1; + */ + public Builder clearGeneration() { + bitField0_ = (bitField0_ & ~0x00000001); + generation_ = 0; + onChanged(); + return this; + } + + // optional bytes signature = 2; + private com.google.protobuf.ByteString signature_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes signature = 2; + */ + public boolean hasSignature() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes signature = 2; + */ + public com.google.protobuf.ByteString getSignature() { + return signature_; + } + /** + * optional bytes signature = 2; + */ + public Builder setSignature(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + signature_ = value; + onChanged(); + return this; + } + /** + * optional bytes signature = 2; + */ + public Builder clearSignature() { + bitField0_ = (bitField0_ & ~0x00000002); + signature_ = getDefaultInstance().getSignature(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:textsecure.DeviceConsistencyCodeMessage) + } + + static { + defaultInstance = new DeviceConsistencyCodeMessage(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:textsecure.DeviceConsistencyCodeMessage) + } + + public interface ClosedGroupCiphertextMessageOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional bytes ciphertext = 1; + /** + * optional bytes ciphertext = 1; + * + *
+     * @required
+     * 
+ */ + boolean hasCiphertext(); + /** + * optional bytes ciphertext = 1; + * + *
+     * @required
+     * 
+ */ + com.google.protobuf.ByteString getCiphertext(); + + // optional bytes senderPublicKey = 2; + /** + * optional bytes senderPublicKey = 2; + * + *
+     * @required
+     * 
+ */ + boolean hasSenderPublicKey(); + /** + * optional bytes senderPublicKey = 2; + * + *
+     * @required
+     * 
+ */ + com.google.protobuf.ByteString getSenderPublicKey(); + + // optional uint32 keyIndex = 3; + /** + * optional uint32 keyIndex = 3; + * + *
+     * @required
+     * 
+ */ + boolean hasKeyIndex(); + /** + * optional uint32 keyIndex = 3; + * + *
+     * @required
+     * 
+ */ + int getKeyIndex(); + } + /** + * Protobuf type {@code textsecure.ClosedGroupCiphertextMessage} + */ + public static final class ClosedGroupCiphertextMessage extends + com.google.protobuf.GeneratedMessage + implements ClosedGroupCiphertextMessageOrBuilder { + // Use ClosedGroupCiphertextMessage.newBuilder() to construct. + private ClosedGroupCiphertextMessage(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private ClosedGroupCiphertextMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final ClosedGroupCiphertextMessage defaultInstance; + public static ClosedGroupCiphertextMessage getDefaultInstance() { + return defaultInstance; + } + + public ClosedGroupCiphertextMessage getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private ClosedGroupCiphertextMessage( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + ciphertext_ = input.readBytes(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + senderPublicKey_ = input.readBytes(); + break; + } + case 24: { + bitField0_ |= 0x00000004; + keyIndex_ = input.readUInt32(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_ClosedGroupCiphertextMessage_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_ClosedGroupCiphertextMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.protocol.SignalProtos.ClosedGroupCiphertextMessage.class, org.session.libsignal.libsignal.protocol.SignalProtos.ClosedGroupCiphertextMessage.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public ClosedGroupCiphertextMessage parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new ClosedGroupCiphertextMessage(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional bytes ciphertext = 1; + public static final int CIPHERTEXT_FIELD_NUMBER = 1; + private com.google.protobuf.ByteString ciphertext_; + /** + * optional bytes ciphertext = 1; + * + *
+     * @required
+     * 
+ */ + public boolean hasCiphertext() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes ciphertext = 1; + * + *
+     * @required
+     * 
+ */ + public com.google.protobuf.ByteString getCiphertext() { + return ciphertext_; + } + + // optional bytes senderPublicKey = 2; + public static final int SENDERPUBLICKEY_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString senderPublicKey_; + /** + * optional bytes senderPublicKey = 2; + * + *
+     * @required
+     * 
+ */ + public boolean hasSenderPublicKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes senderPublicKey = 2; + * + *
+     * @required
+     * 
+ */ + public com.google.protobuf.ByteString getSenderPublicKey() { + return senderPublicKey_; + } + + // optional uint32 keyIndex = 3; + public static final int KEYINDEX_FIELD_NUMBER = 3; + private int keyIndex_; + /** + * optional uint32 keyIndex = 3; + * + *
+     * @required
+     * 
+ */ + public boolean hasKeyIndex() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional uint32 keyIndex = 3; + * + *
+     * @required
+     * 
+ */ + public int getKeyIndex() { + return keyIndex_; + } + + private void initFields() { + ciphertext_ = com.google.protobuf.ByteString.EMPTY; + senderPublicKey_ = com.google.protobuf.ByteString.EMPTY; + keyIndex_ = 0; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, ciphertext_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, senderPublicKey_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeUInt32(3, keyIndex_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, ciphertext_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, senderPublicKey_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(3, keyIndex_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.libsignal.protocol.SignalProtos.ClosedGroupCiphertextMessage parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.ClosedGroupCiphertextMessage parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.ClosedGroupCiphertextMessage parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.ClosedGroupCiphertextMessage parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.ClosedGroupCiphertextMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.ClosedGroupCiphertextMessage parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.ClosedGroupCiphertextMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.ClosedGroupCiphertextMessage parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.ClosedGroupCiphertextMessage parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.protocol.SignalProtos.ClosedGroupCiphertextMessage parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.libsignal.protocol.SignalProtos.ClosedGroupCiphertextMessage prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code textsecure.ClosedGroupCiphertextMessage} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.libsignal.protocol.SignalProtos.ClosedGroupCiphertextMessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_ClosedGroupCiphertextMessage_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_ClosedGroupCiphertextMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.protocol.SignalProtos.ClosedGroupCiphertextMessage.class, org.session.libsignal.libsignal.protocol.SignalProtos.ClosedGroupCiphertextMessage.Builder.class); + } + + // Construct using org.session.libsignal.libsignal.protocol.SignalProtos.ClosedGroupCiphertextMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + ciphertext_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + senderPublicKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + keyIndex_ = 0; + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.libsignal.protocol.SignalProtos.internal_static_textsecure_ClosedGroupCiphertextMessage_descriptor; + } + + public org.session.libsignal.libsignal.protocol.SignalProtos.ClosedGroupCiphertextMessage getDefaultInstanceForType() { + return org.session.libsignal.libsignal.protocol.SignalProtos.ClosedGroupCiphertextMessage.getDefaultInstance(); + } + + public org.session.libsignal.libsignal.protocol.SignalProtos.ClosedGroupCiphertextMessage build() { + org.session.libsignal.libsignal.protocol.SignalProtos.ClosedGroupCiphertextMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.libsignal.protocol.SignalProtos.ClosedGroupCiphertextMessage buildPartial() { + org.session.libsignal.libsignal.protocol.SignalProtos.ClosedGroupCiphertextMessage result = new org.session.libsignal.libsignal.protocol.SignalProtos.ClosedGroupCiphertextMessage(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.ciphertext_ = ciphertext_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.senderPublicKey_ = senderPublicKey_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.keyIndex_ = keyIndex_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.libsignal.protocol.SignalProtos.ClosedGroupCiphertextMessage) { + return mergeFrom((org.session.libsignal.libsignal.protocol.SignalProtos.ClosedGroupCiphertextMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.libsignal.protocol.SignalProtos.ClosedGroupCiphertextMessage other) { + if (other == org.session.libsignal.libsignal.protocol.SignalProtos.ClosedGroupCiphertextMessage.getDefaultInstance()) return this; + if (other.hasCiphertext()) { + setCiphertext(other.getCiphertext()); + } + if (other.hasSenderPublicKey()) { + setSenderPublicKey(other.getSenderPublicKey()); + } + if (other.hasKeyIndex()) { + setKeyIndex(other.getKeyIndex()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.libsignal.protocol.SignalProtos.ClosedGroupCiphertextMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.libsignal.protocol.SignalProtos.ClosedGroupCiphertextMessage) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional bytes ciphertext = 1; + private com.google.protobuf.ByteString ciphertext_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes ciphertext = 1; + * + *
+       * @required
+       * 
+ */ + public boolean hasCiphertext() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes ciphertext = 1; + * + *
+       * @required
+       * 
+ */ + public com.google.protobuf.ByteString getCiphertext() { + return ciphertext_; + } + /** + * optional bytes ciphertext = 1; + * + *
+       * @required
+       * 
+ */ + public Builder setCiphertext(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + ciphertext_ = value; + onChanged(); + return this; + } + /** + * optional bytes ciphertext = 1; + * + *
+       * @required
+       * 
+ */ + public Builder clearCiphertext() { + bitField0_ = (bitField0_ & ~0x00000001); + ciphertext_ = getDefaultInstance().getCiphertext(); + onChanged(); + return this; + } + + // optional bytes senderPublicKey = 2; + private com.google.protobuf.ByteString senderPublicKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes senderPublicKey = 2; + * + *
+       * @required
+       * 
+ */ + public boolean hasSenderPublicKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes senderPublicKey = 2; + * + *
+       * @required
+       * 
+ */ + public com.google.protobuf.ByteString getSenderPublicKey() { + return senderPublicKey_; + } + /** + * optional bytes senderPublicKey = 2; + * + *
+       * @required
+       * 
+ */ + public Builder setSenderPublicKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + senderPublicKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes senderPublicKey = 2; + * + *
+       * @required
+       * 
+ */ + public Builder clearSenderPublicKey() { + bitField0_ = (bitField0_ & ~0x00000002); + senderPublicKey_ = getDefaultInstance().getSenderPublicKey(); + onChanged(); + return this; + } + + // optional uint32 keyIndex = 3; + private int keyIndex_ ; + /** + * optional uint32 keyIndex = 3; + * + *
+       * @required
+       * 
+ */ + public boolean hasKeyIndex() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional uint32 keyIndex = 3; + * + *
+       * @required
+       * 
+ */ + public int getKeyIndex() { + return keyIndex_; + } + /** + * optional uint32 keyIndex = 3; + * + *
+       * @required
+       * 
+ */ + public Builder setKeyIndex(int value) { + bitField0_ |= 0x00000004; + keyIndex_ = value; + onChanged(); + return this; + } + /** + * optional uint32 keyIndex = 3; + * + *
+       * @required
+       * 
+ */ + public Builder clearKeyIndex() { + bitField0_ = (bitField0_ & ~0x00000004); + keyIndex_ = 0; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:textsecure.ClosedGroupCiphertextMessage) + } + + static { + defaultInstance = new ClosedGroupCiphertextMessage(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:textsecure.ClosedGroupCiphertextMessage) + } + + private static com.google.protobuf.Descriptors.Descriptor + internal_static_textsecure_SignalMessage_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_textsecure_SignalMessage_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_textsecure_PreKeySignalMessage_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_textsecure_PreKeySignalMessage_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_textsecure_KeyExchangeMessage_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_textsecure_KeyExchangeMessage_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_textsecure_SenderKeyMessage_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_textsecure_SenderKeyMessage_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_textsecure_SenderKeyDistributionMessage_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_textsecure_SenderKeyDistributionMessage_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_textsecure_DeviceConsistencyCodeMessage_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_textsecure_DeviceConsistencyCodeMessage_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_textsecure_ClosedGroupCiphertextMessage_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_textsecure_ClosedGroupCiphertextMessage_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + String[] descriptorData = { + "\n\031WhisperTextProtocol.proto\022\ntextsecure\"" + + "a\n\rSignalMessage\022\022\n\nratchetKey\030\001 \001(\014\022\017\n\007" + + "counter\030\002 \001(\r\022\027\n\017previousCounter\030\003 \001(\r\022\022" + + "\n\nciphertext\030\004 \001(\014\"\216\001\n\023PreKeySignalMessa" + + "ge\022\026\n\016registrationId\030\005 \001(\r\022\020\n\010preKeyId\030\001" + + " \001(\r\022\026\n\016signedPreKeyId\030\006 \001(\r\022\017\n\007baseKey\030" + + "\002 \001(\014\022\023\n\013identityKey\030\003 \001(\014\022\017\n\007message\030\004 " + + "\001(\014\"t\n\022KeyExchangeMessage\022\n\n\002id\030\001 \001(\r\022\017\n" + + "\007baseKey\030\002 \001(\014\022\022\n\nratchetKey\030\003 \001(\014\022\023\n\013id" + + "entityKey\030\004 \001(\014\022\030\n\020baseKeySignature\030\005 \001(", + "\014\"E\n\020SenderKeyMessage\022\n\n\002id\030\001 \001(\r\022\021\n\tite" + + "ration\030\002 \001(\r\022\022\n\nciphertext\030\003 \001(\014\"c\n\034Send" + + "erKeyDistributionMessage\022\n\n\002id\030\001 \001(\r\022\021\n\t" + + "iteration\030\002 \001(\r\022\020\n\010chainKey\030\003 \001(\014\022\022\n\nsig" + + "ningKey\030\004 \001(\014\"E\n\034DeviceConsistencyCodeMe" + + "ssage\022\022\n\ngeneration\030\001 \001(\r\022\021\n\tsignature\030\002" + + " \001(\014\"]\n\034ClosedGroupCiphertextMessage\022\022\n\n" + + "ciphertext\030\001 \001(\014\022\027\n\017senderPublicKey\030\002 \001(" + + "\014\022\020\n\010keyIndex\030\003 \001(\rB5\n%org.whispersystem" + + "s.libsignal.protocolB\014SignalProtos" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + internal_static_textsecure_SignalMessage_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_textsecure_SignalMessage_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_textsecure_SignalMessage_descriptor, + new String[] { "RatchetKey", "Counter", "PreviousCounter", "Ciphertext", }); + internal_static_textsecure_PreKeySignalMessage_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_textsecure_PreKeySignalMessage_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_textsecure_PreKeySignalMessage_descriptor, + new String[] { "RegistrationId", "PreKeyId", "SignedPreKeyId", "BaseKey", "IdentityKey", "Message", }); + internal_static_textsecure_KeyExchangeMessage_descriptor = + getDescriptor().getMessageTypes().get(2); + internal_static_textsecure_KeyExchangeMessage_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_textsecure_KeyExchangeMessage_descriptor, + new String[] { "Id", "BaseKey", "RatchetKey", "IdentityKey", "BaseKeySignature", }); + internal_static_textsecure_SenderKeyMessage_descriptor = + getDescriptor().getMessageTypes().get(3); + internal_static_textsecure_SenderKeyMessage_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_textsecure_SenderKeyMessage_descriptor, + new String[] { "Id", "Iteration", "Ciphertext", }); + internal_static_textsecure_SenderKeyDistributionMessage_descriptor = + getDescriptor().getMessageTypes().get(4); + internal_static_textsecure_SenderKeyDistributionMessage_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_textsecure_SenderKeyDistributionMessage_descriptor, + new String[] { "Id", "Iteration", "ChainKey", "SigningKey", }); + internal_static_textsecure_DeviceConsistencyCodeMessage_descriptor = + getDescriptor().getMessageTypes().get(5); + internal_static_textsecure_DeviceConsistencyCodeMessage_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_textsecure_DeviceConsistencyCodeMessage_descriptor, + new String[] { "Generation", "Signature", }); + internal_static_textsecure_ClosedGroupCiphertextMessage_descriptor = + getDescriptor().getMessageTypes().get(6); + internal_static_textsecure_ClosedGroupCiphertextMessage_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_textsecure_ClosedGroupCiphertextMessage_descriptor, + new String[] { "Ciphertext", "SenderPublicKey", "KeyIndex", }); + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/ratchet/AliceSignalProtocolParameters.java b/libsignal/src/main/java/org/session/libsignal/libsignal/ratchet/AliceSignalProtocolParameters.java new file mode 100644 index 000000000..7dad4c76c --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/ratchet/AliceSignalProtocolParameters.java @@ -0,0 +1,114 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.ratchet; + +import org.session.libsignal.libsignal.IdentityKey; +import org.session.libsignal.libsignal.IdentityKeyPair; +import org.session.libsignal.libsignal.ecc.ECKeyPair; +import org.session.libsignal.libsignal.ecc.ECPublicKey; +import org.session.libsignal.libsignal.util.guava.Optional; + +public class AliceSignalProtocolParameters { + + private final IdentityKeyPair ourIdentityKey; + private final ECKeyPair ourBaseKey; + + private final IdentityKey theirIdentityKey; + private final ECPublicKey theirSignedPreKey; + private final Optional theirOneTimePreKey; + private final ECPublicKey theirRatchetKey; + + private AliceSignalProtocolParameters(IdentityKeyPair ourIdentityKey, ECKeyPair ourBaseKey, + IdentityKey theirIdentityKey, ECPublicKey theirSignedPreKey, + ECPublicKey theirRatchetKey, Optional theirOneTimePreKey) + { + this.ourIdentityKey = ourIdentityKey; + this.ourBaseKey = ourBaseKey; + this.theirIdentityKey = theirIdentityKey; + this.theirSignedPreKey = theirSignedPreKey; + this.theirRatchetKey = theirRatchetKey; + this.theirOneTimePreKey = theirOneTimePreKey; + + if (ourIdentityKey == null || ourBaseKey == null || theirIdentityKey == null || + theirSignedPreKey == null || theirRatchetKey == null || theirOneTimePreKey == null) + { + throw new IllegalArgumentException("Null values!"); + } + } + + public IdentityKeyPair getOurIdentityKey() { + return ourIdentityKey; + } + + public ECKeyPair getOurBaseKey() { + return ourBaseKey; + } + + public IdentityKey getTheirIdentityKey() { + return theirIdentityKey; + } + + public ECPublicKey getTheirSignedPreKey() { + return theirSignedPreKey; + } + + public Optional getTheirOneTimePreKey() { + return theirOneTimePreKey; + } + + public static Builder newBuilder() { + return new Builder(); + } + + public ECPublicKey getTheirRatchetKey() { + return theirRatchetKey; + } + + public static class Builder { + private IdentityKeyPair ourIdentityKey; + private ECKeyPair ourBaseKey; + + private IdentityKey theirIdentityKey; + private ECPublicKey theirSignedPreKey; + private ECPublicKey theirRatchetKey; + private Optional theirOneTimePreKey; + + public Builder setOurIdentityKey(IdentityKeyPair ourIdentityKey) { + this.ourIdentityKey = ourIdentityKey; + return this; + } + + public Builder setOurBaseKey(ECKeyPair ourBaseKey) { + this.ourBaseKey = ourBaseKey; + return this; + } + + public Builder setTheirRatchetKey(ECPublicKey theirRatchetKey) { + this.theirRatchetKey = theirRatchetKey; + return this; + } + + public Builder setTheirIdentityKey(IdentityKey theirIdentityKey) { + this.theirIdentityKey = theirIdentityKey; + return this; + } + + public Builder setTheirSignedPreKey(ECPublicKey theirSignedPreKey) { + this.theirSignedPreKey = theirSignedPreKey; + return this; + } + + public Builder setTheirOneTimePreKey(Optional theirOneTimePreKey) { + this.theirOneTimePreKey = theirOneTimePreKey; + return this; + } + + public AliceSignalProtocolParameters create() { + return new AliceSignalProtocolParameters(ourIdentityKey, ourBaseKey, theirIdentityKey, + theirSignedPreKey, theirRatchetKey, theirOneTimePreKey); + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/ratchet/BobSignalProtocolParameters.java b/libsignal/src/main/java/org/session/libsignal/libsignal/ratchet/BobSignalProtocolParameters.java new file mode 100644 index 000000000..030a2f734 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/ratchet/BobSignalProtocolParameters.java @@ -0,0 +1,114 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.ratchet; + +import org.session.libsignal.libsignal.IdentityKey; +import org.session.libsignal.libsignal.IdentityKeyPair; +import org.session.libsignal.libsignal.ecc.ECKeyPair; +import org.session.libsignal.libsignal.ecc.ECPublicKey; +import org.session.libsignal.libsignal.util.guava.Optional; + +public class BobSignalProtocolParameters { + + private final IdentityKeyPair ourIdentityKey; + private final ECKeyPair ourSignedPreKey; + private final Optional ourOneTimePreKey; + private final ECKeyPair ourRatchetKey; + + private final IdentityKey theirIdentityKey; + private final ECPublicKey theirBaseKey; + + BobSignalProtocolParameters(IdentityKeyPair ourIdentityKey, ECKeyPair ourSignedPreKey, + ECKeyPair ourRatchetKey, Optional ourOneTimePreKey, + IdentityKey theirIdentityKey, ECPublicKey theirBaseKey) + { + this.ourIdentityKey = ourIdentityKey; + this.ourSignedPreKey = ourSignedPreKey; + this.ourRatchetKey = ourRatchetKey; + this.ourOneTimePreKey = ourOneTimePreKey; + this.theirIdentityKey = theirIdentityKey; + this.theirBaseKey = theirBaseKey; + + if (ourIdentityKey == null || ourSignedPreKey == null || ourRatchetKey == null || + ourOneTimePreKey == null || theirIdentityKey == null || theirBaseKey == null) + { + throw new IllegalArgumentException("Null value!"); + } + } + + public IdentityKeyPair getOurIdentityKey() { + return ourIdentityKey; + } + + public ECKeyPair getOurSignedPreKey() { + return ourSignedPreKey; + } + + public Optional getOurOneTimePreKey() { + return ourOneTimePreKey; + } + + public IdentityKey getTheirIdentityKey() { + return theirIdentityKey; + } + + public ECPublicKey getTheirBaseKey() { + return theirBaseKey; + } + + public static Builder newBuilder() { + return new Builder(); + } + + public ECKeyPair getOurRatchetKey() { + return ourRatchetKey; + } + + public static class Builder { + private IdentityKeyPair ourIdentityKey; + private ECKeyPair ourSignedPreKey; + private Optional ourOneTimePreKey; + private ECKeyPair ourRatchetKey; + + private IdentityKey theirIdentityKey; + private ECPublicKey theirBaseKey; + + public Builder setOurIdentityKey(IdentityKeyPair ourIdentityKey) { + this.ourIdentityKey = ourIdentityKey; + return this; + } + + public Builder setOurSignedPreKey(ECKeyPair ourSignedPreKey) { + this.ourSignedPreKey = ourSignedPreKey; + return this; + } + + public Builder setOurOneTimePreKey(Optional ourOneTimePreKey) { + this.ourOneTimePreKey = ourOneTimePreKey; + return this; + } + + public Builder setTheirIdentityKey(IdentityKey theirIdentityKey) { + this.theirIdentityKey = theirIdentityKey; + return this; + } + + public Builder setTheirBaseKey(ECPublicKey theirBaseKey) { + this.theirBaseKey = theirBaseKey; + return this; + } + + public Builder setOurRatchetKey(ECKeyPair ourRatchetKey) { + this.ourRatchetKey = ourRatchetKey; + return this; + } + + public BobSignalProtocolParameters create() { + return new BobSignalProtocolParameters(ourIdentityKey, ourSignedPreKey, ourRatchetKey, + ourOneTimePreKey, theirIdentityKey, theirBaseKey); + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/ratchet/ChainKey.java b/libsignal/src/main/java/org/session/libsignal/libsignal/ratchet/ChainKey.java new file mode 100644 index 000000000..e5204f40c --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/ratchet/ChainKey.java @@ -0,0 +1,67 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.ratchet; + + +import org.session.libsignal.libsignal.kdf.DerivedMessageSecrets; +import org.session.libsignal.libsignal.kdf.HKDF; +import org.session.libsignal.libsignal.ratchet.MessageKeys; + +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; + +public class ChainKey { + + private static final byte[] MESSAGE_KEY_SEED = {0x01}; + private static final byte[] CHAIN_KEY_SEED = {0x02}; + + private final HKDF kdf; + private final byte[] key; + private final int index; + + public ChainKey(HKDF kdf, byte[] key, int index) { + this.kdf = kdf; + this.key = key; + this.index = index; + } + + public byte[] getKey() { + return key; + } + + public int getIndex() { + return index; + } + + public ChainKey getNextChainKey() { + byte[] nextKey = getBaseMaterial(CHAIN_KEY_SEED); + return new ChainKey(kdf, nextKey, index + 1); + } + + public MessageKeys getMessageKeys() { + byte[] inputKeyMaterial = getBaseMaterial(MESSAGE_KEY_SEED); + byte[] keyMaterialBytes = kdf.deriveSecrets(inputKeyMaterial, "WhisperMessageKeys".getBytes(), DerivedMessageSecrets.SIZE); + DerivedMessageSecrets keyMaterial = new DerivedMessageSecrets(keyMaterialBytes); + + return new MessageKeys(keyMaterial.getCipherKey(), keyMaterial.getMacKey(), keyMaterial.getIv(), index); + } + + private byte[] getBaseMaterial(byte[] seed) { + try { + Mac mac = Mac.getInstance("HmacSHA256"); + mac.init(new SecretKeySpec(key, "HmacSHA256")); + + return mac.doFinal(seed); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (InvalidKeyException e) { + throw new AssertionError(e); + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/ratchet/MessageKeys.java b/libsignal/src/main/java/org/session/libsignal/libsignal/ratchet/MessageKeys.java new file mode 100644 index 000000000..cbe2d8030 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/ratchet/MessageKeys.java @@ -0,0 +1,40 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.ratchet; + +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +public class MessageKeys { + + private final SecretKeySpec cipherKey; + private final SecretKeySpec macKey; + private final IvParameterSpec iv; + private final int counter; + + public MessageKeys(SecretKeySpec cipherKey, SecretKeySpec macKey, IvParameterSpec iv, int counter) { + this.cipherKey = cipherKey; + this.macKey = macKey; + this.iv = iv; + this.counter = counter; + } + + public SecretKeySpec getCipherKey() { + return cipherKey; + } + + public SecretKeySpec getMacKey() { + return macKey; + } + + public IvParameterSpec getIv() { + return iv; + } + + public int getCounter() { + return counter; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/ratchet/RatchetingSession.java b/libsignal/src/main/java/org/session/libsignal/libsignal/ratchet/RatchetingSession.java new file mode 100644 index 000000000..8eaa1abd5 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/ratchet/RatchetingSession.java @@ -0,0 +1,163 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.ratchet; + +import org.session.libsignal.libsignal.InvalidKeyException; +import org.session.libsignal.libsignal.ecc.Curve; +import org.session.libsignal.libsignal.ecc.ECKeyPair; +import org.session.libsignal.libsignal.ecc.ECPublicKey; +import org.session.libsignal.libsignal.kdf.HKDF; +import org.session.libsignal.libsignal.kdf.HKDFv3; +import org.session.libsignal.libsignal.protocol.CiphertextMessage; +import org.session.libsignal.libsignal.ratchet.AliceSignalProtocolParameters; +import org.session.libsignal.libsignal.ratchet.BobSignalProtocolParameters; +import org.session.libsignal.libsignal.ratchet.SymmetricSignalProtocolParameters; +import org.session.libsignal.libsignal.state.SessionState; +import org.session.libsignal.libsignal.util.ByteUtil; +import org.session.libsignal.libsignal.util.Pair; +import org.session.libsignal.libsignal.util.guava.Optional; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Arrays; + +public class RatchetingSession { + + public static void initializeSession(SessionState sessionState, SymmetricSignalProtocolParameters parameters) + throws InvalidKeyException + { + if (isAlice(parameters.getOurBaseKey().getPublicKey(), parameters.getTheirBaseKey())) { + AliceSignalProtocolParameters.Builder aliceParameters = AliceSignalProtocolParameters.newBuilder(); + + aliceParameters.setOurBaseKey(parameters.getOurBaseKey()) + .setOurIdentityKey(parameters.getOurIdentityKey()) + .setTheirRatchetKey(parameters.getTheirRatchetKey()) + .setTheirIdentityKey(parameters.getTheirIdentityKey()) + .setTheirSignedPreKey(parameters.getTheirBaseKey()) + .setTheirOneTimePreKey(Optional.absent()); + + RatchetingSession.initializeSession(sessionState, aliceParameters.create()); + } else { + BobSignalProtocolParameters.Builder bobParameters = BobSignalProtocolParameters.newBuilder(); + + bobParameters.setOurIdentityKey(parameters.getOurIdentityKey()) + .setOurRatchetKey(parameters.getOurRatchetKey()) + .setOurSignedPreKey(parameters.getOurBaseKey()) + .setOurOneTimePreKey(Optional.absent()) + .setTheirBaseKey(parameters.getTheirBaseKey()) + .setTheirIdentityKey(parameters.getTheirIdentityKey()); + + RatchetingSession.initializeSession(sessionState, bobParameters.create()); + } + } + + public static void initializeSession(SessionState sessionState, AliceSignalProtocolParameters parameters) + throws InvalidKeyException + { + try { + sessionState.setSessionVersion(CiphertextMessage.CURRENT_VERSION); + sessionState.setRemoteIdentityKey(parameters.getTheirIdentityKey()); + sessionState.setLocalIdentityKey(parameters.getOurIdentityKey().getPublicKey()); + + ECKeyPair sendingRatchetKey = Curve.generateKeyPair(); + ByteArrayOutputStream secrets = new ByteArrayOutputStream(); + + secrets.write(getDiscontinuityBytes()); + + secrets.write(Curve.calculateAgreement(parameters.getTheirSignedPreKey(), + parameters.getOurIdentityKey().getPrivateKey())); + secrets.write(Curve.calculateAgreement(parameters.getTheirIdentityKey().getPublicKey(), + parameters.getOurBaseKey().getPrivateKey())); + secrets.write(Curve.calculateAgreement(parameters.getTheirSignedPreKey(), + parameters.getOurBaseKey().getPrivateKey())); + + if (parameters.getTheirOneTimePreKey().isPresent()) { + secrets.write(Curve.calculateAgreement(parameters.getTheirOneTimePreKey().get(), + parameters.getOurBaseKey().getPrivateKey())); + } + + DerivedKeys derivedKeys = calculateDerivedKeys(secrets.toByteArray()); + Pair sendingChain = derivedKeys.getRootKey().createChain(parameters.getTheirRatchetKey(), sendingRatchetKey); + + sessionState.addReceiverChain(parameters.getTheirRatchetKey(), derivedKeys.getChainKey()); + sessionState.setSenderChain(sendingRatchetKey, sendingChain.second()); + sessionState.setRootKey(sendingChain.first()); + } catch (IOException e) { + throw new AssertionError(e); + } + } + + public static void initializeSession(SessionState sessionState, BobSignalProtocolParameters parameters) + throws InvalidKeyException + { + + try { + sessionState.setSessionVersion(CiphertextMessage.CURRENT_VERSION); + sessionState.setRemoteIdentityKey(parameters.getTheirIdentityKey()); + sessionState.setLocalIdentityKey(parameters.getOurIdentityKey().getPublicKey()); + + ByteArrayOutputStream secrets = new ByteArrayOutputStream(); + + secrets.write(getDiscontinuityBytes()); + + secrets.write(Curve.calculateAgreement(parameters.getTheirIdentityKey().getPublicKey(), + parameters.getOurSignedPreKey().getPrivateKey())); + secrets.write(Curve.calculateAgreement(parameters.getTheirBaseKey(), + parameters.getOurIdentityKey().getPrivateKey())); + secrets.write(Curve.calculateAgreement(parameters.getTheirBaseKey(), + parameters.getOurSignedPreKey().getPrivateKey())); + + if (parameters.getOurOneTimePreKey().isPresent()) { + secrets.write(Curve.calculateAgreement(parameters.getTheirBaseKey(), + parameters.getOurOneTimePreKey().get().getPrivateKey())); + } + + DerivedKeys derivedKeys = calculateDerivedKeys(secrets.toByteArray()); + + sessionState.setSenderChain(parameters.getOurRatchetKey(), derivedKeys.getChainKey()); + sessionState.setRootKey(derivedKeys.getRootKey()); + } catch (IOException e) { + throw new AssertionError(e); + } + } + + private static byte[] getDiscontinuityBytes() { + byte[] discontinuity = new byte[32]; + Arrays.fill(discontinuity, (byte) 0xFF); + return discontinuity; + } + + private static DerivedKeys calculateDerivedKeys(byte[] masterSecret) { + HKDF kdf = new HKDFv3(); + byte[] derivedSecretBytes = kdf.deriveSecrets(masterSecret, "WhisperText".getBytes(), 64); + byte[][] derivedSecrets = ByteUtil.split(derivedSecretBytes, 32, 32); + + return new DerivedKeys(new RootKey(kdf, derivedSecrets[0]), + new ChainKey(kdf, derivedSecrets[1], 0)); + } + + private static boolean isAlice(ECPublicKey ourKey, ECPublicKey theirKey) { + return ourKey.compareTo(theirKey) < 0; + } + + private static class DerivedKeys { + private final RootKey rootKey; + private final ChainKey chainKey; + + private DerivedKeys(RootKey rootKey, ChainKey chainKey) { + this.rootKey = rootKey; + this.chainKey = chainKey; + } + + public RootKey getRootKey() { + return rootKey; + } + + public ChainKey getChainKey() { + return chainKey; + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/ratchet/RootKey.java b/libsignal/src/main/java/org/session/libsignal/libsignal/ratchet/RootKey.java new file mode 100644 index 000000000..cc88605cb --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/ratchet/RootKey.java @@ -0,0 +1,44 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.ratchet; + +import org.session.libsignal.libsignal.InvalidKeyException; +import org.session.libsignal.libsignal.ecc.Curve; +import org.session.libsignal.libsignal.ecc.ECKeyPair; +import org.session.libsignal.libsignal.ecc.ECPublicKey; +import org.session.libsignal.libsignal.kdf.DerivedRootSecrets; +import org.session.libsignal.libsignal.kdf.HKDF; +import org.session.libsignal.libsignal.ratchet.ChainKey; +import org.session.libsignal.libsignal.util.ByteUtil; +import org.session.libsignal.libsignal.util.Pair; + +public class RootKey { + + private final HKDF kdf; + private final byte[] key; + + public RootKey(HKDF kdf, byte[] key) { + this.kdf = kdf; + this.key = key; + } + + public byte[] getKeyBytes() { + return key; + } + + public Pair createChain(ECPublicKey theirRatchetKey, ECKeyPair ourRatchetKey) + throws InvalidKeyException + { + byte[] sharedSecret = Curve.calculateAgreement(theirRatchetKey, ourRatchetKey.getPrivateKey()); + byte[] derivedSecretBytes = kdf.deriveSecrets(sharedSecret, key, "WhisperRatchet".getBytes(), DerivedRootSecrets.SIZE); + DerivedRootSecrets derivedSecrets = new DerivedRootSecrets(derivedSecretBytes); + + RootKey newRootKey = new RootKey(kdf, derivedSecrets.getRootKey()); + ChainKey newChainKey = new ChainKey(kdf, derivedSecrets.getChainKey(), 0); + + return new Pair(newRootKey, newChainKey); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/ratchet/SymmetricSignalProtocolParameters.java b/libsignal/src/main/java/org/session/libsignal/libsignal/ratchet/SymmetricSignalProtocolParameters.java new file mode 100644 index 000000000..11397af1a --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/ratchet/SymmetricSignalProtocolParameters.java @@ -0,0 +1,113 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.ratchet; + +import org.session.libsignal.libsignal.IdentityKey; +import org.session.libsignal.libsignal.IdentityKeyPair; +import org.session.libsignal.libsignal.ecc.ECKeyPair; +import org.session.libsignal.libsignal.ecc.ECPublicKey; + +public class SymmetricSignalProtocolParameters { + + private final ECKeyPair ourBaseKey; + private final ECKeyPair ourRatchetKey; + private final IdentityKeyPair ourIdentityKey; + + private final ECPublicKey theirBaseKey; + private final ECPublicKey theirRatchetKey; + private final IdentityKey theirIdentityKey; + + SymmetricSignalProtocolParameters(ECKeyPair ourBaseKey, ECKeyPair ourRatchetKey, + IdentityKeyPair ourIdentityKey, ECPublicKey theirBaseKey, + ECPublicKey theirRatchetKey, IdentityKey theirIdentityKey) + { + this.ourBaseKey = ourBaseKey; + this.ourRatchetKey = ourRatchetKey; + this.ourIdentityKey = ourIdentityKey; + this.theirBaseKey = theirBaseKey; + this.theirRatchetKey = theirRatchetKey; + this.theirIdentityKey = theirIdentityKey; + + if (ourBaseKey == null || ourRatchetKey == null || ourIdentityKey == null || + theirBaseKey == null || theirRatchetKey == null || theirIdentityKey == null) + { + throw new IllegalArgumentException("Null values!"); + } + } + + public ECKeyPair getOurBaseKey() { + return ourBaseKey; + } + + public ECKeyPair getOurRatchetKey() { + return ourRatchetKey; + } + + public IdentityKeyPair getOurIdentityKey() { + return ourIdentityKey; + } + + public ECPublicKey getTheirBaseKey() { + return theirBaseKey; + } + + public ECPublicKey getTheirRatchetKey() { + return theirRatchetKey; + } + + public IdentityKey getTheirIdentityKey() { + return theirIdentityKey; + } + + public static Builder newBuilder() { + return new Builder(); + } + + public static class Builder { + private ECKeyPair ourBaseKey; + private ECKeyPair ourRatchetKey; + private IdentityKeyPair ourIdentityKey; + + private ECPublicKey theirBaseKey; + private ECPublicKey theirRatchetKey; + private IdentityKey theirIdentityKey; + + public Builder setOurBaseKey(ECKeyPair ourBaseKey) { + this.ourBaseKey = ourBaseKey; + return this; + } + + public Builder setOurRatchetKey(ECKeyPair ourRatchetKey) { + this.ourRatchetKey = ourRatchetKey; + return this; + } + + public Builder setOurIdentityKey(IdentityKeyPair ourIdentityKey) { + this.ourIdentityKey = ourIdentityKey; + return this; + } + + public Builder setTheirBaseKey(ECPublicKey theirBaseKey) { + this.theirBaseKey = theirBaseKey; + return this; + } + + public Builder setTheirRatchetKey(ECPublicKey theirRatchetKey) { + this.theirRatchetKey = theirRatchetKey; + return this; + } + + public Builder setTheirIdentityKey(IdentityKey theirIdentityKey) { + this.theirIdentityKey = theirIdentityKey; + return this; + } + + public SymmetricSignalProtocolParameters create() { + return new SymmetricSignalProtocolParameters(ourBaseKey, ourRatchetKey, ourIdentityKey, + theirBaseKey, theirRatchetKey, theirIdentityKey); + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/state/IdentityKeyStore.java b/libsignal/src/main/java/org/session/libsignal/libsignal/state/IdentityKeyStore.java new file mode 100644 index 000000000..2444842ef --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/state/IdentityKeyStore.java @@ -0,0 +1,82 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.state; + +import org.session.libsignal.libsignal.IdentityKey; +import org.session.libsignal.libsignal.IdentityKeyPair; +import org.session.libsignal.libsignal.SignalProtocolAddress; + +/** + * Provides an interface to identity information. + * + * @author Moxie Marlinspike + */ +public interface IdentityKeyStore { + + public enum Direction { + SENDING, RECEIVING + } + + /** + * Get the local client's identity key pair. + * + * @return The local client's persistent identity key pair. + */ + public IdentityKeyPair getIdentityKeyPair(); + + /** + * Return the local client's registration ID. + *

+ * Clients should maintain a registration ID, a random number + * between 1 and 16380 that's generated once at install time. + * + * @return the local client's registration ID. + */ + public int getLocalRegistrationId(); + + /** + * Save a remote client's identity key + *

+ * Store a remote client's identity key as trusted. + * + * @param address The address of the remote client. + * @param identityKey The remote client's identity key. + * @return True if the identity key replaces a previous identity, false if not + */ + public boolean saveIdentity(SignalProtocolAddress address, IdentityKey identityKey); + + + /** + * Verify a remote client's identity key. + *

+ * Determine whether a remote client's identity is trusted. Convention is + * that the Signal Protocol is 'trust on first use.' This means that + * an identity key is considered 'trusted' if there is no entry for the recipient + * in the local store, or if it matches the saved key for a recipient in the local + * store. Only if it mismatches an entry in the local store is it considered + * 'untrusted.' + * + * Clients may wish to make a distinction as to how keys are trusted based on the + * direction of travel. For instance, clients may wish to accept all 'incoming' identity + * key changes, while only blocking identity key changes when sending a message. + * + * @param address The address of the remote client. + * @param identityKey The identity key to verify. + * @param direction The direction (sending or receiving) this identity is being used for. + * @return true if trusted, false if untrusted. + */ + public boolean isTrustedIdentity(SignalProtocolAddress address, IdentityKey identityKey, Direction direction); + + + /** + * Return the saved public identity key for a remote client + * + * @param address The address of the remote client + * @return The public identity key, or null if absent + */ + public IdentityKey getIdentity(SignalProtocolAddress address); + +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/state/PreKeyBundle.java b/libsignal/src/main/java/org/session/libsignal/libsignal/state/PreKeyBundle.java new file mode 100644 index 000000000..bc12d58d5 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/state/PreKeyBundle.java @@ -0,0 +1,101 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.state; + +import org.session.libsignal.libsignal.IdentityKey; +import org.session.libsignal.libsignal.ecc.ECPublicKey; + +/** + * A class that contains a remote PreKey and collection + * of associated items. + * + * @author Moxie Marlinspike + */ +public class PreKeyBundle { + + private int registrationId; + + private int deviceId; + + private int preKeyId; + private ECPublicKey preKeyPublic; + + private int signedPreKeyId; + private ECPublicKey signedPreKeyPublic; + private byte[] signedPreKeySignature; + + private IdentityKey identityKey; + + public PreKeyBundle(int registrationId, int deviceId, int preKeyId, ECPublicKey preKeyPublic, + int signedPreKeyId, ECPublicKey signedPreKeyPublic, byte[] signedPreKeySignature, + IdentityKey identityKey) + { + this.registrationId = registrationId; + this.deviceId = deviceId; + this.preKeyId = preKeyId; + this.preKeyPublic = preKeyPublic; + this.signedPreKeyId = signedPreKeyId; + this.signedPreKeyPublic = signedPreKeyPublic; + this.signedPreKeySignature = signedPreKeySignature; + this.identityKey = identityKey; + } + + /** + * @return the device ID this PreKey belongs to. + */ + public int getDeviceId() { + return deviceId; + } + + /** + * @return the unique key ID for this PreKey. + */ + public int getPreKeyId() { + return preKeyId; + } + + /** + * @return the public key for this PreKey. + */ + public ECPublicKey getPreKey() { + return preKeyPublic; + } + + /** + * @return the unique key ID for this signed prekey. + */ + public int getSignedPreKeyId() { + return signedPreKeyId; + } + + /** + * @return the signed prekey for this PreKeyBundle. + */ + public ECPublicKey getSignedPreKey() { + return signedPreKeyPublic; + } + + /** + * @return the signature over the signed prekey. + */ + public byte[] getSignedPreKeySignature() { + return signedPreKeySignature; + } + + /** + * @return the {@link IdentityKey} of this PreKeys owner. + */ + public IdentityKey getIdentityKey() { + return identityKey; + } + + /** + * @return the registration ID associated with this PreKey. + */ + public int getRegistrationId() { + return registrationId; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/state/PreKeyRecord.java b/libsignal/src/main/java/org/session/libsignal/libsignal/state/PreKeyRecord.java new file mode 100644 index 000000000..c5706f948 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/state/PreKeyRecord.java @@ -0,0 +1,56 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.state; + +import com.google.protobuf.ByteString; + +import org.session.libsignal.libsignal.InvalidKeyException; +import org.session.libsignal.libsignal.ecc.Curve; +import org.session.libsignal.libsignal.ecc.ECKeyPair; +import org.session.libsignal.libsignal.ecc.ECPrivateKey; +import org.session.libsignal.libsignal.ecc.ECPublicKey; + +import java.io.IOException; + +import static org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructure; + +public class PreKeyRecord { + + private PreKeyRecordStructure structure; + + public PreKeyRecord(int id, ECKeyPair keyPair) { + this.structure = PreKeyRecordStructure.newBuilder() + .setId(id) + .setPublicKey(ByteString.copyFrom(keyPair.getPublicKey() + .serialize())) + .setPrivateKey(ByteString.copyFrom(keyPair.getPrivateKey() + .serialize())) + .build(); + } + + public PreKeyRecord(byte[] serialized) throws IOException { + this.structure = PreKeyRecordStructure.parseFrom(serialized); + } + + public int getId() { + return this.structure.getId(); + } + + public ECKeyPair getKeyPair() { + try { + ECPublicKey publicKey = Curve.decodePoint(this.structure.getPublicKey().toByteArray(), 0); + ECPrivateKey privateKey = Curve.decodePrivatePoint(this.structure.getPrivateKey().toByteArray()); + + return new ECKeyPair(publicKey, privateKey); + } catch (InvalidKeyException e) { + throw new AssertionError(e); + } + } + + public byte[] serialize() { + return this.structure.toByteArray(); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/state/PreKeyStore.java b/libsignal/src/main/java/org/session/libsignal/libsignal/state/PreKeyStore.java new file mode 100644 index 000000000..e7969571d --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/state/PreKeyStore.java @@ -0,0 +1,48 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.state; + +import org.session.libsignal.libsignal.InvalidKeyIdException; +import org.session.libsignal.libsignal.state.PreKeyRecord; + +/** + * An interface describing the local storage of {@link PreKeyRecord}s. + * + * @author Moxie Marlinspike + */ +public interface PreKeyStore { + + /** + * Load a local PreKeyRecord. + * + * @param preKeyId the ID of the local PreKeyRecord. + * @return the corresponding PreKeyRecord. + * @throws InvalidKeyIdException when there is no corresponding PreKeyRecord. + */ + public PreKeyRecord loadPreKey(int preKeyId) throws InvalidKeyIdException; + + /** + * Store a local PreKeyRecord. + * + * @param preKeyId the ID of the PreKeyRecord to store. + * @param record the PreKeyRecord. + */ + public void storePreKey(int preKeyId, PreKeyRecord record); + + /** + * @param preKeyId A PreKeyRecord ID. + * @return true if the store has a record for the preKeyId, otherwise false. + */ + public boolean containsPreKey(int preKeyId); + + /** + * Delete a PreKeyRecord from local storage. + * + * @param preKeyId The ID of the PreKeyRecord to remove. + */ + public void removePreKey(int preKeyId); + +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/state/SessionRecord.java b/libsignal/src/main/java/org/session/libsignal/libsignal/state/SessionRecord.java new file mode 100644 index 000000000..df1d0ff25 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/state/SessionRecord.java @@ -0,0 +1,125 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.state; + +import java.io.IOException; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +import static org.session.libsignal.libsignal.state.StorageProtos.RecordStructure; +import static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure; + +/** + * A SessionRecord encapsulates the state of an ongoing session. + * + * @author Moxie Marlinspike + */ +public class SessionRecord { + + private static final int ARCHIVED_STATES_MAX_LENGTH = 40; + + private SessionState sessionState = new SessionState(); + private LinkedList previousStates = new LinkedList(); + private boolean fresh = false; + + public SessionRecord() { + this.fresh = true; + } + + public SessionRecord(SessionState sessionState) { + this.sessionState = sessionState; + this.fresh = false; + } + + public SessionRecord(byte[] serialized) throws IOException { + RecordStructure record = RecordStructure.parseFrom(serialized); + this.sessionState = new SessionState(record.getCurrentSession()); + this.fresh = false; + + for (SessionStructure previousStructure : record.getPreviousSessionsList()) { + previousStates.add(new SessionState(previousStructure)); + } + } + + public boolean hasSessionState(int version, byte[] aliceBaseKey) { + if (sessionState.getSessionVersion() == version && + Arrays.equals(aliceBaseKey, sessionState.getAliceBaseKey())) + { + return true; + } + + for (SessionState state : previousStates) { + if (state.getSessionVersion() == version && + Arrays.equals(aliceBaseKey, state.getAliceBaseKey())) + { + return true; + } + } + + return false; + } + + public SessionState getSessionState() { + return sessionState; + } + + /** + * @return the list of all currently maintained "previous" session states. + */ + public List getPreviousSessionStates() { + return previousStates; + } + + public void removePreviousSessionStates() { + previousStates.clear(); + } + + public boolean isFresh() { + return fresh; + } + + /** + * Move the current {@link SessionState} into the list of "previous" session states, + * and replace the current {@link org.session.libsignal.libsignal.state.SessionState} + * with a fresh reset instance. + */ + public void archiveCurrentState() { + promoteState(new SessionState()); + } + + public void promoteState(SessionState promotedState) { + this.previousStates.addFirst(sessionState); + this.sessionState = promotedState; + + if (previousStates.size() > ARCHIVED_STATES_MAX_LENGTH) { + previousStates.removeLast(); + } + } + + public void setState(SessionState sessionState) { + this.sessionState = sessionState; + } + + /** + * @return a serialized version of the current SessionRecord. + */ + public byte[] serialize() { + List previousStructures = new LinkedList(); + + for (SessionState previousState : previousStates) { + previousStructures.add(previousState.getStructure()); + } + + RecordStructure record = RecordStructure.newBuilder() + .setCurrentSession(sessionState.getStructure()) + .addAllPreviousSessions(previousStructures) + .build(); + + return record.toByteArray(); + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/state/SessionState.java b/libsignal/src/main/java/org/session/libsignal/libsignal/state/SessionState.java new file mode 100644 index 000000000..e3f2efafe --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/state/SessionState.java @@ -0,0 +1,503 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.libsignal.state; + + +import com.google.protobuf.ByteString; + +import org.session.libsignal.libsignal.IdentityKey; +import org.session.libsignal.libsignal.IdentityKeyPair; +import org.session.libsignal.libsignal.InvalidKeyException; +import org.session.libsignal.libsignal.ecc.Curve; +import org.session.libsignal.libsignal.ecc.ECKeyPair; +import org.session.libsignal.libsignal.ecc.ECPrivateKey; +import org.session.libsignal.libsignal.ecc.ECPublicKey; +import org.session.libsignal.libsignal.kdf.HKDF; +import org.session.libsignal.libsignal.logging.Log; +import org.session.libsignal.libsignal.ratchet.ChainKey; +import org.session.libsignal.libsignal.ratchet.MessageKeys; +import org.session.libsignal.libsignal.ratchet.RootKey; +import org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain; +import org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange; +import org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey; +import org.session.libsignal.libsignal.util.Pair; +import org.session.libsignal.libsignal.util.guava.Optional; + +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +import static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure; + +public class SessionState { + + private static final int MAX_MESSAGE_KEYS = 2000; + + private SessionStructure sessionStructure; + + public SessionState() { + this.sessionStructure = SessionStructure.newBuilder().build(); + } + + public SessionState(SessionStructure sessionStructure) { + this.sessionStructure = sessionStructure; + } + + public SessionState(SessionState copy) { + this.sessionStructure = copy.sessionStructure.toBuilder().build(); + } + + public SessionStructure getStructure() { + return sessionStructure; + } + + public byte[] getAliceBaseKey() { + return this.sessionStructure.getAliceBaseKey().toByteArray(); + } + + public void setAliceBaseKey(byte[] aliceBaseKey) { + this.sessionStructure = this.sessionStructure.toBuilder() + .setAliceBaseKey(ByteString.copyFrom(aliceBaseKey)) + .build(); + } + + public void setSessionVersion(int version) { + this.sessionStructure = this.sessionStructure.toBuilder() + .setSessionVersion(version) + .build(); + } + + public int getSessionVersion() { + int sessionVersion = this.sessionStructure.getSessionVersion(); + + if (sessionVersion == 0) return 2; + else return sessionVersion; + } + + public void setRemoteIdentityKey(IdentityKey identityKey) { + this.sessionStructure = this.sessionStructure.toBuilder() + .setRemoteIdentityPublic(ByteString.copyFrom(identityKey.serialize())) + .build(); + } + + public void setLocalIdentityKey(IdentityKey identityKey) { + this.sessionStructure = this.sessionStructure.toBuilder() + .setLocalIdentityPublic(ByteString.copyFrom(identityKey.serialize())) + .build(); + } + + public IdentityKey getRemoteIdentityKey() { + try { + if (!this.sessionStructure.hasRemoteIdentityPublic()) { + return null; + } + + return new IdentityKey(this.sessionStructure.getRemoteIdentityPublic().toByteArray(), 0); + } catch (InvalidKeyException e) { + Log.w("SessionRecordV2", e); + return null; + } + } + + public IdentityKey getLocalIdentityKey() { + try { + return new IdentityKey(this.sessionStructure.getLocalIdentityPublic().toByteArray(), 0); + } catch (InvalidKeyException e) { + throw new AssertionError(e); + } + } + + public int getPreviousCounter() { + return sessionStructure.getPreviousCounter(); + } + + public void setPreviousCounter(int previousCounter) { + this.sessionStructure = this.sessionStructure.toBuilder() + .setPreviousCounter(previousCounter) + .build(); + } + + public RootKey getRootKey() { + return new RootKey(HKDF.createFor(getSessionVersion()), + this.sessionStructure.getRootKey().toByteArray()); + } + + public void setRootKey(RootKey rootKey) { + this.sessionStructure = this.sessionStructure.toBuilder() + .setRootKey(ByteString.copyFrom(rootKey.getKeyBytes())) + .build(); + } + + public ECPublicKey getSenderRatchetKey() { + try { + return Curve.decodePoint(sessionStructure.getSenderChain().getSenderRatchetKey().toByteArray(), 0); + } catch (InvalidKeyException e) { + throw new AssertionError(e); + } + } + + public ECKeyPair getSenderRatchetKeyPair() { + ECPublicKey publicKey = getSenderRatchetKey(); + ECPrivateKey privateKey = Curve.decodePrivatePoint(sessionStructure.getSenderChain() + .getSenderRatchetKeyPrivate() + .toByteArray()); + + return new ECKeyPair(publicKey, privateKey); + } + + public boolean hasReceiverChain(ECPublicKey senderEphemeral) { + return getReceiverChain(senderEphemeral) != null; + } + + public boolean hasSenderChain() { + return sessionStructure.hasSenderChain(); + } + + private Pair getReceiverChain(ECPublicKey senderEphemeral) { + List receiverChains = sessionStructure.getReceiverChainsList(); + int index = 0; + + for (Chain receiverChain : receiverChains) { + try { + ECPublicKey chainSenderRatchetKey = Curve.decodePoint(receiverChain.getSenderRatchetKey().toByteArray(), 0); + + if (chainSenderRatchetKey.equals(senderEphemeral)) { + return new Pair(receiverChain,index); + } + } catch (InvalidKeyException e) { + Log.w("SessionRecordV2", e); + } + + index++; + } + + return null; + } + + public ChainKey getReceiverChainKey(ECPublicKey senderEphemeral) { + Pair receiverChainAndIndex = getReceiverChain(senderEphemeral); + Chain receiverChain = receiverChainAndIndex.first(); + + if (receiverChain == null) { + return null; + } else { + return new ChainKey(HKDF.createFor(getSessionVersion()), + receiverChain.getChainKey().getKey().toByteArray(), + receiverChain.getChainKey().getIndex()); + } + } + + public void addReceiverChain(ECPublicKey senderRatchetKey, ChainKey chainKey) { + Chain.ChainKey chainKeyStructure = Chain.ChainKey.newBuilder() + .setKey(ByteString.copyFrom(chainKey.getKey())) + .setIndex(chainKey.getIndex()) + .build(); + + Chain chain = Chain.newBuilder() + .setChainKey(chainKeyStructure) + .setSenderRatchetKey(ByteString.copyFrom(senderRatchetKey.serialize())) + .build(); + + this.sessionStructure = this.sessionStructure.toBuilder().addReceiverChains(chain).build(); + + if (this.sessionStructure.getReceiverChainsList().size() > 5) { + this.sessionStructure = this.sessionStructure.toBuilder() + .removeReceiverChains(0) + .build(); + } + } + + public void setSenderChain(ECKeyPair senderRatchetKeyPair, ChainKey chainKey) { + Chain.ChainKey chainKeyStructure = Chain.ChainKey.newBuilder() + .setKey(ByteString.copyFrom(chainKey.getKey())) + .setIndex(chainKey.getIndex()) + .build(); + + Chain senderChain = Chain.newBuilder() + .setSenderRatchetKey(ByteString.copyFrom(senderRatchetKeyPair.getPublicKey().serialize())) + .setSenderRatchetKeyPrivate(ByteString.copyFrom(senderRatchetKeyPair.getPrivateKey().serialize())) + .setChainKey(chainKeyStructure) + .build(); + + this.sessionStructure = this.sessionStructure.toBuilder().setSenderChain(senderChain).build(); + } + + public ChainKey getSenderChainKey() { + Chain.ChainKey chainKeyStructure = sessionStructure.getSenderChain().getChainKey(); + return new ChainKey(HKDF.createFor(getSessionVersion()), + chainKeyStructure.getKey().toByteArray(), chainKeyStructure.getIndex()); + } + + + public void setSenderChainKey(ChainKey nextChainKey) { + Chain.ChainKey chainKey = Chain.ChainKey.newBuilder() + .setKey(ByteString.copyFrom(nextChainKey.getKey())) + .setIndex(nextChainKey.getIndex()) + .build(); + + Chain chain = sessionStructure.getSenderChain().toBuilder() + .setChainKey(chainKey).build(); + + this.sessionStructure = this.sessionStructure.toBuilder().setSenderChain(chain).build(); + } + + public boolean hasMessageKeys(ECPublicKey senderEphemeral, int counter) { + Pair chainAndIndex = getReceiverChain(senderEphemeral); + Chain chain = chainAndIndex.first(); + + if (chain == null) { + return false; + } + + List messageKeyList = chain.getMessageKeysList(); + + for (Chain.MessageKey messageKey : messageKeyList) { + if (messageKey.getIndex() == counter) { + return true; + } + } + + return false; + } + + public MessageKeys removeMessageKeys(ECPublicKey senderEphemeral, int counter) { + Pair chainAndIndex = getReceiverChain(senderEphemeral); + Chain chain = chainAndIndex.first(); + + if (chain == null) { + return null; + } + + List messageKeyList = new LinkedList(chain.getMessageKeysList()); + Iterator messageKeyIterator = messageKeyList.iterator(); + MessageKeys result = null; + + while (messageKeyIterator.hasNext()) { + Chain.MessageKey messageKey = messageKeyIterator.next(); + + if (messageKey.getIndex() == counter) { + result = new MessageKeys(new SecretKeySpec(messageKey.getCipherKey().toByteArray(), "AES"), + new SecretKeySpec(messageKey.getMacKey().toByteArray(), "HmacSHA256"), + new IvParameterSpec(messageKey.getIv().toByteArray()), + messageKey.getIndex()); + + messageKeyIterator.remove(); + break; + } + } + + Chain updatedChain = chain.toBuilder().clearMessageKeys() + .addAllMessageKeys(messageKeyList) + .build(); + + this.sessionStructure = this.sessionStructure.toBuilder() + .setReceiverChains(chainAndIndex.second(), updatedChain) + .build(); + + return result; + } + + public void setMessageKeys(ECPublicKey senderEphemeral, MessageKeys messageKeys) { + Pair chainAndIndex = getReceiverChain(senderEphemeral); + Chain chain = chainAndIndex.first(); + Chain.MessageKey messageKeyStructure = Chain.MessageKey.newBuilder() + .setCipherKey(ByteString.copyFrom(messageKeys.getCipherKey().getEncoded())) + .setMacKey(ByteString.copyFrom(messageKeys.getMacKey().getEncoded())) + .setIndex(messageKeys.getCounter()) + .setIv(ByteString.copyFrom(messageKeys.getIv().getIV())) + .build(); + + Chain.Builder updatedChain = chain.toBuilder().addMessageKeys(messageKeyStructure); + + if (updatedChain.getMessageKeysCount() > MAX_MESSAGE_KEYS) { + updatedChain.removeMessageKeys(0); + } + + this.sessionStructure = this.sessionStructure.toBuilder() + .setReceiverChains(chainAndIndex.second(), + updatedChain.build()) + .build(); + } + + public void setReceiverChainKey(ECPublicKey senderEphemeral, ChainKey chainKey) { + Pair chainAndIndex = getReceiverChain(senderEphemeral); + Chain chain = chainAndIndex.first(); + + Chain.ChainKey chainKeyStructure = Chain.ChainKey.newBuilder() + .setKey(ByteString.copyFrom(chainKey.getKey())) + .setIndex(chainKey.getIndex()) + .build(); + + Chain updatedChain = chain.toBuilder().setChainKey(chainKeyStructure).build(); + + this.sessionStructure = this.sessionStructure.toBuilder() + .setReceiverChains(chainAndIndex.second(), updatedChain) + .build(); + } + + public void setPendingKeyExchange(int sequence, + ECKeyPair ourBaseKey, + ECKeyPair ourRatchetKey, + IdentityKeyPair ourIdentityKey) + { + PendingKeyExchange structure = + PendingKeyExchange.newBuilder() + .setSequence(sequence) + .setLocalBaseKey(ByteString.copyFrom(ourBaseKey.getPublicKey().serialize())) + .setLocalBaseKeyPrivate(ByteString.copyFrom(ourBaseKey.getPrivateKey().serialize())) + .setLocalRatchetKey(ByteString.copyFrom(ourRatchetKey.getPublicKey().serialize())) + .setLocalRatchetKeyPrivate(ByteString.copyFrom(ourRatchetKey.getPrivateKey().serialize())) + .setLocalIdentityKey(ByteString.copyFrom(ourIdentityKey.getPublicKey().serialize())) + .setLocalIdentityKeyPrivate(ByteString.copyFrom(ourIdentityKey.getPrivateKey().serialize())) + .build(); + + this.sessionStructure = this.sessionStructure.toBuilder() + .setPendingKeyExchange(structure) + .build(); + } + + public int getPendingKeyExchangeSequence() { + return sessionStructure.getPendingKeyExchange().getSequence(); + } + + public ECKeyPair getPendingKeyExchangeBaseKey() throws InvalidKeyException { + ECPublicKey publicKey = Curve.decodePoint(sessionStructure.getPendingKeyExchange() + .getLocalBaseKey().toByteArray(), 0); + + ECPrivateKey privateKey = Curve.decodePrivatePoint(sessionStructure.getPendingKeyExchange() + .getLocalBaseKeyPrivate() + .toByteArray()); + + return new ECKeyPair(publicKey, privateKey); + } + + public ECKeyPair getPendingKeyExchangeRatchetKey() throws InvalidKeyException { + ECPublicKey publicKey = Curve.decodePoint(sessionStructure.getPendingKeyExchange() + .getLocalRatchetKey().toByteArray(), 0); + + ECPrivateKey privateKey = Curve.decodePrivatePoint(sessionStructure.getPendingKeyExchange() + .getLocalRatchetKeyPrivate() + .toByteArray()); + + return new ECKeyPair(publicKey, privateKey); + } + + public IdentityKeyPair getPendingKeyExchangeIdentityKey() throws InvalidKeyException { + IdentityKey publicKey = new IdentityKey(sessionStructure.getPendingKeyExchange() + .getLocalIdentityKey().toByteArray(), 0); + + ECPrivateKey privateKey = Curve.decodePrivatePoint(sessionStructure.getPendingKeyExchange() + .getLocalIdentityKeyPrivate() + .toByteArray()); + + return new IdentityKeyPair(publicKey, privateKey); + } + + public boolean hasPendingKeyExchange() { + return sessionStructure.hasPendingKeyExchange(); + } + + public void setUnacknowledgedPreKeyMessage(Optional preKeyId, int signedPreKeyId, ECPublicKey baseKey) { + PendingPreKey.Builder pending = PendingPreKey.newBuilder() + .setSignedPreKeyId(signedPreKeyId) + .setBaseKey(ByteString.copyFrom(baseKey.serialize())); + + if (preKeyId.isPresent()) { + pending.setPreKeyId(preKeyId.get()); + } + + this.sessionStructure = this.sessionStructure.toBuilder() + .setPendingPreKey(pending.build()) + .build(); + } + + public boolean hasUnacknowledgedPreKeyMessage() { + return this.sessionStructure.hasPendingPreKey(); + } + + public UnacknowledgedPreKeyMessageItems getUnacknowledgedPreKeyMessageItems() { + try { + Optional preKeyId; + + if (sessionStructure.getPendingPreKey().hasPreKeyId()) { + preKeyId = Optional.of(sessionStructure.getPendingPreKey().getPreKeyId()); + } else { + preKeyId = Optional.absent(); + } + + return + new UnacknowledgedPreKeyMessageItems(preKeyId, + sessionStructure.getPendingPreKey().getSignedPreKeyId(), + Curve.decodePoint(sessionStructure.getPendingPreKey() + .getBaseKey() + .toByteArray(), 0)); + } catch (InvalidKeyException e) { + throw new AssertionError(e); + } + } + + public void clearUnacknowledgedPreKeyMessage() { + this.sessionStructure = this.sessionStructure.toBuilder() + .clearPendingPreKey() + .build(); + } + + public void setRemoteRegistrationId(int registrationId) { + this.sessionStructure = this.sessionStructure.toBuilder() + .setRemoteRegistrationId(registrationId) + .build(); + } + + public int getRemoteRegistrationId() { + return this.sessionStructure.getRemoteRegistrationId(); + } + + public void setLocalRegistrationId(int registrationId) { + this.sessionStructure = this.sessionStructure.toBuilder() + .setLocalRegistrationId(registrationId) + .build(); + } + + public int getLocalRegistrationId() { + return this.sessionStructure.getLocalRegistrationId(); + } + + public byte[] serialize() { + return sessionStructure.toByteArray(); + } + + public static class UnacknowledgedPreKeyMessageItems { + private final Optional preKeyId; + private final int signedPreKeyId; + private final ECPublicKey baseKey; + + public UnacknowledgedPreKeyMessageItems(Optional preKeyId, + int signedPreKeyId, + ECPublicKey baseKey) + { + this.preKeyId = preKeyId; + this.signedPreKeyId = signedPreKeyId; + this.baseKey = baseKey; + } + + + public Optional getPreKeyId() { + return preKeyId; + } + + public int getSignedPreKeyId() { + return signedPreKeyId; + } + + public ECPublicKey getBaseKey() { + return baseKey; + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/state/SessionStore.java b/libsignal/src/main/java/org/session/libsignal/libsignal/state/SessionStore.java new file mode 100644 index 000000000..e1029b13f --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/state/SessionStore.java @@ -0,0 +1,72 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.state; + +import org.session.libsignal.libsignal.SignalProtocolAddress; +import org.session.libsignal.libsignal.state.SessionRecord; + +import java.util.List; + +/** + * The interface to the durable store of session state information + * for remote clients. + * + * @author Moxie Marlinspike + */ +public interface SessionStore { + + /** + * Returns a copy of the {@link SessionRecord} corresponding to the recipientId + deviceId tuple, + * or a new SessionRecord if one does not currently exist. + *

+ * It is important that implementations return a copy of the current durable information. The + * returned SessionRecord may be modified, but those changes should not have an effect on the + * durable session state (what is returned by subsequent calls to this method) without the + * store method being called here first. + * + * @param address The name and device ID of the remote client. + * @return a copy of the SessionRecord corresponding to the recipientId + deviceId tuple, or + * a new SessionRecord if one does not currently exist. + */ + public SessionRecord loadSession(SignalProtocolAddress address); + + /** + * Returns all known devices with active sessions for a recipient + * + * @param name the name of the client. + * @return all known sub-devices with active sessions. + */ + public List getSubDeviceSessions(String name); + + /** + * Commit to storage the {@link SessionRecord} for a given recipientId + deviceId tuple. + * @param address the address of the remote client. + * @param record the current SessionRecord for the remote client. + */ + public void storeSession(SignalProtocolAddress address, SessionRecord record); + + /** + * Determine whether there is a committed {@link SessionRecord} for a recipientId + deviceId tuple. + * @param address the address of the remote client. + * @return true if a {@link SessionRecord} exists, false otherwise. + */ + public boolean containsSession(SignalProtocolAddress address); + + /** + * Remove a {@link SessionRecord} for a recipientId + deviceId tuple. + * + * @param address the address of the remote client. + */ + public void deleteSession(SignalProtocolAddress address); + + /** + * Remove the {@link SessionRecord}s corresponding to all devices of a recipientId. + * + * @param name the name of the remote client. + */ + public void deleteAllSessions(String name); + +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/state/SignalProtocolStore.java b/libsignal/src/main/java/org/session/libsignal/libsignal/state/SignalProtocolStore.java new file mode 100644 index 000000000..08fc8e919 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/state/SignalProtocolStore.java @@ -0,0 +1,11 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.state; + +public interface SignalProtocolStore + extends IdentityKeyStore, PreKeyStore, SessionStore, SignedPreKeyStore +{ +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/state/SignedPreKeyRecord.java b/libsignal/src/main/java/org/session/libsignal/libsignal/state/SignedPreKeyRecord.java new file mode 100644 index 000000000..3478ea6ed --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/state/SignedPreKeyRecord.java @@ -0,0 +1,66 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.state; + +import com.google.protobuf.ByteString; + +import org.session.libsignal.libsignal.InvalidKeyException; +import org.session.libsignal.libsignal.ecc.Curve; +import org.session.libsignal.libsignal.ecc.ECKeyPair; +import org.session.libsignal.libsignal.ecc.ECPrivateKey; +import org.session.libsignal.libsignal.ecc.ECPublicKey; + +import java.io.IOException; + +import static org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructure; + +public class SignedPreKeyRecord { + + private SignedPreKeyRecordStructure structure; + + public SignedPreKeyRecord(int id, long timestamp, ECKeyPair keyPair, byte[] signature) { + this.structure = SignedPreKeyRecordStructure.newBuilder() + .setId(id) + .setPublicKey(ByteString.copyFrom(keyPair.getPublicKey() + .serialize())) + .setPrivateKey(ByteString.copyFrom(keyPair.getPrivateKey() + .serialize())) + .setSignature(ByteString.copyFrom(signature)) + .setTimestamp(timestamp) + .build(); + } + + public SignedPreKeyRecord(byte[] serialized) throws IOException { + this.structure = SignedPreKeyRecordStructure.parseFrom(serialized); + } + + public int getId() { + return this.structure.getId(); + } + + public long getTimestamp() { + return this.structure.getTimestamp(); + } + + public ECKeyPair getKeyPair() { + try { + ECPublicKey publicKey = Curve.decodePoint(this.structure.getPublicKey().toByteArray(), 0); + ECPrivateKey privateKey = Curve.decodePrivatePoint(this.structure.getPrivateKey().toByteArray()); + + return new ECKeyPair(publicKey, privateKey); + } catch (InvalidKeyException e) { + throw new AssertionError(e); + } + } + + public byte[] getSignature() { + return this.structure.getSignature().toByteArray(); + } + + public byte[] serialize() { + return this.structure.toByteArray(); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/state/SignedPreKeyStore.java b/libsignal/src/main/java/org/session/libsignal/libsignal/state/SignedPreKeyStore.java new file mode 100644 index 000000000..a25857227 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/state/SignedPreKeyStore.java @@ -0,0 +1,53 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.state; + +import org.session.libsignal.libsignal.InvalidKeyIdException; +import org.session.libsignal.libsignal.state.SignedPreKeyRecord; + +import java.util.List; + +public interface SignedPreKeyStore { + + + /** + * Load a local SignedPreKeyRecord. + * + * @param signedPreKeyId the ID of the local SignedPreKeyRecord. + * @return the corresponding SignedPreKeyRecord. + * @throws InvalidKeyIdException when there is no corresponding SignedPreKeyRecord. + */ + public SignedPreKeyRecord loadSignedPreKey(int signedPreKeyId) throws InvalidKeyIdException; + + /** + * Load all local SignedPreKeyRecords. + * + * @return All stored SignedPreKeyRecords. + */ + public List loadSignedPreKeys(); + + /** + * Store a local SignedPreKeyRecord. + * + * @param signedPreKeyId the ID of the SignedPreKeyRecord to store. + * @param record the SignedPreKeyRecord. + */ + public void storeSignedPreKey(int signedPreKeyId, SignedPreKeyRecord record); + + /** + * @param signedPreKeyId A SignedPreKeyRecord ID. + * @return true if the store has a record for the signedPreKeyId, otherwise false. + */ + public boolean containsSignedPreKey(int signedPreKeyId); + + /** + * Delete a SignedPreKeyRecord from local storage. + * + * @param signedPreKeyId The ID of the SignedPreKeyRecord to remove. + */ + public void removeSignedPreKey(int signedPreKeyId); + +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/state/StorageProtos.java b/libsignal/src/main/java/org/session/libsignal/libsignal/state/StorageProtos.java new file mode 100644 index 000000000..1c4b6605c --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/state/StorageProtos.java @@ -0,0 +1,11779 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: LocalStorageProtocol.proto + +package org.session.libsignal.libsignal.state; + +public final class StorageProtos { + private StorageProtos() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + } + public interface SessionStructureOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional uint32 sessionVersion = 1; + /** + * optional uint32 sessionVersion = 1; + */ + boolean hasSessionVersion(); + /** + * optional uint32 sessionVersion = 1; + */ + int getSessionVersion(); + + // optional bytes localIdentityPublic = 2; + /** + * optional bytes localIdentityPublic = 2; + */ + boolean hasLocalIdentityPublic(); + /** + * optional bytes localIdentityPublic = 2; + */ + com.google.protobuf.ByteString getLocalIdentityPublic(); + + // optional bytes remoteIdentityPublic = 3; + /** + * optional bytes remoteIdentityPublic = 3; + */ + boolean hasRemoteIdentityPublic(); + /** + * optional bytes remoteIdentityPublic = 3; + */ + com.google.protobuf.ByteString getRemoteIdentityPublic(); + + // optional bytes rootKey = 4; + /** + * optional bytes rootKey = 4; + */ + boolean hasRootKey(); + /** + * optional bytes rootKey = 4; + */ + com.google.protobuf.ByteString getRootKey(); + + // optional uint32 previousCounter = 5; + /** + * optional uint32 previousCounter = 5; + */ + boolean hasPreviousCounter(); + /** + * optional uint32 previousCounter = 5; + */ + int getPreviousCounter(); + + // optional .textsecure.SessionStructure.Chain senderChain = 6; + /** + * optional .textsecure.SessionStructure.Chain senderChain = 6; + */ + boolean hasSenderChain(); + /** + * optional .textsecure.SessionStructure.Chain senderChain = 6; + */ + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain getSenderChain(); + /** + * optional .textsecure.SessionStructure.Chain senderChain = 6; + */ + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.ChainOrBuilder getSenderChainOrBuilder(); + + // repeated .textsecure.SessionStructure.Chain receiverChains = 7; + /** + * repeated .textsecure.SessionStructure.Chain receiverChains = 7; + */ + java.util.List + getReceiverChainsList(); + /** + * repeated .textsecure.SessionStructure.Chain receiverChains = 7; + */ + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain getReceiverChains(int index); + /** + * repeated .textsecure.SessionStructure.Chain receiverChains = 7; + */ + int getReceiverChainsCount(); + /** + * repeated .textsecure.SessionStructure.Chain receiverChains = 7; + */ + java.util.List + getReceiverChainsOrBuilderList(); + /** + * repeated .textsecure.SessionStructure.Chain receiverChains = 7; + */ + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.ChainOrBuilder getReceiverChainsOrBuilder( + int index); + + // optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8; + /** + * optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8; + */ + boolean hasPendingKeyExchange(); + /** + * optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8; + */ + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange getPendingKeyExchange(); + /** + * optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8; + */ + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchangeOrBuilder getPendingKeyExchangeOrBuilder(); + + // optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9; + /** + * optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9; + */ + boolean hasPendingPreKey(); + /** + * optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9; + */ + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey getPendingPreKey(); + /** + * optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9; + */ + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKeyOrBuilder getPendingPreKeyOrBuilder(); + + // optional uint32 remoteRegistrationId = 10; + /** + * optional uint32 remoteRegistrationId = 10; + */ + boolean hasRemoteRegistrationId(); + /** + * optional uint32 remoteRegistrationId = 10; + */ + int getRemoteRegistrationId(); + + // optional uint32 localRegistrationId = 11; + /** + * optional uint32 localRegistrationId = 11; + */ + boolean hasLocalRegistrationId(); + /** + * optional uint32 localRegistrationId = 11; + */ + int getLocalRegistrationId(); + + // optional bool needsRefresh = 12; + /** + * optional bool needsRefresh = 12; + */ + boolean hasNeedsRefresh(); + /** + * optional bool needsRefresh = 12; + */ + boolean getNeedsRefresh(); + + // optional bytes aliceBaseKey = 13; + /** + * optional bytes aliceBaseKey = 13; + */ + boolean hasAliceBaseKey(); + /** + * optional bytes aliceBaseKey = 13; + */ + com.google.protobuf.ByteString getAliceBaseKey(); + } + /** + * Protobuf type {@code textsecure.SessionStructure} + */ + public static final class SessionStructure extends + com.google.protobuf.GeneratedMessage + implements SessionStructureOrBuilder { + // Use SessionStructure.newBuilder() to construct. + private SessionStructure(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private SessionStructure(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final SessionStructure defaultInstance; + public static SessionStructure getDefaultInstance() { + return defaultInstance; + } + + public SessionStructure getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private SessionStructure( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + sessionVersion_ = input.readUInt32(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + localIdentityPublic_ = input.readBytes(); + break; + } + case 26: { + bitField0_ |= 0x00000004; + remoteIdentityPublic_ = input.readBytes(); + break; + } + case 34: { + bitField0_ |= 0x00000008; + rootKey_ = input.readBytes(); + break; + } + case 40: { + bitField0_ |= 0x00000010; + previousCounter_ = input.readUInt32(); + break; + } + case 50: { + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.Builder subBuilder = null; + if (((bitField0_ & 0x00000020) == 0x00000020)) { + subBuilder = senderChain_.toBuilder(); + } + senderChain_ = input.readMessage(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(senderChain_); + senderChain_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000020; + break; + } + case 58: { + if (!((mutable_bitField0_ & 0x00000040) == 0x00000040)) { + receiverChains_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000040; + } + receiverChains_.add(input.readMessage(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.PARSER, extensionRegistry)); + break; + } + case 66: { + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.Builder subBuilder = null; + if (((bitField0_ & 0x00000040) == 0x00000040)) { + subBuilder = pendingKeyExchange_.toBuilder(); + } + pendingKeyExchange_ = input.readMessage(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(pendingKeyExchange_); + pendingKeyExchange_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000040; + break; + } + case 74: { + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.Builder subBuilder = null; + if (((bitField0_ & 0x00000080) == 0x00000080)) { + subBuilder = pendingPreKey_.toBuilder(); + } + pendingPreKey_ = input.readMessage(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(pendingPreKey_); + pendingPreKey_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000080; + break; + } + case 80: { + bitField0_ |= 0x00000100; + remoteRegistrationId_ = input.readUInt32(); + break; + } + case 88: { + bitField0_ |= 0x00000200; + localRegistrationId_ = input.readUInt32(); + break; + } + case 96: { + bitField0_ |= 0x00000400; + needsRefresh_ = input.readBool(); + break; + } + case 106: { + bitField0_ |= 0x00000800; + aliceBaseKey_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000040) == 0x00000040)) { + receiverChains_ = java.util.Collections.unmodifiableList(receiverChains_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.class, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public SessionStructure parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new SessionStructure(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public interface ChainOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional bytes senderRatchetKey = 1; + /** + * optional bytes senderRatchetKey = 1; + */ + boolean hasSenderRatchetKey(); + /** + * optional bytes senderRatchetKey = 1; + */ + com.google.protobuf.ByteString getSenderRatchetKey(); + + // optional bytes senderRatchetKeyPrivate = 2; + /** + * optional bytes senderRatchetKeyPrivate = 2; + */ + boolean hasSenderRatchetKeyPrivate(); + /** + * optional bytes senderRatchetKeyPrivate = 2; + */ + com.google.protobuf.ByteString getSenderRatchetKeyPrivate(); + + // optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3; + /** + * optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3; + */ + boolean hasChainKey(); + /** + * optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3; + */ + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey getChainKey(); + /** + * optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3; + */ + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKeyOrBuilder getChainKeyOrBuilder(); + + // repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + /** + * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + */ + java.util.List + getMessageKeysList(); + /** + * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + */ + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey getMessageKeys(int index); + /** + * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + */ + int getMessageKeysCount(); + /** + * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + */ + java.util.List + getMessageKeysOrBuilderList(); + /** + * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + */ + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKeyOrBuilder getMessageKeysOrBuilder( + int index); + } + /** + * Protobuf type {@code textsecure.SessionStructure.Chain} + */ + public static final class Chain extends + com.google.protobuf.GeneratedMessage + implements ChainOrBuilder { + // Use Chain.newBuilder() to construct. + private Chain(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Chain(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Chain defaultInstance; + public static Chain getDefaultInstance() { + return defaultInstance; + } + + public Chain getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Chain( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + senderRatchetKey_ = input.readBytes(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + senderRatchetKeyPrivate_ = input.readBytes(); + break; + } + case 26: { + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.Builder subBuilder = null; + if (((bitField0_ & 0x00000004) == 0x00000004)) { + subBuilder = chainKey_.toBuilder(); + } + chainKey_ = input.readMessage(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(chainKey_); + chainKey_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000004; + break; + } + case 34: { + if (!((mutable_bitField0_ & 0x00000008) == 0x00000008)) { + messageKeys_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000008; + } + messageKeys_.add(input.readMessage(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.PARSER, extensionRegistry)); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000008) == 0x00000008)) { + messageKeys_ = java.util.Collections.unmodifiableList(messageKeys_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_Chain_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_Chain_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.class, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Chain parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Chain(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public interface ChainKeyOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional uint32 index = 1; + /** + * optional uint32 index = 1; + */ + boolean hasIndex(); + /** + * optional uint32 index = 1; + */ + int getIndex(); + + // optional bytes key = 2; + /** + * optional bytes key = 2; + */ + boolean hasKey(); + /** + * optional bytes key = 2; + */ + com.google.protobuf.ByteString getKey(); + } + /** + * Protobuf type {@code textsecure.SessionStructure.Chain.ChainKey} + */ + public static final class ChainKey extends + com.google.protobuf.GeneratedMessage + implements ChainKeyOrBuilder { + // Use ChainKey.newBuilder() to construct. + private ChainKey(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private ChainKey(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final ChainKey defaultInstance; + public static ChainKey getDefaultInstance() { + return defaultInstance; + } + + public ChainKey getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private ChainKey( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + index_ = input.readUInt32(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + key_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_Chain_ChainKey_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_Chain_ChainKey_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.class, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public ChainKey parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new ChainKey(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional uint32 index = 1; + public static final int INDEX_FIELD_NUMBER = 1; + private int index_; + /** + * optional uint32 index = 1; + */ + public boolean hasIndex() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 index = 1; + */ + public int getIndex() { + return index_; + } + + // optional bytes key = 2; + public static final int KEY_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString key_; + /** + * optional bytes key = 2; + */ + public boolean hasKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes key = 2; + */ + public com.google.protobuf.ByteString getKey() { + return key_; + } + + private void initFields() { + index_ = 0; + key_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt32(1, index_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, key_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, index_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, key_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code textsecure.SessionStructure.Chain.ChainKey} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKeyOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_Chain_ChainKey_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_Chain_ChainKey_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.class, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.Builder.class); + } + + // Construct using org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + index_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + key_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_Chain_ChainKey_descriptor; + } + + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey getDefaultInstanceForType() { + return org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.getDefaultInstance(); + } + + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey build() { + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey buildPartial() { + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey result = new org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.index_ = index_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.key_ = key_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey) { + return mergeFrom((org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey other) { + if (other == org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.getDefaultInstance()) return this; + if (other.hasIndex()) { + setIndex(other.getIndex()); + } + if (other.hasKey()) { + setKey(other.getKey()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional uint32 index = 1; + private int index_ ; + /** + * optional uint32 index = 1; + */ + public boolean hasIndex() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 index = 1; + */ + public int getIndex() { + return index_; + } + /** + * optional uint32 index = 1; + */ + public Builder setIndex(int value) { + bitField0_ |= 0x00000001; + index_ = value; + onChanged(); + return this; + } + /** + * optional uint32 index = 1; + */ + public Builder clearIndex() { + bitField0_ = (bitField0_ & ~0x00000001); + index_ = 0; + onChanged(); + return this; + } + + // optional bytes key = 2; + private com.google.protobuf.ByteString key_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes key = 2; + */ + public boolean hasKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes key = 2; + */ + public com.google.protobuf.ByteString getKey() { + return key_; + } + /** + * optional bytes key = 2; + */ + public Builder setKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + key_ = value; + onChanged(); + return this; + } + /** + * optional bytes key = 2; + */ + public Builder clearKey() { + bitField0_ = (bitField0_ & ~0x00000002); + key_ = getDefaultInstance().getKey(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:textsecure.SessionStructure.Chain.ChainKey) + } + + static { + defaultInstance = new ChainKey(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:textsecure.SessionStructure.Chain.ChainKey) + } + + public interface MessageKeyOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional uint32 index = 1; + /** + * optional uint32 index = 1; + */ + boolean hasIndex(); + /** + * optional uint32 index = 1; + */ + int getIndex(); + + // optional bytes cipherKey = 2; + /** + * optional bytes cipherKey = 2; + */ + boolean hasCipherKey(); + /** + * optional bytes cipherKey = 2; + */ + com.google.protobuf.ByteString getCipherKey(); + + // optional bytes macKey = 3; + /** + * optional bytes macKey = 3; + */ + boolean hasMacKey(); + /** + * optional bytes macKey = 3; + */ + com.google.protobuf.ByteString getMacKey(); + + // optional bytes iv = 4; + /** + * optional bytes iv = 4; + */ + boolean hasIv(); + /** + * optional bytes iv = 4; + */ + com.google.protobuf.ByteString getIv(); + } + /** + * Protobuf type {@code textsecure.SessionStructure.Chain.MessageKey} + */ + public static final class MessageKey extends + com.google.protobuf.GeneratedMessage + implements MessageKeyOrBuilder { + // Use MessageKey.newBuilder() to construct. + private MessageKey(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private MessageKey(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final MessageKey defaultInstance; + public static MessageKey getDefaultInstance() { + return defaultInstance; + } + + public MessageKey getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private MessageKey( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + index_ = input.readUInt32(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + cipherKey_ = input.readBytes(); + break; + } + case 26: { + bitField0_ |= 0x00000004; + macKey_ = input.readBytes(); + break; + } + case 34: { + bitField0_ |= 0x00000008; + iv_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_Chain_MessageKey_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_Chain_MessageKey_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.class, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public MessageKey parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new MessageKey(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional uint32 index = 1; + public static final int INDEX_FIELD_NUMBER = 1; + private int index_; + /** + * optional uint32 index = 1; + */ + public boolean hasIndex() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 index = 1; + */ + public int getIndex() { + return index_; + } + + // optional bytes cipherKey = 2; + public static final int CIPHERKEY_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString cipherKey_; + /** + * optional bytes cipherKey = 2; + */ + public boolean hasCipherKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes cipherKey = 2; + */ + public com.google.protobuf.ByteString getCipherKey() { + return cipherKey_; + } + + // optional bytes macKey = 3; + public static final int MACKEY_FIELD_NUMBER = 3; + private com.google.protobuf.ByteString macKey_; + /** + * optional bytes macKey = 3; + */ + public boolean hasMacKey() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes macKey = 3; + */ + public com.google.protobuf.ByteString getMacKey() { + return macKey_; + } + + // optional bytes iv = 4; + public static final int IV_FIELD_NUMBER = 4; + private com.google.protobuf.ByteString iv_; + /** + * optional bytes iv = 4; + */ + public boolean hasIv() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional bytes iv = 4; + */ + public com.google.protobuf.ByteString getIv() { + return iv_; + } + + private void initFields() { + index_ = 0; + cipherKey_ = com.google.protobuf.ByteString.EMPTY; + macKey_ = com.google.protobuf.ByteString.EMPTY; + iv_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt32(1, index_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, cipherKey_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(3, macKey_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeBytes(4, iv_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, index_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, cipherKey_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, macKey_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(4, iv_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code textsecure.SessionStructure.Chain.MessageKey} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKeyOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_Chain_MessageKey_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_Chain_MessageKey_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.class, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.Builder.class); + } + + // Construct using org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + index_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + cipherKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + macKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000004); + iv_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_Chain_MessageKey_descriptor; + } + + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey getDefaultInstanceForType() { + return org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.getDefaultInstance(); + } + + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey build() { + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey buildPartial() { + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey result = new org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.index_ = index_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.cipherKey_ = cipherKey_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.macKey_ = macKey_; + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000008; + } + result.iv_ = iv_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey) { + return mergeFrom((org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey other) { + if (other == org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.getDefaultInstance()) return this; + if (other.hasIndex()) { + setIndex(other.getIndex()); + } + if (other.hasCipherKey()) { + setCipherKey(other.getCipherKey()); + } + if (other.hasMacKey()) { + setMacKey(other.getMacKey()); + } + if (other.hasIv()) { + setIv(other.getIv()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional uint32 index = 1; + private int index_ ; + /** + * optional uint32 index = 1; + */ + public boolean hasIndex() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 index = 1; + */ + public int getIndex() { + return index_; + } + /** + * optional uint32 index = 1; + */ + public Builder setIndex(int value) { + bitField0_ |= 0x00000001; + index_ = value; + onChanged(); + return this; + } + /** + * optional uint32 index = 1; + */ + public Builder clearIndex() { + bitField0_ = (bitField0_ & ~0x00000001); + index_ = 0; + onChanged(); + return this; + } + + // optional bytes cipherKey = 2; + private com.google.protobuf.ByteString cipherKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes cipherKey = 2; + */ + public boolean hasCipherKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes cipherKey = 2; + */ + public com.google.protobuf.ByteString getCipherKey() { + return cipherKey_; + } + /** + * optional bytes cipherKey = 2; + */ + public Builder setCipherKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + cipherKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes cipherKey = 2; + */ + public Builder clearCipherKey() { + bitField0_ = (bitField0_ & ~0x00000002); + cipherKey_ = getDefaultInstance().getCipherKey(); + onChanged(); + return this; + } + + // optional bytes macKey = 3; + private com.google.protobuf.ByteString macKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes macKey = 3; + */ + public boolean hasMacKey() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes macKey = 3; + */ + public com.google.protobuf.ByteString getMacKey() { + return macKey_; + } + /** + * optional bytes macKey = 3; + */ + public Builder setMacKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + macKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes macKey = 3; + */ + public Builder clearMacKey() { + bitField0_ = (bitField0_ & ~0x00000004); + macKey_ = getDefaultInstance().getMacKey(); + onChanged(); + return this; + } + + // optional bytes iv = 4; + private com.google.protobuf.ByteString iv_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes iv = 4; + */ + public boolean hasIv() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional bytes iv = 4; + */ + public com.google.protobuf.ByteString getIv() { + return iv_; + } + /** + * optional bytes iv = 4; + */ + public Builder setIv(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + iv_ = value; + onChanged(); + return this; + } + /** + * optional bytes iv = 4; + */ + public Builder clearIv() { + bitField0_ = (bitField0_ & ~0x00000008); + iv_ = getDefaultInstance().getIv(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:textsecure.SessionStructure.Chain.MessageKey) + } + + static { + defaultInstance = new MessageKey(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:textsecure.SessionStructure.Chain.MessageKey) + } + + private int bitField0_; + // optional bytes senderRatchetKey = 1; + public static final int SENDERRATCHETKEY_FIELD_NUMBER = 1; + private com.google.protobuf.ByteString senderRatchetKey_; + /** + * optional bytes senderRatchetKey = 1; + */ + public boolean hasSenderRatchetKey() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes senderRatchetKey = 1; + */ + public com.google.protobuf.ByteString getSenderRatchetKey() { + return senderRatchetKey_; + } + + // optional bytes senderRatchetKeyPrivate = 2; + public static final int SENDERRATCHETKEYPRIVATE_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString senderRatchetKeyPrivate_; + /** + * optional bytes senderRatchetKeyPrivate = 2; + */ + public boolean hasSenderRatchetKeyPrivate() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes senderRatchetKeyPrivate = 2; + */ + public com.google.protobuf.ByteString getSenderRatchetKeyPrivate() { + return senderRatchetKeyPrivate_; + } + + // optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3; + public static final int CHAINKEY_FIELD_NUMBER = 3; + private org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey chainKey_; + /** + * optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3; + */ + public boolean hasChainKey() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey getChainKey() { + return chainKey_; + } + /** + * optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKeyOrBuilder getChainKeyOrBuilder() { + return chainKey_; + } + + // repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + public static final int MESSAGEKEYS_FIELD_NUMBER = 4; + private java.util.List messageKeys_; + /** + * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + */ + public java.util.List getMessageKeysList() { + return messageKeys_; + } + /** + * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + */ + public java.util.List + getMessageKeysOrBuilderList() { + return messageKeys_; + } + /** + * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + */ + public int getMessageKeysCount() { + return messageKeys_.size(); + } + /** + * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey getMessageKeys(int index) { + return messageKeys_.get(index); + } + /** + * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKeyOrBuilder getMessageKeysOrBuilder( + int index) { + return messageKeys_.get(index); + } + + private void initFields() { + senderRatchetKey_ = com.google.protobuf.ByteString.EMPTY; + senderRatchetKeyPrivate_ = com.google.protobuf.ByteString.EMPTY; + chainKey_ = org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.getDefaultInstance(); + messageKeys_ = java.util.Collections.emptyList(); + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, senderRatchetKey_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, senderRatchetKeyPrivate_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeMessage(3, chainKey_); + } + for (int i = 0; i < messageKeys_.size(); i++) { + output.writeMessage(4, messageKeys_.get(i)); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, senderRatchetKey_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, senderRatchetKeyPrivate_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, chainKey_); + } + for (int i = 0; i < messageKeys_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(4, messageKeys_.get(i)); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code textsecure.SessionStructure.Chain} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.ChainOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_Chain_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_Chain_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.class, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.Builder.class); + } + + // Construct using org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getChainKeyFieldBuilder(); + getMessageKeysFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + senderRatchetKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + senderRatchetKeyPrivate_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + if (chainKeyBuilder_ == null) { + chainKey_ = org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.getDefaultInstance(); + } else { + chainKeyBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + if (messageKeysBuilder_ == null) { + messageKeys_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000008); + } else { + messageKeysBuilder_.clear(); + } + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_Chain_descriptor; + } + + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain getDefaultInstanceForType() { + return org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.getDefaultInstance(); + } + + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain build() { + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain buildPartial() { + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain result = new org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.senderRatchetKey_ = senderRatchetKey_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.senderRatchetKeyPrivate_ = senderRatchetKeyPrivate_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + if (chainKeyBuilder_ == null) { + result.chainKey_ = chainKey_; + } else { + result.chainKey_ = chainKeyBuilder_.build(); + } + if (messageKeysBuilder_ == null) { + if (((bitField0_ & 0x00000008) == 0x00000008)) { + messageKeys_ = java.util.Collections.unmodifiableList(messageKeys_); + bitField0_ = (bitField0_ & ~0x00000008); + } + result.messageKeys_ = messageKeys_; + } else { + result.messageKeys_ = messageKeysBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain) { + return mergeFrom((org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain other) { + if (other == org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.getDefaultInstance()) return this; + if (other.hasSenderRatchetKey()) { + setSenderRatchetKey(other.getSenderRatchetKey()); + } + if (other.hasSenderRatchetKeyPrivate()) { + setSenderRatchetKeyPrivate(other.getSenderRatchetKeyPrivate()); + } + if (other.hasChainKey()) { + mergeChainKey(other.getChainKey()); + } + if (messageKeysBuilder_ == null) { + if (!other.messageKeys_.isEmpty()) { + if (messageKeys_.isEmpty()) { + messageKeys_ = other.messageKeys_; + bitField0_ = (bitField0_ & ~0x00000008); + } else { + ensureMessageKeysIsMutable(); + messageKeys_.addAll(other.messageKeys_); + } + onChanged(); + } + } else { + if (!other.messageKeys_.isEmpty()) { + if (messageKeysBuilder_.isEmpty()) { + messageKeysBuilder_.dispose(); + messageKeysBuilder_ = null; + messageKeys_ = other.messageKeys_; + bitField0_ = (bitField0_ & ~0x00000008); + messageKeysBuilder_ = + com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ? + getMessageKeysFieldBuilder() : null; + } else { + messageKeysBuilder_.addAllMessages(other.messageKeys_); + } + } + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional bytes senderRatchetKey = 1; + private com.google.protobuf.ByteString senderRatchetKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes senderRatchetKey = 1; + */ + public boolean hasSenderRatchetKey() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes senderRatchetKey = 1; + */ + public com.google.protobuf.ByteString getSenderRatchetKey() { + return senderRatchetKey_; + } + /** + * optional bytes senderRatchetKey = 1; + */ + public Builder setSenderRatchetKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + senderRatchetKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes senderRatchetKey = 1; + */ + public Builder clearSenderRatchetKey() { + bitField0_ = (bitField0_ & ~0x00000001); + senderRatchetKey_ = getDefaultInstance().getSenderRatchetKey(); + onChanged(); + return this; + } + + // optional bytes senderRatchetKeyPrivate = 2; + private com.google.protobuf.ByteString senderRatchetKeyPrivate_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes senderRatchetKeyPrivate = 2; + */ + public boolean hasSenderRatchetKeyPrivate() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes senderRatchetKeyPrivate = 2; + */ + public com.google.protobuf.ByteString getSenderRatchetKeyPrivate() { + return senderRatchetKeyPrivate_; + } + /** + * optional bytes senderRatchetKeyPrivate = 2; + */ + public Builder setSenderRatchetKeyPrivate(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + senderRatchetKeyPrivate_ = value; + onChanged(); + return this; + } + /** + * optional bytes senderRatchetKeyPrivate = 2; + */ + public Builder clearSenderRatchetKeyPrivate() { + bitField0_ = (bitField0_ & ~0x00000002); + senderRatchetKeyPrivate_ = getDefaultInstance().getSenderRatchetKeyPrivate(); + onChanged(); + return this; + } + + // optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3; + private org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey chainKey_ = org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.Builder, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKeyOrBuilder> chainKeyBuilder_; + /** + * optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3; + */ + public boolean hasChainKey() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey getChainKey() { + if (chainKeyBuilder_ == null) { + return chainKey_; + } else { + return chainKeyBuilder_.getMessage(); + } + } + /** + * optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3; + */ + public Builder setChainKey(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey value) { + if (chainKeyBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + chainKey_ = value; + onChanged(); + } else { + chainKeyBuilder_.setMessage(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3; + */ + public Builder setChainKey( + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.Builder builderForValue) { + if (chainKeyBuilder_ == null) { + chainKey_ = builderForValue.build(); + onChanged(); + } else { + chainKeyBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3; + */ + public Builder mergeChainKey(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey value) { + if (chainKeyBuilder_ == null) { + if (((bitField0_ & 0x00000004) == 0x00000004) && + chainKey_ != org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.getDefaultInstance()) { + chainKey_ = + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.newBuilder(chainKey_).mergeFrom(value).buildPartial(); + } else { + chainKey_ = value; + } + onChanged(); + } else { + chainKeyBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3; + */ + public Builder clearChainKey() { + if (chainKeyBuilder_ == null) { + chainKey_ = org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.getDefaultInstance(); + onChanged(); + } else { + chainKeyBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + /** + * optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.Builder getChainKeyBuilder() { + bitField0_ |= 0x00000004; + onChanged(); + return getChainKeyFieldBuilder().getBuilder(); + } + /** + * optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKeyOrBuilder getChainKeyOrBuilder() { + if (chainKeyBuilder_ != null) { + return chainKeyBuilder_.getMessageOrBuilder(); + } else { + return chainKey_; + } + } + /** + * optional .textsecure.SessionStructure.Chain.ChainKey chainKey = 3; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.Builder, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKeyOrBuilder> + getChainKeyFieldBuilder() { + if (chainKeyBuilder_ == null) { + chainKeyBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKey.Builder, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.ChainKeyOrBuilder>( + chainKey_, + getParentForChildren(), + isClean()); + chainKey_ = null; + } + return chainKeyBuilder_; + } + + // repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + private java.util.List messageKeys_ = + java.util.Collections.emptyList(); + private void ensureMessageKeysIsMutable() { + if (!((bitField0_ & 0x00000008) == 0x00000008)) { + messageKeys_ = new java.util.ArrayList(messageKeys_); + bitField0_ |= 0x00000008; + } + } + + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.Builder, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKeyOrBuilder> messageKeysBuilder_; + + /** + * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + */ + public java.util.List getMessageKeysList() { + if (messageKeysBuilder_ == null) { + return java.util.Collections.unmodifiableList(messageKeys_); + } else { + return messageKeysBuilder_.getMessageList(); + } + } + /** + * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + */ + public int getMessageKeysCount() { + if (messageKeysBuilder_ == null) { + return messageKeys_.size(); + } else { + return messageKeysBuilder_.getCount(); + } + } + /** + * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey getMessageKeys(int index) { + if (messageKeysBuilder_ == null) { + return messageKeys_.get(index); + } else { + return messageKeysBuilder_.getMessage(index); + } + } + /** + * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + */ + public Builder setMessageKeys( + int index, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey value) { + if (messageKeysBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureMessageKeysIsMutable(); + messageKeys_.set(index, value); + onChanged(); + } else { + messageKeysBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + */ + public Builder setMessageKeys( + int index, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.Builder builderForValue) { + if (messageKeysBuilder_ == null) { + ensureMessageKeysIsMutable(); + messageKeys_.set(index, builderForValue.build()); + onChanged(); + } else { + messageKeysBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + */ + public Builder addMessageKeys(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey value) { + if (messageKeysBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureMessageKeysIsMutable(); + messageKeys_.add(value); + onChanged(); + } else { + messageKeysBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + */ + public Builder addMessageKeys( + int index, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey value) { + if (messageKeysBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureMessageKeysIsMutable(); + messageKeys_.add(index, value); + onChanged(); + } else { + messageKeysBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + */ + public Builder addMessageKeys( + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.Builder builderForValue) { + if (messageKeysBuilder_ == null) { + ensureMessageKeysIsMutable(); + messageKeys_.add(builderForValue.build()); + onChanged(); + } else { + messageKeysBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + */ + public Builder addMessageKeys( + int index, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.Builder builderForValue) { + if (messageKeysBuilder_ == null) { + ensureMessageKeysIsMutable(); + messageKeys_.add(index, builderForValue.build()); + onChanged(); + } else { + messageKeysBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + */ + public Builder addAllMessageKeys( + Iterable values) { + if (messageKeysBuilder_ == null) { + ensureMessageKeysIsMutable(); + super.addAll(values, messageKeys_); + onChanged(); + } else { + messageKeysBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + */ + public Builder clearMessageKeys() { + if (messageKeysBuilder_ == null) { + messageKeys_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000008); + onChanged(); + } else { + messageKeysBuilder_.clear(); + } + return this; + } + /** + * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + */ + public Builder removeMessageKeys(int index) { + if (messageKeysBuilder_ == null) { + ensureMessageKeysIsMutable(); + messageKeys_.remove(index); + onChanged(); + } else { + messageKeysBuilder_.remove(index); + } + return this; + } + /** + * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.Builder getMessageKeysBuilder( + int index) { + return getMessageKeysFieldBuilder().getBuilder(index); + } + /** + * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKeyOrBuilder getMessageKeysOrBuilder( + int index) { + if (messageKeysBuilder_ == null) { + return messageKeys_.get(index); } else { + return messageKeysBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + */ + public java.util.List + getMessageKeysOrBuilderList() { + if (messageKeysBuilder_ != null) { + return messageKeysBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(messageKeys_); + } + } + /** + * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.Builder addMessageKeysBuilder() { + return getMessageKeysFieldBuilder().addBuilder( + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.getDefaultInstance()); + } + /** + * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.Builder addMessageKeysBuilder( + int index) { + return getMessageKeysFieldBuilder().addBuilder( + index, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.getDefaultInstance()); + } + /** + * repeated .textsecure.SessionStructure.Chain.MessageKey messageKeys = 4; + */ + public java.util.List + getMessageKeysBuilderList() { + return getMessageKeysFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.Builder, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKeyOrBuilder> + getMessageKeysFieldBuilder() { + if (messageKeysBuilder_ == null) { + messageKeysBuilder_ = new com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKey.Builder, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.MessageKeyOrBuilder>( + messageKeys_, + ((bitField0_ & 0x00000008) == 0x00000008), + getParentForChildren(), + isClean()); + messageKeys_ = null; + } + return messageKeysBuilder_; + } + + // @@protoc_insertion_point(builder_scope:textsecure.SessionStructure.Chain) + } + + static { + defaultInstance = new Chain(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:textsecure.SessionStructure.Chain) + } + + public interface PendingKeyExchangeOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional uint32 sequence = 1; + /** + * optional uint32 sequence = 1; + */ + boolean hasSequence(); + /** + * optional uint32 sequence = 1; + */ + int getSequence(); + + // optional bytes localBaseKey = 2; + /** + * optional bytes localBaseKey = 2; + */ + boolean hasLocalBaseKey(); + /** + * optional bytes localBaseKey = 2; + */ + com.google.protobuf.ByteString getLocalBaseKey(); + + // optional bytes localBaseKeyPrivate = 3; + /** + * optional bytes localBaseKeyPrivate = 3; + */ + boolean hasLocalBaseKeyPrivate(); + /** + * optional bytes localBaseKeyPrivate = 3; + */ + com.google.protobuf.ByteString getLocalBaseKeyPrivate(); + + // optional bytes localRatchetKey = 4; + /** + * optional bytes localRatchetKey = 4; + */ + boolean hasLocalRatchetKey(); + /** + * optional bytes localRatchetKey = 4; + */ + com.google.protobuf.ByteString getLocalRatchetKey(); + + // optional bytes localRatchetKeyPrivate = 5; + /** + * optional bytes localRatchetKeyPrivate = 5; + */ + boolean hasLocalRatchetKeyPrivate(); + /** + * optional bytes localRatchetKeyPrivate = 5; + */ + com.google.protobuf.ByteString getLocalRatchetKeyPrivate(); + + // optional bytes localIdentityKey = 7; + /** + * optional bytes localIdentityKey = 7; + */ + boolean hasLocalIdentityKey(); + /** + * optional bytes localIdentityKey = 7; + */ + com.google.protobuf.ByteString getLocalIdentityKey(); + + // optional bytes localIdentityKeyPrivate = 8; + /** + * optional bytes localIdentityKeyPrivate = 8; + */ + boolean hasLocalIdentityKeyPrivate(); + /** + * optional bytes localIdentityKeyPrivate = 8; + */ + com.google.protobuf.ByteString getLocalIdentityKeyPrivate(); + } + /** + * Protobuf type {@code textsecure.SessionStructure.PendingKeyExchange} + */ + public static final class PendingKeyExchange extends + com.google.protobuf.GeneratedMessage + implements PendingKeyExchangeOrBuilder { + // Use PendingKeyExchange.newBuilder() to construct. + private PendingKeyExchange(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private PendingKeyExchange(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final PendingKeyExchange defaultInstance; + public static PendingKeyExchange getDefaultInstance() { + return defaultInstance; + } + + public PendingKeyExchange getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private PendingKeyExchange( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + sequence_ = input.readUInt32(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + localBaseKey_ = input.readBytes(); + break; + } + case 26: { + bitField0_ |= 0x00000004; + localBaseKeyPrivate_ = input.readBytes(); + break; + } + case 34: { + bitField0_ |= 0x00000008; + localRatchetKey_ = input.readBytes(); + break; + } + case 42: { + bitField0_ |= 0x00000010; + localRatchetKeyPrivate_ = input.readBytes(); + break; + } + case 58: { + bitField0_ |= 0x00000020; + localIdentityKey_ = input.readBytes(); + break; + } + case 66: { + bitField0_ |= 0x00000040; + localIdentityKeyPrivate_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_PendingKeyExchange_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_PendingKeyExchange_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.class, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public PendingKeyExchange parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new PendingKeyExchange(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional uint32 sequence = 1; + public static final int SEQUENCE_FIELD_NUMBER = 1; + private int sequence_; + /** + * optional uint32 sequence = 1; + */ + public boolean hasSequence() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 sequence = 1; + */ + public int getSequence() { + return sequence_; + } + + // optional bytes localBaseKey = 2; + public static final int LOCALBASEKEY_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString localBaseKey_; + /** + * optional bytes localBaseKey = 2; + */ + public boolean hasLocalBaseKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes localBaseKey = 2; + */ + public com.google.protobuf.ByteString getLocalBaseKey() { + return localBaseKey_; + } + + // optional bytes localBaseKeyPrivate = 3; + public static final int LOCALBASEKEYPRIVATE_FIELD_NUMBER = 3; + private com.google.protobuf.ByteString localBaseKeyPrivate_; + /** + * optional bytes localBaseKeyPrivate = 3; + */ + public boolean hasLocalBaseKeyPrivate() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes localBaseKeyPrivate = 3; + */ + public com.google.protobuf.ByteString getLocalBaseKeyPrivate() { + return localBaseKeyPrivate_; + } + + // optional bytes localRatchetKey = 4; + public static final int LOCALRATCHETKEY_FIELD_NUMBER = 4; + private com.google.protobuf.ByteString localRatchetKey_; + /** + * optional bytes localRatchetKey = 4; + */ + public boolean hasLocalRatchetKey() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional bytes localRatchetKey = 4; + */ + public com.google.protobuf.ByteString getLocalRatchetKey() { + return localRatchetKey_; + } + + // optional bytes localRatchetKeyPrivate = 5; + public static final int LOCALRATCHETKEYPRIVATE_FIELD_NUMBER = 5; + private com.google.protobuf.ByteString localRatchetKeyPrivate_; + /** + * optional bytes localRatchetKeyPrivate = 5; + */ + public boolean hasLocalRatchetKeyPrivate() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional bytes localRatchetKeyPrivate = 5; + */ + public com.google.protobuf.ByteString getLocalRatchetKeyPrivate() { + return localRatchetKeyPrivate_; + } + + // optional bytes localIdentityKey = 7; + public static final int LOCALIDENTITYKEY_FIELD_NUMBER = 7; + private com.google.protobuf.ByteString localIdentityKey_; + /** + * optional bytes localIdentityKey = 7; + */ + public boolean hasLocalIdentityKey() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional bytes localIdentityKey = 7; + */ + public com.google.protobuf.ByteString getLocalIdentityKey() { + return localIdentityKey_; + } + + // optional bytes localIdentityKeyPrivate = 8; + public static final int LOCALIDENTITYKEYPRIVATE_FIELD_NUMBER = 8; + private com.google.protobuf.ByteString localIdentityKeyPrivate_; + /** + * optional bytes localIdentityKeyPrivate = 8; + */ + public boolean hasLocalIdentityKeyPrivate() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * optional bytes localIdentityKeyPrivate = 8; + */ + public com.google.protobuf.ByteString getLocalIdentityKeyPrivate() { + return localIdentityKeyPrivate_; + } + + private void initFields() { + sequence_ = 0; + localBaseKey_ = com.google.protobuf.ByteString.EMPTY; + localBaseKeyPrivate_ = com.google.protobuf.ByteString.EMPTY; + localRatchetKey_ = com.google.protobuf.ByteString.EMPTY; + localRatchetKeyPrivate_ = com.google.protobuf.ByteString.EMPTY; + localIdentityKey_ = com.google.protobuf.ByteString.EMPTY; + localIdentityKeyPrivate_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt32(1, sequence_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, localBaseKey_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(3, localBaseKeyPrivate_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeBytes(4, localRatchetKey_); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + output.writeBytes(5, localRatchetKeyPrivate_); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + output.writeBytes(7, localIdentityKey_); + } + if (((bitField0_ & 0x00000040) == 0x00000040)) { + output.writeBytes(8, localIdentityKeyPrivate_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, sequence_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, localBaseKey_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, localBaseKeyPrivate_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(4, localRatchetKey_); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(5, localRatchetKeyPrivate_); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(7, localIdentityKey_); + } + if (((bitField0_ & 0x00000040) == 0x00000040)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(8, localIdentityKeyPrivate_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code textsecure.SessionStructure.PendingKeyExchange} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchangeOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_PendingKeyExchange_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_PendingKeyExchange_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.class, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.Builder.class); + } + + // Construct using org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + sequence_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + localBaseKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + localBaseKeyPrivate_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000004); + localRatchetKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000008); + localRatchetKeyPrivate_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000010); + localIdentityKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000020); + localIdentityKeyPrivate_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000040); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_PendingKeyExchange_descriptor; + } + + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange getDefaultInstanceForType() { + return org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.getDefaultInstance(); + } + + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange build() { + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange buildPartial() { + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange result = new org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.sequence_ = sequence_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.localBaseKey_ = localBaseKey_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.localBaseKeyPrivate_ = localBaseKeyPrivate_; + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000008; + } + result.localRatchetKey_ = localRatchetKey_; + if (((from_bitField0_ & 0x00000010) == 0x00000010)) { + to_bitField0_ |= 0x00000010; + } + result.localRatchetKeyPrivate_ = localRatchetKeyPrivate_; + if (((from_bitField0_ & 0x00000020) == 0x00000020)) { + to_bitField0_ |= 0x00000020; + } + result.localIdentityKey_ = localIdentityKey_; + if (((from_bitField0_ & 0x00000040) == 0x00000040)) { + to_bitField0_ |= 0x00000040; + } + result.localIdentityKeyPrivate_ = localIdentityKeyPrivate_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange) { + return mergeFrom((org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange other) { + if (other == org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.getDefaultInstance()) return this; + if (other.hasSequence()) { + setSequence(other.getSequence()); + } + if (other.hasLocalBaseKey()) { + setLocalBaseKey(other.getLocalBaseKey()); + } + if (other.hasLocalBaseKeyPrivate()) { + setLocalBaseKeyPrivate(other.getLocalBaseKeyPrivate()); + } + if (other.hasLocalRatchetKey()) { + setLocalRatchetKey(other.getLocalRatchetKey()); + } + if (other.hasLocalRatchetKeyPrivate()) { + setLocalRatchetKeyPrivate(other.getLocalRatchetKeyPrivate()); + } + if (other.hasLocalIdentityKey()) { + setLocalIdentityKey(other.getLocalIdentityKey()); + } + if (other.hasLocalIdentityKeyPrivate()) { + setLocalIdentityKeyPrivate(other.getLocalIdentityKeyPrivate()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional uint32 sequence = 1; + private int sequence_ ; + /** + * optional uint32 sequence = 1; + */ + public boolean hasSequence() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 sequence = 1; + */ + public int getSequence() { + return sequence_; + } + /** + * optional uint32 sequence = 1; + */ + public Builder setSequence(int value) { + bitField0_ |= 0x00000001; + sequence_ = value; + onChanged(); + return this; + } + /** + * optional uint32 sequence = 1; + */ + public Builder clearSequence() { + bitField0_ = (bitField0_ & ~0x00000001); + sequence_ = 0; + onChanged(); + return this; + } + + // optional bytes localBaseKey = 2; + private com.google.protobuf.ByteString localBaseKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes localBaseKey = 2; + */ + public boolean hasLocalBaseKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes localBaseKey = 2; + */ + public com.google.protobuf.ByteString getLocalBaseKey() { + return localBaseKey_; + } + /** + * optional bytes localBaseKey = 2; + */ + public Builder setLocalBaseKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + localBaseKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes localBaseKey = 2; + */ + public Builder clearLocalBaseKey() { + bitField0_ = (bitField0_ & ~0x00000002); + localBaseKey_ = getDefaultInstance().getLocalBaseKey(); + onChanged(); + return this; + } + + // optional bytes localBaseKeyPrivate = 3; + private com.google.protobuf.ByteString localBaseKeyPrivate_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes localBaseKeyPrivate = 3; + */ + public boolean hasLocalBaseKeyPrivate() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes localBaseKeyPrivate = 3; + */ + public com.google.protobuf.ByteString getLocalBaseKeyPrivate() { + return localBaseKeyPrivate_; + } + /** + * optional bytes localBaseKeyPrivate = 3; + */ + public Builder setLocalBaseKeyPrivate(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + localBaseKeyPrivate_ = value; + onChanged(); + return this; + } + /** + * optional bytes localBaseKeyPrivate = 3; + */ + public Builder clearLocalBaseKeyPrivate() { + bitField0_ = (bitField0_ & ~0x00000004); + localBaseKeyPrivate_ = getDefaultInstance().getLocalBaseKeyPrivate(); + onChanged(); + return this; + } + + // optional bytes localRatchetKey = 4; + private com.google.protobuf.ByteString localRatchetKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes localRatchetKey = 4; + */ + public boolean hasLocalRatchetKey() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional bytes localRatchetKey = 4; + */ + public com.google.protobuf.ByteString getLocalRatchetKey() { + return localRatchetKey_; + } + /** + * optional bytes localRatchetKey = 4; + */ + public Builder setLocalRatchetKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + localRatchetKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes localRatchetKey = 4; + */ + public Builder clearLocalRatchetKey() { + bitField0_ = (bitField0_ & ~0x00000008); + localRatchetKey_ = getDefaultInstance().getLocalRatchetKey(); + onChanged(); + return this; + } + + // optional bytes localRatchetKeyPrivate = 5; + private com.google.protobuf.ByteString localRatchetKeyPrivate_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes localRatchetKeyPrivate = 5; + */ + public boolean hasLocalRatchetKeyPrivate() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional bytes localRatchetKeyPrivate = 5; + */ + public com.google.protobuf.ByteString getLocalRatchetKeyPrivate() { + return localRatchetKeyPrivate_; + } + /** + * optional bytes localRatchetKeyPrivate = 5; + */ + public Builder setLocalRatchetKeyPrivate(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000010; + localRatchetKeyPrivate_ = value; + onChanged(); + return this; + } + /** + * optional bytes localRatchetKeyPrivate = 5; + */ + public Builder clearLocalRatchetKeyPrivate() { + bitField0_ = (bitField0_ & ~0x00000010); + localRatchetKeyPrivate_ = getDefaultInstance().getLocalRatchetKeyPrivate(); + onChanged(); + return this; + } + + // optional bytes localIdentityKey = 7; + private com.google.protobuf.ByteString localIdentityKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes localIdentityKey = 7; + */ + public boolean hasLocalIdentityKey() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional bytes localIdentityKey = 7; + */ + public com.google.protobuf.ByteString getLocalIdentityKey() { + return localIdentityKey_; + } + /** + * optional bytes localIdentityKey = 7; + */ + public Builder setLocalIdentityKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000020; + localIdentityKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes localIdentityKey = 7; + */ + public Builder clearLocalIdentityKey() { + bitField0_ = (bitField0_ & ~0x00000020); + localIdentityKey_ = getDefaultInstance().getLocalIdentityKey(); + onChanged(); + return this; + } + + // optional bytes localIdentityKeyPrivate = 8; + private com.google.protobuf.ByteString localIdentityKeyPrivate_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes localIdentityKeyPrivate = 8; + */ + public boolean hasLocalIdentityKeyPrivate() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * optional bytes localIdentityKeyPrivate = 8; + */ + public com.google.protobuf.ByteString getLocalIdentityKeyPrivate() { + return localIdentityKeyPrivate_; + } + /** + * optional bytes localIdentityKeyPrivate = 8; + */ + public Builder setLocalIdentityKeyPrivate(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000040; + localIdentityKeyPrivate_ = value; + onChanged(); + return this; + } + /** + * optional bytes localIdentityKeyPrivate = 8; + */ + public Builder clearLocalIdentityKeyPrivate() { + bitField0_ = (bitField0_ & ~0x00000040); + localIdentityKeyPrivate_ = getDefaultInstance().getLocalIdentityKeyPrivate(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:textsecure.SessionStructure.PendingKeyExchange) + } + + static { + defaultInstance = new PendingKeyExchange(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:textsecure.SessionStructure.PendingKeyExchange) + } + + public interface PendingPreKeyOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional uint32 preKeyId = 1; + /** + * optional uint32 preKeyId = 1; + */ + boolean hasPreKeyId(); + /** + * optional uint32 preKeyId = 1; + */ + int getPreKeyId(); + + // optional int32 signedPreKeyId = 3; + /** + * optional int32 signedPreKeyId = 3; + */ + boolean hasSignedPreKeyId(); + /** + * optional int32 signedPreKeyId = 3; + */ + int getSignedPreKeyId(); + + // optional bytes baseKey = 2; + /** + * optional bytes baseKey = 2; + */ + boolean hasBaseKey(); + /** + * optional bytes baseKey = 2; + */ + com.google.protobuf.ByteString getBaseKey(); + } + /** + * Protobuf type {@code textsecure.SessionStructure.PendingPreKey} + */ + public static final class PendingPreKey extends + com.google.protobuf.GeneratedMessage + implements PendingPreKeyOrBuilder { + // Use PendingPreKey.newBuilder() to construct. + private PendingPreKey(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private PendingPreKey(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final PendingPreKey defaultInstance; + public static PendingPreKey getDefaultInstance() { + return defaultInstance; + } + + public PendingPreKey getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private PendingPreKey( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + preKeyId_ = input.readUInt32(); + break; + } + case 18: { + bitField0_ |= 0x00000004; + baseKey_ = input.readBytes(); + break; + } + case 24: { + bitField0_ |= 0x00000002; + signedPreKeyId_ = input.readInt32(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_PendingPreKey_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_PendingPreKey_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.class, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public PendingPreKey parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new PendingPreKey(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional uint32 preKeyId = 1; + public static final int PREKEYID_FIELD_NUMBER = 1; + private int preKeyId_; + /** + * optional uint32 preKeyId = 1; + */ + public boolean hasPreKeyId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 preKeyId = 1; + */ + public int getPreKeyId() { + return preKeyId_; + } + + // optional int32 signedPreKeyId = 3; + public static final int SIGNEDPREKEYID_FIELD_NUMBER = 3; + private int signedPreKeyId_; + /** + * optional int32 signedPreKeyId = 3; + */ + public boolean hasSignedPreKeyId() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional int32 signedPreKeyId = 3; + */ + public int getSignedPreKeyId() { + return signedPreKeyId_; + } + + // optional bytes baseKey = 2; + public static final int BASEKEY_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString baseKey_; + /** + * optional bytes baseKey = 2; + */ + public boolean hasBaseKey() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes baseKey = 2; + */ + public com.google.protobuf.ByteString getBaseKey() { + return baseKey_; + } + + private void initFields() { + preKeyId_ = 0; + signedPreKeyId_ = 0; + baseKey_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt32(1, preKeyId_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(2, baseKey_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeInt32(3, signedPreKeyId_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, preKeyId_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, baseKey_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeInt32Size(3, signedPreKeyId_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code textsecure.SessionStructure.PendingPreKey} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKeyOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_PendingPreKey_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_PendingPreKey_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.class, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.Builder.class); + } + + // Construct using org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + preKeyId_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + signedPreKeyId_ = 0; + bitField0_ = (bitField0_ & ~0x00000002); + baseKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_PendingPreKey_descriptor; + } + + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey getDefaultInstanceForType() { + return org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.getDefaultInstance(); + } + + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey build() { + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey buildPartial() { + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey result = new org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.preKeyId_ = preKeyId_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.signedPreKeyId_ = signedPreKeyId_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.baseKey_ = baseKey_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey) { + return mergeFrom((org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey other) { + if (other == org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.getDefaultInstance()) return this; + if (other.hasPreKeyId()) { + setPreKeyId(other.getPreKeyId()); + } + if (other.hasSignedPreKeyId()) { + setSignedPreKeyId(other.getSignedPreKeyId()); + } + if (other.hasBaseKey()) { + setBaseKey(other.getBaseKey()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional uint32 preKeyId = 1; + private int preKeyId_ ; + /** + * optional uint32 preKeyId = 1; + */ + public boolean hasPreKeyId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 preKeyId = 1; + */ + public int getPreKeyId() { + return preKeyId_; + } + /** + * optional uint32 preKeyId = 1; + */ + public Builder setPreKeyId(int value) { + bitField0_ |= 0x00000001; + preKeyId_ = value; + onChanged(); + return this; + } + /** + * optional uint32 preKeyId = 1; + */ + public Builder clearPreKeyId() { + bitField0_ = (bitField0_ & ~0x00000001); + preKeyId_ = 0; + onChanged(); + return this; + } + + // optional int32 signedPreKeyId = 3; + private int signedPreKeyId_ ; + /** + * optional int32 signedPreKeyId = 3; + */ + public boolean hasSignedPreKeyId() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional int32 signedPreKeyId = 3; + */ + public int getSignedPreKeyId() { + return signedPreKeyId_; + } + /** + * optional int32 signedPreKeyId = 3; + */ + public Builder setSignedPreKeyId(int value) { + bitField0_ |= 0x00000002; + signedPreKeyId_ = value; + onChanged(); + return this; + } + /** + * optional int32 signedPreKeyId = 3; + */ + public Builder clearSignedPreKeyId() { + bitField0_ = (bitField0_ & ~0x00000002); + signedPreKeyId_ = 0; + onChanged(); + return this; + } + + // optional bytes baseKey = 2; + private com.google.protobuf.ByteString baseKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes baseKey = 2; + */ + public boolean hasBaseKey() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes baseKey = 2; + */ + public com.google.protobuf.ByteString getBaseKey() { + return baseKey_; + } + /** + * optional bytes baseKey = 2; + */ + public Builder setBaseKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + baseKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes baseKey = 2; + */ + public Builder clearBaseKey() { + bitField0_ = (bitField0_ & ~0x00000004); + baseKey_ = getDefaultInstance().getBaseKey(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:textsecure.SessionStructure.PendingPreKey) + } + + static { + defaultInstance = new PendingPreKey(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:textsecure.SessionStructure.PendingPreKey) + } + + private int bitField0_; + // optional uint32 sessionVersion = 1; + public static final int SESSIONVERSION_FIELD_NUMBER = 1; + private int sessionVersion_; + /** + * optional uint32 sessionVersion = 1; + */ + public boolean hasSessionVersion() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 sessionVersion = 1; + */ + public int getSessionVersion() { + return sessionVersion_; + } + + // optional bytes localIdentityPublic = 2; + public static final int LOCALIDENTITYPUBLIC_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString localIdentityPublic_; + /** + * optional bytes localIdentityPublic = 2; + */ + public boolean hasLocalIdentityPublic() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes localIdentityPublic = 2; + */ + public com.google.protobuf.ByteString getLocalIdentityPublic() { + return localIdentityPublic_; + } + + // optional bytes remoteIdentityPublic = 3; + public static final int REMOTEIDENTITYPUBLIC_FIELD_NUMBER = 3; + private com.google.protobuf.ByteString remoteIdentityPublic_; + /** + * optional bytes remoteIdentityPublic = 3; + */ + public boolean hasRemoteIdentityPublic() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes remoteIdentityPublic = 3; + */ + public com.google.protobuf.ByteString getRemoteIdentityPublic() { + return remoteIdentityPublic_; + } + + // optional bytes rootKey = 4; + public static final int ROOTKEY_FIELD_NUMBER = 4; + private com.google.protobuf.ByteString rootKey_; + /** + * optional bytes rootKey = 4; + */ + public boolean hasRootKey() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional bytes rootKey = 4; + */ + public com.google.protobuf.ByteString getRootKey() { + return rootKey_; + } + + // optional uint32 previousCounter = 5; + public static final int PREVIOUSCOUNTER_FIELD_NUMBER = 5; + private int previousCounter_; + /** + * optional uint32 previousCounter = 5; + */ + public boolean hasPreviousCounter() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional uint32 previousCounter = 5; + */ + public int getPreviousCounter() { + return previousCounter_; + } + + // optional .textsecure.SessionStructure.Chain senderChain = 6; + public static final int SENDERCHAIN_FIELD_NUMBER = 6; + private org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain senderChain_; + /** + * optional .textsecure.SessionStructure.Chain senderChain = 6; + */ + public boolean hasSenderChain() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional .textsecure.SessionStructure.Chain senderChain = 6; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain getSenderChain() { + return senderChain_; + } + /** + * optional .textsecure.SessionStructure.Chain senderChain = 6; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.ChainOrBuilder getSenderChainOrBuilder() { + return senderChain_; + } + + // repeated .textsecure.SessionStructure.Chain receiverChains = 7; + public static final int RECEIVERCHAINS_FIELD_NUMBER = 7; + private java.util.List receiverChains_; + /** + * repeated .textsecure.SessionStructure.Chain receiverChains = 7; + */ + public java.util.List getReceiverChainsList() { + return receiverChains_; + } + /** + * repeated .textsecure.SessionStructure.Chain receiverChains = 7; + */ + public java.util.List + getReceiverChainsOrBuilderList() { + return receiverChains_; + } + /** + * repeated .textsecure.SessionStructure.Chain receiverChains = 7; + */ + public int getReceiverChainsCount() { + return receiverChains_.size(); + } + /** + * repeated .textsecure.SessionStructure.Chain receiverChains = 7; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain getReceiverChains(int index) { + return receiverChains_.get(index); + } + /** + * repeated .textsecure.SessionStructure.Chain receiverChains = 7; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.ChainOrBuilder getReceiverChainsOrBuilder( + int index) { + return receiverChains_.get(index); + } + + // optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8; + public static final int PENDINGKEYEXCHANGE_FIELD_NUMBER = 8; + private org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange pendingKeyExchange_; + /** + * optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8; + */ + public boolean hasPendingKeyExchange() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange getPendingKeyExchange() { + return pendingKeyExchange_; + } + /** + * optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchangeOrBuilder getPendingKeyExchangeOrBuilder() { + return pendingKeyExchange_; + } + + // optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9; + public static final int PENDINGPREKEY_FIELD_NUMBER = 9; + private org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey pendingPreKey_; + /** + * optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9; + */ + public boolean hasPendingPreKey() { + return ((bitField0_ & 0x00000080) == 0x00000080); + } + /** + * optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey getPendingPreKey() { + return pendingPreKey_; + } + /** + * optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKeyOrBuilder getPendingPreKeyOrBuilder() { + return pendingPreKey_; + } + + // optional uint32 remoteRegistrationId = 10; + public static final int REMOTEREGISTRATIONID_FIELD_NUMBER = 10; + private int remoteRegistrationId_; + /** + * optional uint32 remoteRegistrationId = 10; + */ + public boolean hasRemoteRegistrationId() { + return ((bitField0_ & 0x00000100) == 0x00000100); + } + /** + * optional uint32 remoteRegistrationId = 10; + */ + public int getRemoteRegistrationId() { + return remoteRegistrationId_; + } + + // optional uint32 localRegistrationId = 11; + public static final int LOCALREGISTRATIONID_FIELD_NUMBER = 11; + private int localRegistrationId_; + /** + * optional uint32 localRegistrationId = 11; + */ + public boolean hasLocalRegistrationId() { + return ((bitField0_ & 0x00000200) == 0x00000200); + } + /** + * optional uint32 localRegistrationId = 11; + */ + public int getLocalRegistrationId() { + return localRegistrationId_; + } + + // optional bool needsRefresh = 12; + public static final int NEEDSREFRESH_FIELD_NUMBER = 12; + private boolean needsRefresh_; + /** + * optional bool needsRefresh = 12; + */ + public boolean hasNeedsRefresh() { + return ((bitField0_ & 0x00000400) == 0x00000400); + } + /** + * optional bool needsRefresh = 12; + */ + public boolean getNeedsRefresh() { + return needsRefresh_; + } + + // optional bytes aliceBaseKey = 13; + public static final int ALICEBASEKEY_FIELD_NUMBER = 13; + private com.google.protobuf.ByteString aliceBaseKey_; + /** + * optional bytes aliceBaseKey = 13; + */ + public boolean hasAliceBaseKey() { + return ((bitField0_ & 0x00000800) == 0x00000800); + } + /** + * optional bytes aliceBaseKey = 13; + */ + public com.google.protobuf.ByteString getAliceBaseKey() { + return aliceBaseKey_; + } + + private void initFields() { + sessionVersion_ = 0; + localIdentityPublic_ = com.google.protobuf.ByteString.EMPTY; + remoteIdentityPublic_ = com.google.protobuf.ByteString.EMPTY; + rootKey_ = com.google.protobuf.ByteString.EMPTY; + previousCounter_ = 0; + senderChain_ = org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.getDefaultInstance(); + receiverChains_ = java.util.Collections.emptyList(); + pendingKeyExchange_ = org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.getDefaultInstance(); + pendingPreKey_ = org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.getDefaultInstance(); + remoteRegistrationId_ = 0; + localRegistrationId_ = 0; + needsRefresh_ = false; + aliceBaseKey_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt32(1, sessionVersion_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, localIdentityPublic_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(3, remoteIdentityPublic_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeBytes(4, rootKey_); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + output.writeUInt32(5, previousCounter_); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + output.writeMessage(6, senderChain_); + } + for (int i = 0; i < receiverChains_.size(); i++) { + output.writeMessage(7, receiverChains_.get(i)); + } + if (((bitField0_ & 0x00000040) == 0x00000040)) { + output.writeMessage(8, pendingKeyExchange_); + } + if (((bitField0_ & 0x00000080) == 0x00000080)) { + output.writeMessage(9, pendingPreKey_); + } + if (((bitField0_ & 0x00000100) == 0x00000100)) { + output.writeUInt32(10, remoteRegistrationId_); + } + if (((bitField0_ & 0x00000200) == 0x00000200)) { + output.writeUInt32(11, localRegistrationId_); + } + if (((bitField0_ & 0x00000400) == 0x00000400)) { + output.writeBool(12, needsRefresh_); + } + if (((bitField0_ & 0x00000800) == 0x00000800)) { + output.writeBytes(13, aliceBaseKey_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, sessionVersion_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, localIdentityPublic_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, remoteIdentityPublic_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(4, rootKey_); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(5, previousCounter_); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(6, senderChain_); + } + for (int i = 0; i < receiverChains_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(7, receiverChains_.get(i)); + } + if (((bitField0_ & 0x00000040) == 0x00000040)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(8, pendingKeyExchange_); + } + if (((bitField0_ & 0x00000080) == 0x00000080)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(9, pendingPreKey_); + } + if (((bitField0_ & 0x00000100) == 0x00000100)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(10, remoteRegistrationId_); + } + if (((bitField0_ & 0x00000200) == 0x00000200)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(11, localRegistrationId_); + } + if (((bitField0_ & 0x00000400) == 0x00000400)) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(12, needsRefresh_); + } + if (((bitField0_ & 0x00000800) == 0x00000800)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(13, aliceBaseKey_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SessionStructure parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code textsecure.SessionStructure} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.libsignal.state.StorageProtos.SessionStructureOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.class, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Builder.class); + } + + // Construct using org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getSenderChainFieldBuilder(); + getReceiverChainsFieldBuilder(); + getPendingKeyExchangeFieldBuilder(); + getPendingPreKeyFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + sessionVersion_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + localIdentityPublic_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + remoteIdentityPublic_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000004); + rootKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000008); + previousCounter_ = 0; + bitField0_ = (bitField0_ & ~0x00000010); + if (senderChainBuilder_ == null) { + senderChain_ = org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.getDefaultInstance(); + } else { + senderChainBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000020); + if (receiverChainsBuilder_ == null) { + receiverChains_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000040); + } else { + receiverChainsBuilder_.clear(); + } + if (pendingKeyExchangeBuilder_ == null) { + pendingKeyExchange_ = org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.getDefaultInstance(); + } else { + pendingKeyExchangeBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000080); + if (pendingPreKeyBuilder_ == null) { + pendingPreKey_ = org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.getDefaultInstance(); + } else { + pendingPreKeyBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000100); + remoteRegistrationId_ = 0; + bitField0_ = (bitField0_ & ~0x00000200); + localRegistrationId_ = 0; + bitField0_ = (bitField0_ & ~0x00000400); + needsRefresh_ = false; + bitField0_ = (bitField0_ & ~0x00000800); + aliceBaseKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00001000); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SessionStructure_descriptor; + } + + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure getDefaultInstanceForType() { + return org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.getDefaultInstance(); + } + + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure build() { + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure buildPartial() { + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure result = new org.session.libsignal.libsignal.state.StorageProtos.SessionStructure(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.sessionVersion_ = sessionVersion_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.localIdentityPublic_ = localIdentityPublic_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.remoteIdentityPublic_ = remoteIdentityPublic_; + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000008; + } + result.rootKey_ = rootKey_; + if (((from_bitField0_ & 0x00000010) == 0x00000010)) { + to_bitField0_ |= 0x00000010; + } + result.previousCounter_ = previousCounter_; + if (((from_bitField0_ & 0x00000020) == 0x00000020)) { + to_bitField0_ |= 0x00000020; + } + if (senderChainBuilder_ == null) { + result.senderChain_ = senderChain_; + } else { + result.senderChain_ = senderChainBuilder_.build(); + } + if (receiverChainsBuilder_ == null) { + if (((bitField0_ & 0x00000040) == 0x00000040)) { + receiverChains_ = java.util.Collections.unmodifiableList(receiverChains_); + bitField0_ = (bitField0_ & ~0x00000040); + } + result.receiverChains_ = receiverChains_; + } else { + result.receiverChains_ = receiverChainsBuilder_.build(); + } + if (((from_bitField0_ & 0x00000080) == 0x00000080)) { + to_bitField0_ |= 0x00000040; + } + if (pendingKeyExchangeBuilder_ == null) { + result.pendingKeyExchange_ = pendingKeyExchange_; + } else { + result.pendingKeyExchange_ = pendingKeyExchangeBuilder_.build(); + } + if (((from_bitField0_ & 0x00000100) == 0x00000100)) { + to_bitField0_ |= 0x00000080; + } + if (pendingPreKeyBuilder_ == null) { + result.pendingPreKey_ = pendingPreKey_; + } else { + result.pendingPreKey_ = pendingPreKeyBuilder_.build(); + } + if (((from_bitField0_ & 0x00000200) == 0x00000200)) { + to_bitField0_ |= 0x00000100; + } + result.remoteRegistrationId_ = remoteRegistrationId_; + if (((from_bitField0_ & 0x00000400) == 0x00000400)) { + to_bitField0_ |= 0x00000200; + } + result.localRegistrationId_ = localRegistrationId_; + if (((from_bitField0_ & 0x00000800) == 0x00000800)) { + to_bitField0_ |= 0x00000400; + } + result.needsRefresh_ = needsRefresh_; + if (((from_bitField0_ & 0x00001000) == 0x00001000)) { + to_bitField0_ |= 0x00000800; + } + result.aliceBaseKey_ = aliceBaseKey_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.libsignal.state.StorageProtos.SessionStructure) { + return mergeFrom((org.session.libsignal.libsignal.state.StorageProtos.SessionStructure)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure other) { + if (other == org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.getDefaultInstance()) return this; + if (other.hasSessionVersion()) { + setSessionVersion(other.getSessionVersion()); + } + if (other.hasLocalIdentityPublic()) { + setLocalIdentityPublic(other.getLocalIdentityPublic()); + } + if (other.hasRemoteIdentityPublic()) { + setRemoteIdentityPublic(other.getRemoteIdentityPublic()); + } + if (other.hasRootKey()) { + setRootKey(other.getRootKey()); + } + if (other.hasPreviousCounter()) { + setPreviousCounter(other.getPreviousCounter()); + } + if (other.hasSenderChain()) { + mergeSenderChain(other.getSenderChain()); + } + if (receiverChainsBuilder_ == null) { + if (!other.receiverChains_.isEmpty()) { + if (receiverChains_.isEmpty()) { + receiverChains_ = other.receiverChains_; + bitField0_ = (bitField0_ & ~0x00000040); + } else { + ensureReceiverChainsIsMutable(); + receiverChains_.addAll(other.receiverChains_); + } + onChanged(); + } + } else { + if (!other.receiverChains_.isEmpty()) { + if (receiverChainsBuilder_.isEmpty()) { + receiverChainsBuilder_.dispose(); + receiverChainsBuilder_ = null; + receiverChains_ = other.receiverChains_; + bitField0_ = (bitField0_ & ~0x00000040); + receiverChainsBuilder_ = + com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ? + getReceiverChainsFieldBuilder() : null; + } else { + receiverChainsBuilder_.addAllMessages(other.receiverChains_); + } + } + } + if (other.hasPendingKeyExchange()) { + mergePendingKeyExchange(other.getPendingKeyExchange()); + } + if (other.hasPendingPreKey()) { + mergePendingPreKey(other.getPendingPreKey()); + } + if (other.hasRemoteRegistrationId()) { + setRemoteRegistrationId(other.getRemoteRegistrationId()); + } + if (other.hasLocalRegistrationId()) { + setLocalRegistrationId(other.getLocalRegistrationId()); + } + if (other.hasNeedsRefresh()) { + setNeedsRefresh(other.getNeedsRefresh()); + } + if (other.hasAliceBaseKey()) { + setAliceBaseKey(other.getAliceBaseKey()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.libsignal.state.StorageProtos.SessionStructure) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional uint32 sessionVersion = 1; + private int sessionVersion_ ; + /** + * optional uint32 sessionVersion = 1; + */ + public boolean hasSessionVersion() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 sessionVersion = 1; + */ + public int getSessionVersion() { + return sessionVersion_; + } + /** + * optional uint32 sessionVersion = 1; + */ + public Builder setSessionVersion(int value) { + bitField0_ |= 0x00000001; + sessionVersion_ = value; + onChanged(); + return this; + } + /** + * optional uint32 sessionVersion = 1; + */ + public Builder clearSessionVersion() { + bitField0_ = (bitField0_ & ~0x00000001); + sessionVersion_ = 0; + onChanged(); + return this; + } + + // optional bytes localIdentityPublic = 2; + private com.google.protobuf.ByteString localIdentityPublic_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes localIdentityPublic = 2; + */ + public boolean hasLocalIdentityPublic() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes localIdentityPublic = 2; + */ + public com.google.protobuf.ByteString getLocalIdentityPublic() { + return localIdentityPublic_; + } + /** + * optional bytes localIdentityPublic = 2; + */ + public Builder setLocalIdentityPublic(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + localIdentityPublic_ = value; + onChanged(); + return this; + } + /** + * optional bytes localIdentityPublic = 2; + */ + public Builder clearLocalIdentityPublic() { + bitField0_ = (bitField0_ & ~0x00000002); + localIdentityPublic_ = getDefaultInstance().getLocalIdentityPublic(); + onChanged(); + return this; + } + + // optional bytes remoteIdentityPublic = 3; + private com.google.protobuf.ByteString remoteIdentityPublic_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes remoteIdentityPublic = 3; + */ + public boolean hasRemoteIdentityPublic() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes remoteIdentityPublic = 3; + */ + public com.google.protobuf.ByteString getRemoteIdentityPublic() { + return remoteIdentityPublic_; + } + /** + * optional bytes remoteIdentityPublic = 3; + */ + public Builder setRemoteIdentityPublic(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + remoteIdentityPublic_ = value; + onChanged(); + return this; + } + /** + * optional bytes remoteIdentityPublic = 3; + */ + public Builder clearRemoteIdentityPublic() { + bitField0_ = (bitField0_ & ~0x00000004); + remoteIdentityPublic_ = getDefaultInstance().getRemoteIdentityPublic(); + onChanged(); + return this; + } + + // optional bytes rootKey = 4; + private com.google.protobuf.ByteString rootKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes rootKey = 4; + */ + public boolean hasRootKey() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional bytes rootKey = 4; + */ + public com.google.protobuf.ByteString getRootKey() { + return rootKey_; + } + /** + * optional bytes rootKey = 4; + */ + public Builder setRootKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + rootKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes rootKey = 4; + */ + public Builder clearRootKey() { + bitField0_ = (bitField0_ & ~0x00000008); + rootKey_ = getDefaultInstance().getRootKey(); + onChanged(); + return this; + } + + // optional uint32 previousCounter = 5; + private int previousCounter_ ; + /** + * optional uint32 previousCounter = 5; + */ + public boolean hasPreviousCounter() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional uint32 previousCounter = 5; + */ + public int getPreviousCounter() { + return previousCounter_; + } + /** + * optional uint32 previousCounter = 5; + */ + public Builder setPreviousCounter(int value) { + bitField0_ |= 0x00000010; + previousCounter_ = value; + onChanged(); + return this; + } + /** + * optional uint32 previousCounter = 5; + */ + public Builder clearPreviousCounter() { + bitField0_ = (bitField0_ & ~0x00000010); + previousCounter_ = 0; + onChanged(); + return this; + } + + // optional .textsecure.SessionStructure.Chain senderChain = 6; + private org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain senderChain_ = org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.Builder, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.ChainOrBuilder> senderChainBuilder_; + /** + * optional .textsecure.SessionStructure.Chain senderChain = 6; + */ + public boolean hasSenderChain() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional .textsecure.SessionStructure.Chain senderChain = 6; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain getSenderChain() { + if (senderChainBuilder_ == null) { + return senderChain_; + } else { + return senderChainBuilder_.getMessage(); + } + } + /** + * optional .textsecure.SessionStructure.Chain senderChain = 6; + */ + public Builder setSenderChain(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain value) { + if (senderChainBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + senderChain_ = value; + onChanged(); + } else { + senderChainBuilder_.setMessage(value); + } + bitField0_ |= 0x00000020; + return this; + } + /** + * optional .textsecure.SessionStructure.Chain senderChain = 6; + */ + public Builder setSenderChain( + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.Builder builderForValue) { + if (senderChainBuilder_ == null) { + senderChain_ = builderForValue.build(); + onChanged(); + } else { + senderChainBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000020; + return this; + } + /** + * optional .textsecure.SessionStructure.Chain senderChain = 6; + */ + public Builder mergeSenderChain(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain value) { + if (senderChainBuilder_ == null) { + if (((bitField0_ & 0x00000020) == 0x00000020) && + senderChain_ != org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.getDefaultInstance()) { + senderChain_ = + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.newBuilder(senderChain_).mergeFrom(value).buildPartial(); + } else { + senderChain_ = value; + } + onChanged(); + } else { + senderChainBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000020; + return this; + } + /** + * optional .textsecure.SessionStructure.Chain senderChain = 6; + */ + public Builder clearSenderChain() { + if (senderChainBuilder_ == null) { + senderChain_ = org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.getDefaultInstance(); + onChanged(); + } else { + senderChainBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000020); + return this; + } + /** + * optional .textsecure.SessionStructure.Chain senderChain = 6; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.Builder getSenderChainBuilder() { + bitField0_ |= 0x00000020; + onChanged(); + return getSenderChainFieldBuilder().getBuilder(); + } + /** + * optional .textsecure.SessionStructure.Chain senderChain = 6; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.ChainOrBuilder getSenderChainOrBuilder() { + if (senderChainBuilder_ != null) { + return senderChainBuilder_.getMessageOrBuilder(); + } else { + return senderChain_; + } + } + /** + * optional .textsecure.SessionStructure.Chain senderChain = 6; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.Builder, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.ChainOrBuilder> + getSenderChainFieldBuilder() { + if (senderChainBuilder_ == null) { + senderChainBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.Builder, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.ChainOrBuilder>( + senderChain_, + getParentForChildren(), + isClean()); + senderChain_ = null; + } + return senderChainBuilder_; + } + + // repeated .textsecure.SessionStructure.Chain receiverChains = 7; + private java.util.List receiverChains_ = + java.util.Collections.emptyList(); + private void ensureReceiverChainsIsMutable() { + if (!((bitField0_ & 0x00000040) == 0x00000040)) { + receiverChains_ = new java.util.ArrayList(receiverChains_); + bitField0_ |= 0x00000040; + } + } + + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.Builder, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.ChainOrBuilder> receiverChainsBuilder_; + + /** + * repeated .textsecure.SessionStructure.Chain receiverChains = 7; + */ + public java.util.List getReceiverChainsList() { + if (receiverChainsBuilder_ == null) { + return java.util.Collections.unmodifiableList(receiverChains_); + } else { + return receiverChainsBuilder_.getMessageList(); + } + } + /** + * repeated .textsecure.SessionStructure.Chain receiverChains = 7; + */ + public int getReceiverChainsCount() { + if (receiverChainsBuilder_ == null) { + return receiverChains_.size(); + } else { + return receiverChainsBuilder_.getCount(); + } + } + /** + * repeated .textsecure.SessionStructure.Chain receiverChains = 7; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain getReceiverChains(int index) { + if (receiverChainsBuilder_ == null) { + return receiverChains_.get(index); + } else { + return receiverChainsBuilder_.getMessage(index); + } + } + /** + * repeated .textsecure.SessionStructure.Chain receiverChains = 7; + */ + public Builder setReceiverChains( + int index, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain value) { + if (receiverChainsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureReceiverChainsIsMutable(); + receiverChains_.set(index, value); + onChanged(); + } else { + receiverChainsBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .textsecure.SessionStructure.Chain receiverChains = 7; + */ + public Builder setReceiverChains( + int index, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.Builder builderForValue) { + if (receiverChainsBuilder_ == null) { + ensureReceiverChainsIsMutable(); + receiverChains_.set(index, builderForValue.build()); + onChanged(); + } else { + receiverChainsBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .textsecure.SessionStructure.Chain receiverChains = 7; + */ + public Builder addReceiverChains(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain value) { + if (receiverChainsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureReceiverChainsIsMutable(); + receiverChains_.add(value); + onChanged(); + } else { + receiverChainsBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .textsecure.SessionStructure.Chain receiverChains = 7; + */ + public Builder addReceiverChains( + int index, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain value) { + if (receiverChainsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureReceiverChainsIsMutable(); + receiverChains_.add(index, value); + onChanged(); + } else { + receiverChainsBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .textsecure.SessionStructure.Chain receiverChains = 7; + */ + public Builder addReceiverChains( + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.Builder builderForValue) { + if (receiverChainsBuilder_ == null) { + ensureReceiverChainsIsMutable(); + receiverChains_.add(builderForValue.build()); + onChanged(); + } else { + receiverChainsBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .textsecure.SessionStructure.Chain receiverChains = 7; + */ + public Builder addReceiverChains( + int index, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.Builder builderForValue) { + if (receiverChainsBuilder_ == null) { + ensureReceiverChainsIsMutable(); + receiverChains_.add(index, builderForValue.build()); + onChanged(); + } else { + receiverChainsBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .textsecure.SessionStructure.Chain receiverChains = 7; + */ + public Builder addAllReceiverChains( + Iterable values) { + if (receiverChainsBuilder_ == null) { + ensureReceiverChainsIsMutable(); + super.addAll(values, receiverChains_); + onChanged(); + } else { + receiverChainsBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .textsecure.SessionStructure.Chain receiverChains = 7; + */ + public Builder clearReceiverChains() { + if (receiverChainsBuilder_ == null) { + receiverChains_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000040); + onChanged(); + } else { + receiverChainsBuilder_.clear(); + } + return this; + } + /** + * repeated .textsecure.SessionStructure.Chain receiverChains = 7; + */ + public Builder removeReceiverChains(int index) { + if (receiverChainsBuilder_ == null) { + ensureReceiverChainsIsMutable(); + receiverChains_.remove(index); + onChanged(); + } else { + receiverChainsBuilder_.remove(index); + } + return this; + } + /** + * repeated .textsecure.SessionStructure.Chain receiverChains = 7; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.Builder getReceiverChainsBuilder( + int index) { + return getReceiverChainsFieldBuilder().getBuilder(index); + } + /** + * repeated .textsecure.SessionStructure.Chain receiverChains = 7; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.ChainOrBuilder getReceiverChainsOrBuilder( + int index) { + if (receiverChainsBuilder_ == null) { + return receiverChains_.get(index); } else { + return receiverChainsBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .textsecure.SessionStructure.Chain receiverChains = 7; + */ + public java.util.List + getReceiverChainsOrBuilderList() { + if (receiverChainsBuilder_ != null) { + return receiverChainsBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(receiverChains_); + } + } + /** + * repeated .textsecure.SessionStructure.Chain receiverChains = 7; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.Builder addReceiverChainsBuilder() { + return getReceiverChainsFieldBuilder().addBuilder( + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.getDefaultInstance()); + } + /** + * repeated .textsecure.SessionStructure.Chain receiverChains = 7; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.Builder addReceiverChainsBuilder( + int index) { + return getReceiverChainsFieldBuilder().addBuilder( + index, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.getDefaultInstance()); + } + /** + * repeated .textsecure.SessionStructure.Chain receiverChains = 7; + */ + public java.util.List + getReceiverChainsBuilderList() { + return getReceiverChainsFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.Builder, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.ChainOrBuilder> + getReceiverChainsFieldBuilder() { + if (receiverChainsBuilder_ == null) { + receiverChainsBuilder_ = new com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Chain.Builder, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.ChainOrBuilder>( + receiverChains_, + ((bitField0_ & 0x00000040) == 0x00000040), + getParentForChildren(), + isClean()); + receiverChains_ = null; + } + return receiverChainsBuilder_; + } + + // optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8; + private org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange pendingKeyExchange_ = org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.Builder, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchangeOrBuilder> pendingKeyExchangeBuilder_; + /** + * optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8; + */ + public boolean hasPendingKeyExchange() { + return ((bitField0_ & 0x00000080) == 0x00000080); + } + /** + * optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange getPendingKeyExchange() { + if (pendingKeyExchangeBuilder_ == null) { + return pendingKeyExchange_; + } else { + return pendingKeyExchangeBuilder_.getMessage(); + } + } + /** + * optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8; + */ + public Builder setPendingKeyExchange(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange value) { + if (pendingKeyExchangeBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + pendingKeyExchange_ = value; + onChanged(); + } else { + pendingKeyExchangeBuilder_.setMessage(value); + } + bitField0_ |= 0x00000080; + return this; + } + /** + * optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8; + */ + public Builder setPendingKeyExchange( + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.Builder builderForValue) { + if (pendingKeyExchangeBuilder_ == null) { + pendingKeyExchange_ = builderForValue.build(); + onChanged(); + } else { + pendingKeyExchangeBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000080; + return this; + } + /** + * optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8; + */ + public Builder mergePendingKeyExchange(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange value) { + if (pendingKeyExchangeBuilder_ == null) { + if (((bitField0_ & 0x00000080) == 0x00000080) && + pendingKeyExchange_ != org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.getDefaultInstance()) { + pendingKeyExchange_ = + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.newBuilder(pendingKeyExchange_).mergeFrom(value).buildPartial(); + } else { + pendingKeyExchange_ = value; + } + onChanged(); + } else { + pendingKeyExchangeBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000080; + return this; + } + /** + * optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8; + */ + public Builder clearPendingKeyExchange() { + if (pendingKeyExchangeBuilder_ == null) { + pendingKeyExchange_ = org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.getDefaultInstance(); + onChanged(); + } else { + pendingKeyExchangeBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000080); + return this; + } + /** + * optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.Builder getPendingKeyExchangeBuilder() { + bitField0_ |= 0x00000080; + onChanged(); + return getPendingKeyExchangeFieldBuilder().getBuilder(); + } + /** + * optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchangeOrBuilder getPendingKeyExchangeOrBuilder() { + if (pendingKeyExchangeBuilder_ != null) { + return pendingKeyExchangeBuilder_.getMessageOrBuilder(); + } else { + return pendingKeyExchange_; + } + } + /** + * optional .textsecure.SessionStructure.PendingKeyExchange pendingKeyExchange = 8; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.Builder, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchangeOrBuilder> + getPendingKeyExchangeFieldBuilder() { + if (pendingKeyExchangeBuilder_ == null) { + pendingKeyExchangeBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchange.Builder, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingKeyExchangeOrBuilder>( + pendingKeyExchange_, + getParentForChildren(), + isClean()); + pendingKeyExchange_ = null; + } + return pendingKeyExchangeBuilder_; + } + + // optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9; + private org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey pendingPreKey_ = org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.Builder, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKeyOrBuilder> pendingPreKeyBuilder_; + /** + * optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9; + */ + public boolean hasPendingPreKey() { + return ((bitField0_ & 0x00000100) == 0x00000100); + } + /** + * optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey getPendingPreKey() { + if (pendingPreKeyBuilder_ == null) { + return pendingPreKey_; + } else { + return pendingPreKeyBuilder_.getMessage(); + } + } + /** + * optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9; + */ + public Builder setPendingPreKey(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey value) { + if (pendingPreKeyBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + pendingPreKey_ = value; + onChanged(); + } else { + pendingPreKeyBuilder_.setMessage(value); + } + bitField0_ |= 0x00000100; + return this; + } + /** + * optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9; + */ + public Builder setPendingPreKey( + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.Builder builderForValue) { + if (pendingPreKeyBuilder_ == null) { + pendingPreKey_ = builderForValue.build(); + onChanged(); + } else { + pendingPreKeyBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000100; + return this; + } + /** + * optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9; + */ + public Builder mergePendingPreKey(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey value) { + if (pendingPreKeyBuilder_ == null) { + if (((bitField0_ & 0x00000100) == 0x00000100) && + pendingPreKey_ != org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.getDefaultInstance()) { + pendingPreKey_ = + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.newBuilder(pendingPreKey_).mergeFrom(value).buildPartial(); + } else { + pendingPreKey_ = value; + } + onChanged(); + } else { + pendingPreKeyBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000100; + return this; + } + /** + * optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9; + */ + public Builder clearPendingPreKey() { + if (pendingPreKeyBuilder_ == null) { + pendingPreKey_ = org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.getDefaultInstance(); + onChanged(); + } else { + pendingPreKeyBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000100); + return this; + } + /** + * optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.Builder getPendingPreKeyBuilder() { + bitField0_ |= 0x00000100; + onChanged(); + return getPendingPreKeyFieldBuilder().getBuilder(); + } + /** + * optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKeyOrBuilder getPendingPreKeyOrBuilder() { + if (pendingPreKeyBuilder_ != null) { + return pendingPreKeyBuilder_.getMessageOrBuilder(); + } else { + return pendingPreKey_; + } + } + /** + * optional .textsecure.SessionStructure.PendingPreKey pendingPreKey = 9; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.Builder, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKeyOrBuilder> + getPendingPreKeyFieldBuilder() { + if (pendingPreKeyBuilder_ == null) { + pendingPreKeyBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKey.Builder, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PendingPreKeyOrBuilder>( + pendingPreKey_, + getParentForChildren(), + isClean()); + pendingPreKey_ = null; + } + return pendingPreKeyBuilder_; + } + + // optional uint32 remoteRegistrationId = 10; + private int remoteRegistrationId_ ; + /** + * optional uint32 remoteRegistrationId = 10; + */ + public boolean hasRemoteRegistrationId() { + return ((bitField0_ & 0x00000200) == 0x00000200); + } + /** + * optional uint32 remoteRegistrationId = 10; + */ + public int getRemoteRegistrationId() { + return remoteRegistrationId_; + } + /** + * optional uint32 remoteRegistrationId = 10; + */ + public Builder setRemoteRegistrationId(int value) { + bitField0_ |= 0x00000200; + remoteRegistrationId_ = value; + onChanged(); + return this; + } + /** + * optional uint32 remoteRegistrationId = 10; + */ + public Builder clearRemoteRegistrationId() { + bitField0_ = (bitField0_ & ~0x00000200); + remoteRegistrationId_ = 0; + onChanged(); + return this; + } + + // optional uint32 localRegistrationId = 11; + private int localRegistrationId_ ; + /** + * optional uint32 localRegistrationId = 11; + */ + public boolean hasLocalRegistrationId() { + return ((bitField0_ & 0x00000400) == 0x00000400); + } + /** + * optional uint32 localRegistrationId = 11; + */ + public int getLocalRegistrationId() { + return localRegistrationId_; + } + /** + * optional uint32 localRegistrationId = 11; + */ + public Builder setLocalRegistrationId(int value) { + bitField0_ |= 0x00000400; + localRegistrationId_ = value; + onChanged(); + return this; + } + /** + * optional uint32 localRegistrationId = 11; + */ + public Builder clearLocalRegistrationId() { + bitField0_ = (bitField0_ & ~0x00000400); + localRegistrationId_ = 0; + onChanged(); + return this; + } + + // optional bool needsRefresh = 12; + private boolean needsRefresh_ ; + /** + * optional bool needsRefresh = 12; + */ + public boolean hasNeedsRefresh() { + return ((bitField0_ & 0x00000800) == 0x00000800); + } + /** + * optional bool needsRefresh = 12; + */ + public boolean getNeedsRefresh() { + return needsRefresh_; + } + /** + * optional bool needsRefresh = 12; + */ + public Builder setNeedsRefresh(boolean value) { + bitField0_ |= 0x00000800; + needsRefresh_ = value; + onChanged(); + return this; + } + /** + * optional bool needsRefresh = 12; + */ + public Builder clearNeedsRefresh() { + bitField0_ = (bitField0_ & ~0x00000800); + needsRefresh_ = false; + onChanged(); + return this; + } + + // optional bytes aliceBaseKey = 13; + private com.google.protobuf.ByteString aliceBaseKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes aliceBaseKey = 13; + */ + public boolean hasAliceBaseKey() { + return ((bitField0_ & 0x00001000) == 0x00001000); + } + /** + * optional bytes aliceBaseKey = 13; + */ + public com.google.protobuf.ByteString getAliceBaseKey() { + return aliceBaseKey_; + } + /** + * optional bytes aliceBaseKey = 13; + */ + public Builder setAliceBaseKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00001000; + aliceBaseKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes aliceBaseKey = 13; + */ + public Builder clearAliceBaseKey() { + bitField0_ = (bitField0_ & ~0x00001000); + aliceBaseKey_ = getDefaultInstance().getAliceBaseKey(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:textsecure.SessionStructure) + } + + static { + defaultInstance = new SessionStructure(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:textsecure.SessionStructure) + } + + public interface RecordStructureOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional .textsecure.SessionStructure currentSession = 1; + /** + * optional .textsecure.SessionStructure currentSession = 1; + */ + boolean hasCurrentSession(); + /** + * optional .textsecure.SessionStructure currentSession = 1; + */ + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure getCurrentSession(); + /** + * optional .textsecure.SessionStructure currentSession = 1; + */ + org.session.libsignal.libsignal.state.StorageProtos.SessionStructureOrBuilder getCurrentSessionOrBuilder(); + + // repeated .textsecure.SessionStructure previousSessions = 2; + /** + * repeated .textsecure.SessionStructure previousSessions = 2; + */ + java.util.List + getPreviousSessionsList(); + /** + * repeated .textsecure.SessionStructure previousSessions = 2; + */ + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure getPreviousSessions(int index); + /** + * repeated .textsecure.SessionStructure previousSessions = 2; + */ + int getPreviousSessionsCount(); + /** + * repeated .textsecure.SessionStructure previousSessions = 2; + */ + java.util.List + getPreviousSessionsOrBuilderList(); + /** + * repeated .textsecure.SessionStructure previousSessions = 2; + */ + org.session.libsignal.libsignal.state.StorageProtos.SessionStructureOrBuilder getPreviousSessionsOrBuilder( + int index); + } + /** + * Protobuf type {@code textsecure.RecordStructure} + */ + public static final class RecordStructure extends + com.google.protobuf.GeneratedMessage + implements RecordStructureOrBuilder { + // Use RecordStructure.newBuilder() to construct. + private RecordStructure(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private RecordStructure(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final RecordStructure defaultInstance; + public static RecordStructure getDefaultInstance() { + return defaultInstance; + } + + public RecordStructure getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private RecordStructure( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Builder subBuilder = null; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + subBuilder = currentSession_.toBuilder(); + } + currentSession_ = input.readMessage(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(currentSession_); + currentSession_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000001; + break; + } + case 18: { + if (!((mutable_bitField0_ & 0x00000002) == 0x00000002)) { + previousSessions_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000002; + } + previousSessions_.add(input.readMessage(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.PARSER, extensionRegistry)); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000002) == 0x00000002)) { + previousSessions_ = java.util.Collections.unmodifiableList(previousSessions_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_RecordStructure_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_RecordStructure_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.state.StorageProtos.RecordStructure.class, org.session.libsignal.libsignal.state.StorageProtos.RecordStructure.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public RecordStructure parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new RecordStructure(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional .textsecure.SessionStructure currentSession = 1; + public static final int CURRENTSESSION_FIELD_NUMBER = 1; + private org.session.libsignal.libsignal.state.StorageProtos.SessionStructure currentSession_; + /** + * optional .textsecure.SessionStructure currentSession = 1; + */ + public boolean hasCurrentSession() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional .textsecure.SessionStructure currentSession = 1; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure getCurrentSession() { + return currentSession_; + } + /** + * optional .textsecure.SessionStructure currentSession = 1; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructureOrBuilder getCurrentSessionOrBuilder() { + return currentSession_; + } + + // repeated .textsecure.SessionStructure previousSessions = 2; + public static final int PREVIOUSSESSIONS_FIELD_NUMBER = 2; + private java.util.List previousSessions_; + /** + * repeated .textsecure.SessionStructure previousSessions = 2; + */ + public java.util.List getPreviousSessionsList() { + return previousSessions_; + } + /** + * repeated .textsecure.SessionStructure previousSessions = 2; + */ + public java.util.List + getPreviousSessionsOrBuilderList() { + return previousSessions_; + } + /** + * repeated .textsecure.SessionStructure previousSessions = 2; + */ + public int getPreviousSessionsCount() { + return previousSessions_.size(); + } + /** + * repeated .textsecure.SessionStructure previousSessions = 2; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure getPreviousSessions(int index) { + return previousSessions_.get(index); + } + /** + * repeated .textsecure.SessionStructure previousSessions = 2; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructureOrBuilder getPreviousSessionsOrBuilder( + int index) { + return previousSessions_.get(index); + } + + private void initFields() { + currentSession_ = org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.getDefaultInstance(); + previousSessions_ = java.util.Collections.emptyList(); + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeMessage(1, currentSession_); + } + for (int i = 0; i < previousSessions_.size(); i++) { + output.writeMessage(2, previousSessions_.get(i)); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, currentSession_); + } + for (int i = 0; i < previousSessions_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, previousSessions_.get(i)); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.libsignal.state.StorageProtos.RecordStructure parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.state.StorageProtos.RecordStructure parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.RecordStructure parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.state.StorageProtos.RecordStructure parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.RecordStructure parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.RecordStructure parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.RecordStructure parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.RecordStructure parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.RecordStructure parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.RecordStructure parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.libsignal.state.StorageProtos.RecordStructure prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code textsecure.RecordStructure} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.libsignal.state.StorageProtos.RecordStructureOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_RecordStructure_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_RecordStructure_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.state.StorageProtos.RecordStructure.class, org.session.libsignal.libsignal.state.StorageProtos.RecordStructure.Builder.class); + } + + // Construct using org.session.libsignal.libsignal.state.StorageProtos.RecordStructure.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getCurrentSessionFieldBuilder(); + getPreviousSessionsFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + if (currentSessionBuilder_ == null) { + currentSession_ = org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.getDefaultInstance(); + } else { + currentSessionBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + if (previousSessionsBuilder_ == null) { + previousSessions_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); + } else { + previousSessionsBuilder_.clear(); + } + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_RecordStructure_descriptor; + } + + public org.session.libsignal.libsignal.state.StorageProtos.RecordStructure getDefaultInstanceForType() { + return org.session.libsignal.libsignal.state.StorageProtos.RecordStructure.getDefaultInstance(); + } + + public org.session.libsignal.libsignal.state.StorageProtos.RecordStructure build() { + org.session.libsignal.libsignal.state.StorageProtos.RecordStructure result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.libsignal.state.StorageProtos.RecordStructure buildPartial() { + org.session.libsignal.libsignal.state.StorageProtos.RecordStructure result = new org.session.libsignal.libsignal.state.StorageProtos.RecordStructure(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + if (currentSessionBuilder_ == null) { + result.currentSession_ = currentSession_; + } else { + result.currentSession_ = currentSessionBuilder_.build(); + } + if (previousSessionsBuilder_ == null) { + if (((bitField0_ & 0x00000002) == 0x00000002)) { + previousSessions_ = java.util.Collections.unmodifiableList(previousSessions_); + bitField0_ = (bitField0_ & ~0x00000002); + } + result.previousSessions_ = previousSessions_; + } else { + result.previousSessions_ = previousSessionsBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.libsignal.state.StorageProtos.RecordStructure) { + return mergeFrom((org.session.libsignal.libsignal.state.StorageProtos.RecordStructure)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.libsignal.state.StorageProtos.RecordStructure other) { + if (other == org.session.libsignal.libsignal.state.StorageProtos.RecordStructure.getDefaultInstance()) return this; + if (other.hasCurrentSession()) { + mergeCurrentSession(other.getCurrentSession()); + } + if (previousSessionsBuilder_ == null) { + if (!other.previousSessions_.isEmpty()) { + if (previousSessions_.isEmpty()) { + previousSessions_ = other.previousSessions_; + bitField0_ = (bitField0_ & ~0x00000002); + } else { + ensurePreviousSessionsIsMutable(); + previousSessions_.addAll(other.previousSessions_); + } + onChanged(); + } + } else { + if (!other.previousSessions_.isEmpty()) { + if (previousSessionsBuilder_.isEmpty()) { + previousSessionsBuilder_.dispose(); + previousSessionsBuilder_ = null; + previousSessions_ = other.previousSessions_; + bitField0_ = (bitField0_ & ~0x00000002); + previousSessionsBuilder_ = + com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ? + getPreviousSessionsFieldBuilder() : null; + } else { + previousSessionsBuilder_.addAllMessages(other.previousSessions_); + } + } + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.libsignal.state.StorageProtos.RecordStructure parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.libsignal.state.StorageProtos.RecordStructure) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional .textsecure.SessionStructure currentSession = 1; + private org.session.libsignal.libsignal.state.StorageProtos.SessionStructure currentSession_ = org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Builder, org.session.libsignal.libsignal.state.StorageProtos.SessionStructureOrBuilder> currentSessionBuilder_; + /** + * optional .textsecure.SessionStructure currentSession = 1; + */ + public boolean hasCurrentSession() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional .textsecure.SessionStructure currentSession = 1; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure getCurrentSession() { + if (currentSessionBuilder_ == null) { + return currentSession_; + } else { + return currentSessionBuilder_.getMessage(); + } + } + /** + * optional .textsecure.SessionStructure currentSession = 1; + */ + public Builder setCurrentSession(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure value) { + if (currentSessionBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + currentSession_ = value; + onChanged(); + } else { + currentSessionBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * optional .textsecure.SessionStructure currentSession = 1; + */ + public Builder setCurrentSession( + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Builder builderForValue) { + if (currentSessionBuilder_ == null) { + currentSession_ = builderForValue.build(); + onChanged(); + } else { + currentSessionBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * optional .textsecure.SessionStructure currentSession = 1; + */ + public Builder mergeCurrentSession(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure value) { + if (currentSessionBuilder_ == null) { + if (((bitField0_ & 0x00000001) == 0x00000001) && + currentSession_ != org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.getDefaultInstance()) { + currentSession_ = + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.newBuilder(currentSession_).mergeFrom(value).buildPartial(); + } else { + currentSession_ = value; + } + onChanged(); + } else { + currentSessionBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * optional .textsecure.SessionStructure currentSession = 1; + */ + public Builder clearCurrentSession() { + if (currentSessionBuilder_ == null) { + currentSession_ = org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.getDefaultInstance(); + onChanged(); + } else { + currentSessionBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + /** + * optional .textsecure.SessionStructure currentSession = 1; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Builder getCurrentSessionBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getCurrentSessionFieldBuilder().getBuilder(); + } + /** + * optional .textsecure.SessionStructure currentSession = 1; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructureOrBuilder getCurrentSessionOrBuilder() { + if (currentSessionBuilder_ != null) { + return currentSessionBuilder_.getMessageOrBuilder(); + } else { + return currentSession_; + } + } + /** + * optional .textsecure.SessionStructure currentSession = 1; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Builder, org.session.libsignal.libsignal.state.StorageProtos.SessionStructureOrBuilder> + getCurrentSessionFieldBuilder() { + if (currentSessionBuilder_ == null) { + currentSessionBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Builder, org.session.libsignal.libsignal.state.StorageProtos.SessionStructureOrBuilder>( + currentSession_, + getParentForChildren(), + isClean()); + currentSession_ = null; + } + return currentSessionBuilder_; + } + + // repeated .textsecure.SessionStructure previousSessions = 2; + private java.util.List previousSessions_ = + java.util.Collections.emptyList(); + private void ensurePreviousSessionsIsMutable() { + if (!((bitField0_ & 0x00000002) == 0x00000002)) { + previousSessions_ = new java.util.ArrayList(previousSessions_); + bitField0_ |= 0x00000002; + } + } + + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Builder, org.session.libsignal.libsignal.state.StorageProtos.SessionStructureOrBuilder> previousSessionsBuilder_; + + /** + * repeated .textsecure.SessionStructure previousSessions = 2; + */ + public java.util.List getPreviousSessionsList() { + if (previousSessionsBuilder_ == null) { + return java.util.Collections.unmodifiableList(previousSessions_); + } else { + return previousSessionsBuilder_.getMessageList(); + } + } + /** + * repeated .textsecure.SessionStructure previousSessions = 2; + */ + public int getPreviousSessionsCount() { + if (previousSessionsBuilder_ == null) { + return previousSessions_.size(); + } else { + return previousSessionsBuilder_.getCount(); + } + } + /** + * repeated .textsecure.SessionStructure previousSessions = 2; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure getPreviousSessions(int index) { + if (previousSessionsBuilder_ == null) { + return previousSessions_.get(index); + } else { + return previousSessionsBuilder_.getMessage(index); + } + } + /** + * repeated .textsecure.SessionStructure previousSessions = 2; + */ + public Builder setPreviousSessions( + int index, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure value) { + if (previousSessionsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensurePreviousSessionsIsMutable(); + previousSessions_.set(index, value); + onChanged(); + } else { + previousSessionsBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .textsecure.SessionStructure previousSessions = 2; + */ + public Builder setPreviousSessions( + int index, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Builder builderForValue) { + if (previousSessionsBuilder_ == null) { + ensurePreviousSessionsIsMutable(); + previousSessions_.set(index, builderForValue.build()); + onChanged(); + } else { + previousSessionsBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .textsecure.SessionStructure previousSessions = 2; + */ + public Builder addPreviousSessions(org.session.libsignal.libsignal.state.StorageProtos.SessionStructure value) { + if (previousSessionsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensurePreviousSessionsIsMutable(); + previousSessions_.add(value); + onChanged(); + } else { + previousSessionsBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .textsecure.SessionStructure previousSessions = 2; + */ + public Builder addPreviousSessions( + int index, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure value) { + if (previousSessionsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensurePreviousSessionsIsMutable(); + previousSessions_.add(index, value); + onChanged(); + } else { + previousSessionsBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .textsecure.SessionStructure previousSessions = 2; + */ + public Builder addPreviousSessions( + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Builder builderForValue) { + if (previousSessionsBuilder_ == null) { + ensurePreviousSessionsIsMutable(); + previousSessions_.add(builderForValue.build()); + onChanged(); + } else { + previousSessionsBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .textsecure.SessionStructure previousSessions = 2; + */ + public Builder addPreviousSessions( + int index, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Builder builderForValue) { + if (previousSessionsBuilder_ == null) { + ensurePreviousSessionsIsMutable(); + previousSessions_.add(index, builderForValue.build()); + onChanged(); + } else { + previousSessionsBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .textsecure.SessionStructure previousSessions = 2; + */ + public Builder addAllPreviousSessions( + Iterable values) { + if (previousSessionsBuilder_ == null) { + ensurePreviousSessionsIsMutable(); + super.addAll(values, previousSessions_); + onChanged(); + } else { + previousSessionsBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .textsecure.SessionStructure previousSessions = 2; + */ + public Builder clearPreviousSessions() { + if (previousSessionsBuilder_ == null) { + previousSessions_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + } else { + previousSessionsBuilder_.clear(); + } + return this; + } + /** + * repeated .textsecure.SessionStructure previousSessions = 2; + */ + public Builder removePreviousSessions(int index) { + if (previousSessionsBuilder_ == null) { + ensurePreviousSessionsIsMutable(); + previousSessions_.remove(index); + onChanged(); + } else { + previousSessionsBuilder_.remove(index); + } + return this; + } + /** + * repeated .textsecure.SessionStructure previousSessions = 2; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Builder getPreviousSessionsBuilder( + int index) { + return getPreviousSessionsFieldBuilder().getBuilder(index); + } + /** + * repeated .textsecure.SessionStructure previousSessions = 2; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructureOrBuilder getPreviousSessionsOrBuilder( + int index) { + if (previousSessionsBuilder_ == null) { + return previousSessions_.get(index); } else { + return previousSessionsBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .textsecure.SessionStructure previousSessions = 2; + */ + public java.util.List + getPreviousSessionsOrBuilderList() { + if (previousSessionsBuilder_ != null) { + return previousSessionsBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(previousSessions_); + } + } + /** + * repeated .textsecure.SessionStructure previousSessions = 2; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Builder addPreviousSessionsBuilder() { + return getPreviousSessionsFieldBuilder().addBuilder( + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.getDefaultInstance()); + } + /** + * repeated .textsecure.SessionStructure previousSessions = 2; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Builder addPreviousSessionsBuilder( + int index) { + return getPreviousSessionsFieldBuilder().addBuilder( + index, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.getDefaultInstance()); + } + /** + * repeated .textsecure.SessionStructure previousSessions = 2; + */ + public java.util.List + getPreviousSessionsBuilderList() { + return getPreviousSessionsFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Builder, org.session.libsignal.libsignal.state.StorageProtos.SessionStructureOrBuilder> + getPreviousSessionsFieldBuilder() { + if (previousSessionsBuilder_ == null) { + previousSessionsBuilder_ = new com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SessionStructure, org.session.libsignal.libsignal.state.StorageProtos.SessionStructure.Builder, org.session.libsignal.libsignal.state.StorageProtos.SessionStructureOrBuilder>( + previousSessions_, + ((bitField0_ & 0x00000002) == 0x00000002), + getParentForChildren(), + isClean()); + previousSessions_ = null; + } + return previousSessionsBuilder_; + } + + // @@protoc_insertion_point(builder_scope:textsecure.RecordStructure) + } + + static { + defaultInstance = new RecordStructure(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:textsecure.RecordStructure) + } + + public interface PreKeyRecordStructureOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional uint32 id = 1; + /** + * optional uint32 id = 1; + */ + boolean hasId(); + /** + * optional uint32 id = 1; + */ + int getId(); + + // optional bytes publicKey = 2; + /** + * optional bytes publicKey = 2; + */ + boolean hasPublicKey(); + /** + * optional bytes publicKey = 2; + */ + com.google.protobuf.ByteString getPublicKey(); + + // optional bytes privateKey = 3; + /** + * optional bytes privateKey = 3; + */ + boolean hasPrivateKey(); + /** + * optional bytes privateKey = 3; + */ + com.google.protobuf.ByteString getPrivateKey(); + } + /** + * Protobuf type {@code textsecure.PreKeyRecordStructure} + */ + public static final class PreKeyRecordStructure extends + com.google.protobuf.GeneratedMessage + implements PreKeyRecordStructureOrBuilder { + // Use PreKeyRecordStructure.newBuilder() to construct. + private PreKeyRecordStructure(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private PreKeyRecordStructure(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final PreKeyRecordStructure defaultInstance; + public static PreKeyRecordStructure getDefaultInstance() { + return defaultInstance; + } + + public PreKeyRecordStructure getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private PreKeyRecordStructure( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + id_ = input.readUInt32(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + publicKey_ = input.readBytes(); + break; + } + case 26: { + bitField0_ |= 0x00000004; + privateKey_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_PreKeyRecordStructure_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_PreKeyRecordStructure_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructure.class, org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructure.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public PreKeyRecordStructure parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new PreKeyRecordStructure(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional uint32 id = 1; + public static final int ID_FIELD_NUMBER = 1; + private int id_; + /** + * optional uint32 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 id = 1; + */ + public int getId() { + return id_; + } + + // optional bytes publicKey = 2; + public static final int PUBLICKEY_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString publicKey_; + /** + * optional bytes publicKey = 2; + */ + public boolean hasPublicKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes publicKey = 2; + */ + public com.google.protobuf.ByteString getPublicKey() { + return publicKey_; + } + + // optional bytes privateKey = 3; + public static final int PRIVATEKEY_FIELD_NUMBER = 3; + private com.google.protobuf.ByteString privateKey_; + /** + * optional bytes privateKey = 3; + */ + public boolean hasPrivateKey() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes privateKey = 3; + */ + public com.google.protobuf.ByteString getPrivateKey() { + return privateKey_; + } + + private void initFields() { + id_ = 0; + publicKey_ = com.google.protobuf.ByteString.EMPTY; + privateKey_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt32(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, publicKey_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(3, privateKey_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, publicKey_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, privateKey_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructure parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructure parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructure parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructure parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructure parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructure parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructure parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructure parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructure parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructure parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructure prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code textsecure.PreKeyRecordStructure} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructureOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_PreKeyRecordStructure_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_PreKeyRecordStructure_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructure.class, org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructure.Builder.class); + } + + // Construct using org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructure.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + id_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + publicKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + privateKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_PreKeyRecordStructure_descriptor; + } + + public org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructure getDefaultInstanceForType() { + return org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructure.getDefaultInstance(); + } + + public org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructure build() { + org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructure result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructure buildPartial() { + org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructure result = new org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructure(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.id_ = id_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.publicKey_ = publicKey_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.privateKey_ = privateKey_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructure) { + return mergeFrom((org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructure)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructure other) { + if (other == org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructure.getDefaultInstance()) return this; + if (other.hasId()) { + setId(other.getId()); + } + if (other.hasPublicKey()) { + setPublicKey(other.getPublicKey()); + } + if (other.hasPrivateKey()) { + setPrivateKey(other.getPrivateKey()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructure parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.libsignal.state.StorageProtos.PreKeyRecordStructure) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional uint32 id = 1; + private int id_ ; + /** + * optional uint32 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 id = 1; + */ + public int getId() { + return id_; + } + /** + * optional uint32 id = 1; + */ + public Builder setId(int value) { + bitField0_ |= 0x00000001; + id_ = value; + onChanged(); + return this; + } + /** + * optional uint32 id = 1; + */ + public Builder clearId() { + bitField0_ = (bitField0_ & ~0x00000001); + id_ = 0; + onChanged(); + return this; + } + + // optional bytes publicKey = 2; + private com.google.protobuf.ByteString publicKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes publicKey = 2; + */ + public boolean hasPublicKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes publicKey = 2; + */ + public com.google.protobuf.ByteString getPublicKey() { + return publicKey_; + } + /** + * optional bytes publicKey = 2; + */ + public Builder setPublicKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + publicKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes publicKey = 2; + */ + public Builder clearPublicKey() { + bitField0_ = (bitField0_ & ~0x00000002); + publicKey_ = getDefaultInstance().getPublicKey(); + onChanged(); + return this; + } + + // optional bytes privateKey = 3; + private com.google.protobuf.ByteString privateKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes privateKey = 3; + */ + public boolean hasPrivateKey() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes privateKey = 3; + */ + public com.google.protobuf.ByteString getPrivateKey() { + return privateKey_; + } + /** + * optional bytes privateKey = 3; + */ + public Builder setPrivateKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + privateKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes privateKey = 3; + */ + public Builder clearPrivateKey() { + bitField0_ = (bitField0_ & ~0x00000004); + privateKey_ = getDefaultInstance().getPrivateKey(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:textsecure.PreKeyRecordStructure) + } + + static { + defaultInstance = new PreKeyRecordStructure(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:textsecure.PreKeyRecordStructure) + } + + public interface SignedPreKeyRecordStructureOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional uint32 id = 1; + /** + * optional uint32 id = 1; + */ + boolean hasId(); + /** + * optional uint32 id = 1; + */ + int getId(); + + // optional bytes publicKey = 2; + /** + * optional bytes publicKey = 2; + */ + boolean hasPublicKey(); + /** + * optional bytes publicKey = 2; + */ + com.google.protobuf.ByteString getPublicKey(); + + // optional bytes privateKey = 3; + /** + * optional bytes privateKey = 3; + */ + boolean hasPrivateKey(); + /** + * optional bytes privateKey = 3; + */ + com.google.protobuf.ByteString getPrivateKey(); + + // optional bytes signature = 4; + /** + * optional bytes signature = 4; + */ + boolean hasSignature(); + /** + * optional bytes signature = 4; + */ + com.google.protobuf.ByteString getSignature(); + + // optional fixed64 timestamp = 5; + /** + * optional fixed64 timestamp = 5; + */ + boolean hasTimestamp(); + /** + * optional fixed64 timestamp = 5; + */ + long getTimestamp(); + } + /** + * Protobuf type {@code textsecure.SignedPreKeyRecordStructure} + */ + public static final class SignedPreKeyRecordStructure extends + com.google.protobuf.GeneratedMessage + implements SignedPreKeyRecordStructureOrBuilder { + // Use SignedPreKeyRecordStructure.newBuilder() to construct. + private SignedPreKeyRecordStructure(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private SignedPreKeyRecordStructure(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final SignedPreKeyRecordStructure defaultInstance; + public static SignedPreKeyRecordStructure getDefaultInstance() { + return defaultInstance; + } + + public SignedPreKeyRecordStructure getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private SignedPreKeyRecordStructure( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + id_ = input.readUInt32(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + publicKey_ = input.readBytes(); + break; + } + case 26: { + bitField0_ |= 0x00000004; + privateKey_ = input.readBytes(); + break; + } + case 34: { + bitField0_ |= 0x00000008; + signature_ = input.readBytes(); + break; + } + case 41: { + bitField0_ |= 0x00000010; + timestamp_ = input.readFixed64(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SignedPreKeyRecordStructure_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SignedPreKeyRecordStructure_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructure.class, org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructure.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public SignedPreKeyRecordStructure parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new SignedPreKeyRecordStructure(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional uint32 id = 1; + public static final int ID_FIELD_NUMBER = 1; + private int id_; + /** + * optional uint32 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 id = 1; + */ + public int getId() { + return id_; + } + + // optional bytes publicKey = 2; + public static final int PUBLICKEY_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString publicKey_; + /** + * optional bytes publicKey = 2; + */ + public boolean hasPublicKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes publicKey = 2; + */ + public com.google.protobuf.ByteString getPublicKey() { + return publicKey_; + } + + // optional bytes privateKey = 3; + public static final int PRIVATEKEY_FIELD_NUMBER = 3; + private com.google.protobuf.ByteString privateKey_; + /** + * optional bytes privateKey = 3; + */ + public boolean hasPrivateKey() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes privateKey = 3; + */ + public com.google.protobuf.ByteString getPrivateKey() { + return privateKey_; + } + + // optional bytes signature = 4; + public static final int SIGNATURE_FIELD_NUMBER = 4; + private com.google.protobuf.ByteString signature_; + /** + * optional bytes signature = 4; + */ + public boolean hasSignature() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional bytes signature = 4; + */ + public com.google.protobuf.ByteString getSignature() { + return signature_; + } + + // optional fixed64 timestamp = 5; + public static final int TIMESTAMP_FIELD_NUMBER = 5; + private long timestamp_; + /** + * optional fixed64 timestamp = 5; + */ + public boolean hasTimestamp() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional fixed64 timestamp = 5; + */ + public long getTimestamp() { + return timestamp_; + } + + private void initFields() { + id_ = 0; + publicKey_ = com.google.protobuf.ByteString.EMPTY; + privateKey_ = com.google.protobuf.ByteString.EMPTY; + signature_ = com.google.protobuf.ByteString.EMPTY; + timestamp_ = 0L; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt32(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, publicKey_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(3, privateKey_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeBytes(4, signature_); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + output.writeFixed64(5, timestamp_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, publicKey_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, privateKey_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(4, signature_); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + size += com.google.protobuf.CodedOutputStream + .computeFixed64Size(5, timestamp_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructure parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructure parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructure parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructure parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructure parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructure parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructure parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructure parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructure parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructure parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructure prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code textsecure.SignedPreKeyRecordStructure} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructureOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SignedPreKeyRecordStructure_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SignedPreKeyRecordStructure_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructure.class, org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructure.Builder.class); + } + + // Construct using org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructure.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + id_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + publicKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + privateKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000004); + signature_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000008); + timestamp_ = 0L; + bitField0_ = (bitField0_ & ~0x00000010); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SignedPreKeyRecordStructure_descriptor; + } + + public org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructure getDefaultInstanceForType() { + return org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructure.getDefaultInstance(); + } + + public org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructure build() { + org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructure result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructure buildPartial() { + org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructure result = new org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructure(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.id_ = id_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.publicKey_ = publicKey_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.privateKey_ = privateKey_; + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000008; + } + result.signature_ = signature_; + if (((from_bitField0_ & 0x00000010) == 0x00000010)) { + to_bitField0_ |= 0x00000010; + } + result.timestamp_ = timestamp_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructure) { + return mergeFrom((org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructure)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructure other) { + if (other == org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructure.getDefaultInstance()) return this; + if (other.hasId()) { + setId(other.getId()); + } + if (other.hasPublicKey()) { + setPublicKey(other.getPublicKey()); + } + if (other.hasPrivateKey()) { + setPrivateKey(other.getPrivateKey()); + } + if (other.hasSignature()) { + setSignature(other.getSignature()); + } + if (other.hasTimestamp()) { + setTimestamp(other.getTimestamp()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructure parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.libsignal.state.StorageProtos.SignedPreKeyRecordStructure) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional uint32 id = 1; + private int id_ ; + /** + * optional uint32 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 id = 1; + */ + public int getId() { + return id_; + } + /** + * optional uint32 id = 1; + */ + public Builder setId(int value) { + bitField0_ |= 0x00000001; + id_ = value; + onChanged(); + return this; + } + /** + * optional uint32 id = 1; + */ + public Builder clearId() { + bitField0_ = (bitField0_ & ~0x00000001); + id_ = 0; + onChanged(); + return this; + } + + // optional bytes publicKey = 2; + private com.google.protobuf.ByteString publicKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes publicKey = 2; + */ + public boolean hasPublicKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes publicKey = 2; + */ + public com.google.protobuf.ByteString getPublicKey() { + return publicKey_; + } + /** + * optional bytes publicKey = 2; + */ + public Builder setPublicKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + publicKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes publicKey = 2; + */ + public Builder clearPublicKey() { + bitField0_ = (bitField0_ & ~0x00000002); + publicKey_ = getDefaultInstance().getPublicKey(); + onChanged(); + return this; + } + + // optional bytes privateKey = 3; + private com.google.protobuf.ByteString privateKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes privateKey = 3; + */ + public boolean hasPrivateKey() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes privateKey = 3; + */ + public com.google.protobuf.ByteString getPrivateKey() { + return privateKey_; + } + /** + * optional bytes privateKey = 3; + */ + public Builder setPrivateKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + privateKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes privateKey = 3; + */ + public Builder clearPrivateKey() { + bitField0_ = (bitField0_ & ~0x00000004); + privateKey_ = getDefaultInstance().getPrivateKey(); + onChanged(); + return this; + } + + // optional bytes signature = 4; + private com.google.protobuf.ByteString signature_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes signature = 4; + */ + public boolean hasSignature() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional bytes signature = 4; + */ + public com.google.protobuf.ByteString getSignature() { + return signature_; + } + /** + * optional bytes signature = 4; + */ + public Builder setSignature(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + signature_ = value; + onChanged(); + return this; + } + /** + * optional bytes signature = 4; + */ + public Builder clearSignature() { + bitField0_ = (bitField0_ & ~0x00000008); + signature_ = getDefaultInstance().getSignature(); + onChanged(); + return this; + } + + // optional fixed64 timestamp = 5; + private long timestamp_ ; + /** + * optional fixed64 timestamp = 5; + */ + public boolean hasTimestamp() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional fixed64 timestamp = 5; + */ + public long getTimestamp() { + return timestamp_; + } + /** + * optional fixed64 timestamp = 5; + */ + public Builder setTimestamp(long value) { + bitField0_ |= 0x00000010; + timestamp_ = value; + onChanged(); + return this; + } + /** + * optional fixed64 timestamp = 5; + */ + public Builder clearTimestamp() { + bitField0_ = (bitField0_ & ~0x00000010); + timestamp_ = 0L; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:textsecure.SignedPreKeyRecordStructure) + } + + static { + defaultInstance = new SignedPreKeyRecordStructure(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:textsecure.SignedPreKeyRecordStructure) + } + + public interface IdentityKeyPairStructureOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional bytes publicKey = 1; + /** + * optional bytes publicKey = 1; + */ + boolean hasPublicKey(); + /** + * optional bytes publicKey = 1; + */ + com.google.protobuf.ByteString getPublicKey(); + + // optional bytes privateKey = 2; + /** + * optional bytes privateKey = 2; + */ + boolean hasPrivateKey(); + /** + * optional bytes privateKey = 2; + */ + com.google.protobuf.ByteString getPrivateKey(); + } + /** + * Protobuf type {@code textsecure.IdentityKeyPairStructure} + */ + public static final class IdentityKeyPairStructure extends + com.google.protobuf.GeneratedMessage + implements IdentityKeyPairStructureOrBuilder { + // Use IdentityKeyPairStructure.newBuilder() to construct. + private IdentityKeyPairStructure(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private IdentityKeyPairStructure(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final IdentityKeyPairStructure defaultInstance; + public static IdentityKeyPairStructure getDefaultInstance() { + return defaultInstance; + } + + public IdentityKeyPairStructure getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private IdentityKeyPairStructure( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + publicKey_ = input.readBytes(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + privateKey_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_IdentityKeyPairStructure_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_IdentityKeyPairStructure_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructure.class, org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructure.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public IdentityKeyPairStructure parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new IdentityKeyPairStructure(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional bytes publicKey = 1; + public static final int PUBLICKEY_FIELD_NUMBER = 1; + private com.google.protobuf.ByteString publicKey_; + /** + * optional bytes publicKey = 1; + */ + public boolean hasPublicKey() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes publicKey = 1; + */ + public com.google.protobuf.ByteString getPublicKey() { + return publicKey_; + } + + // optional bytes privateKey = 2; + public static final int PRIVATEKEY_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString privateKey_; + /** + * optional bytes privateKey = 2; + */ + public boolean hasPrivateKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes privateKey = 2; + */ + public com.google.protobuf.ByteString getPrivateKey() { + return privateKey_; + } + + private void initFields() { + publicKey_ = com.google.protobuf.ByteString.EMPTY; + privateKey_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, publicKey_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, privateKey_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, publicKey_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, privateKey_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructure parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructure parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructure parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructure parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructure parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructure parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructure parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructure parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructure parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructure parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructure prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code textsecure.IdentityKeyPairStructure} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructureOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_IdentityKeyPairStructure_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_IdentityKeyPairStructure_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructure.class, org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructure.Builder.class); + } + + // Construct using org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructure.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + publicKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + privateKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_IdentityKeyPairStructure_descriptor; + } + + public org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructure getDefaultInstanceForType() { + return org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructure.getDefaultInstance(); + } + + public org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructure build() { + org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructure result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructure buildPartial() { + org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructure result = new org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructure(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.publicKey_ = publicKey_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.privateKey_ = privateKey_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructure) { + return mergeFrom((org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructure)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructure other) { + if (other == org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructure.getDefaultInstance()) return this; + if (other.hasPublicKey()) { + setPublicKey(other.getPublicKey()); + } + if (other.hasPrivateKey()) { + setPrivateKey(other.getPrivateKey()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructure parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.libsignal.state.StorageProtos.IdentityKeyPairStructure) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional bytes publicKey = 1; + private com.google.protobuf.ByteString publicKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes publicKey = 1; + */ + public boolean hasPublicKey() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes publicKey = 1; + */ + public com.google.protobuf.ByteString getPublicKey() { + return publicKey_; + } + /** + * optional bytes publicKey = 1; + */ + public Builder setPublicKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + publicKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes publicKey = 1; + */ + public Builder clearPublicKey() { + bitField0_ = (bitField0_ & ~0x00000001); + publicKey_ = getDefaultInstance().getPublicKey(); + onChanged(); + return this; + } + + // optional bytes privateKey = 2; + private com.google.protobuf.ByteString privateKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes privateKey = 2; + */ + public boolean hasPrivateKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes privateKey = 2; + */ + public com.google.protobuf.ByteString getPrivateKey() { + return privateKey_; + } + /** + * optional bytes privateKey = 2; + */ + public Builder setPrivateKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + privateKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes privateKey = 2; + */ + public Builder clearPrivateKey() { + bitField0_ = (bitField0_ & ~0x00000002); + privateKey_ = getDefaultInstance().getPrivateKey(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:textsecure.IdentityKeyPairStructure) + } + + static { + defaultInstance = new IdentityKeyPairStructure(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:textsecure.IdentityKeyPairStructure) + } + + public interface SenderKeyStateStructureOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional uint32 senderKeyId = 1; + /** + * optional uint32 senderKeyId = 1; + */ + boolean hasSenderKeyId(); + /** + * optional uint32 senderKeyId = 1; + */ + int getSenderKeyId(); + + // optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2; + /** + * optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2; + */ + boolean hasSenderChainKey(); + /** + * optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2; + */ + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey getSenderChainKey(); + /** + * optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2; + */ + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKeyOrBuilder getSenderChainKeyOrBuilder(); + + // optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3; + /** + * optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3; + */ + boolean hasSenderSigningKey(); + /** + * optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3; + */ + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey getSenderSigningKey(); + /** + * optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3; + */ + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKeyOrBuilder getSenderSigningKeyOrBuilder(); + + // repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + /** + * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + */ + java.util.List + getSenderMessageKeysList(); + /** + * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + */ + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey getSenderMessageKeys(int index); + /** + * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + */ + int getSenderMessageKeysCount(); + /** + * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + */ + java.util.List + getSenderMessageKeysOrBuilderList(); + /** + * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + */ + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKeyOrBuilder getSenderMessageKeysOrBuilder( + int index); + } + /** + * Protobuf type {@code textsecure.SenderKeyStateStructure} + */ + public static final class SenderKeyStateStructure extends + com.google.protobuf.GeneratedMessage + implements SenderKeyStateStructureOrBuilder { + // Use SenderKeyStateStructure.newBuilder() to construct. + private SenderKeyStateStructure(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private SenderKeyStateStructure(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final SenderKeyStateStructure defaultInstance; + public static SenderKeyStateStructure getDefaultInstance() { + return defaultInstance; + } + + public SenderKeyStateStructure getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private SenderKeyStateStructure( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + senderKeyId_ = input.readUInt32(); + break; + } + case 18: { + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.Builder subBuilder = null; + if (((bitField0_ & 0x00000002) == 0x00000002)) { + subBuilder = senderChainKey_.toBuilder(); + } + senderChainKey_ = input.readMessage(org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(senderChainKey_); + senderChainKey_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000002; + break; + } + case 26: { + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.Builder subBuilder = null; + if (((bitField0_ & 0x00000004) == 0x00000004)) { + subBuilder = senderSigningKey_.toBuilder(); + } + senderSigningKey_ = input.readMessage(org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(senderSigningKey_); + senderSigningKey_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000004; + break; + } + case 34: { + if (!((mutable_bitField0_ & 0x00000008) == 0x00000008)) { + senderMessageKeys_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000008; + } + senderMessageKeys_.add(input.readMessage(org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.PARSER, extensionRegistry)); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000008) == 0x00000008)) { + senderMessageKeys_ = java.util.Collections.unmodifiableList(senderMessageKeys_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.class, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public SenderKeyStateStructure parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new SenderKeyStateStructure(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public interface SenderChainKeyOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional uint32 iteration = 1; + /** + * optional uint32 iteration = 1; + */ + boolean hasIteration(); + /** + * optional uint32 iteration = 1; + */ + int getIteration(); + + // optional bytes seed = 2; + /** + * optional bytes seed = 2; + */ + boolean hasSeed(); + /** + * optional bytes seed = 2; + */ + com.google.protobuf.ByteString getSeed(); + } + /** + * Protobuf type {@code textsecure.SenderKeyStateStructure.SenderChainKey} + */ + public static final class SenderChainKey extends + com.google.protobuf.GeneratedMessage + implements SenderChainKeyOrBuilder { + // Use SenderChainKey.newBuilder() to construct. + private SenderChainKey(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private SenderChainKey(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final SenderChainKey defaultInstance; + public static SenderChainKey getDefaultInstance() { + return defaultInstance; + } + + public SenderChainKey getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private SenderChainKey( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + iteration_ = input.readUInt32(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + seed_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_SenderChainKey_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_SenderChainKey_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.class, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public SenderChainKey parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new SenderChainKey(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional uint32 iteration = 1; + public static final int ITERATION_FIELD_NUMBER = 1; + private int iteration_; + /** + * optional uint32 iteration = 1; + */ + public boolean hasIteration() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 iteration = 1; + */ + public int getIteration() { + return iteration_; + } + + // optional bytes seed = 2; + public static final int SEED_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString seed_; + /** + * optional bytes seed = 2; + */ + public boolean hasSeed() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes seed = 2; + */ + public com.google.protobuf.ByteString getSeed() { + return seed_; + } + + private void initFields() { + iteration_ = 0; + seed_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt32(1, iteration_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, seed_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, iteration_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, seed_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code textsecure.SenderKeyStateStructure.SenderChainKey} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKeyOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_SenderChainKey_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_SenderChainKey_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.class, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.Builder.class); + } + + // Construct using org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + iteration_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + seed_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_SenderChainKey_descriptor; + } + + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey getDefaultInstanceForType() { + return org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.getDefaultInstance(); + } + + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey build() { + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey buildPartial() { + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey result = new org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.iteration_ = iteration_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.seed_ = seed_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey) { + return mergeFrom((org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey other) { + if (other == org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.getDefaultInstance()) return this; + if (other.hasIteration()) { + setIteration(other.getIteration()); + } + if (other.hasSeed()) { + setSeed(other.getSeed()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional uint32 iteration = 1; + private int iteration_ ; + /** + * optional uint32 iteration = 1; + */ + public boolean hasIteration() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 iteration = 1; + */ + public int getIteration() { + return iteration_; + } + /** + * optional uint32 iteration = 1; + */ + public Builder setIteration(int value) { + bitField0_ |= 0x00000001; + iteration_ = value; + onChanged(); + return this; + } + /** + * optional uint32 iteration = 1; + */ + public Builder clearIteration() { + bitField0_ = (bitField0_ & ~0x00000001); + iteration_ = 0; + onChanged(); + return this; + } + + // optional bytes seed = 2; + private com.google.protobuf.ByteString seed_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes seed = 2; + */ + public boolean hasSeed() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes seed = 2; + */ + public com.google.protobuf.ByteString getSeed() { + return seed_; + } + /** + * optional bytes seed = 2; + */ + public Builder setSeed(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + seed_ = value; + onChanged(); + return this; + } + /** + * optional bytes seed = 2; + */ + public Builder clearSeed() { + bitField0_ = (bitField0_ & ~0x00000002); + seed_ = getDefaultInstance().getSeed(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:textsecure.SenderKeyStateStructure.SenderChainKey) + } + + static { + defaultInstance = new SenderChainKey(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:textsecure.SenderKeyStateStructure.SenderChainKey) + } + + public interface SenderMessageKeyOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional uint32 iteration = 1; + /** + * optional uint32 iteration = 1; + */ + boolean hasIteration(); + /** + * optional uint32 iteration = 1; + */ + int getIteration(); + + // optional bytes seed = 2; + /** + * optional bytes seed = 2; + */ + boolean hasSeed(); + /** + * optional bytes seed = 2; + */ + com.google.protobuf.ByteString getSeed(); + } + /** + * Protobuf type {@code textsecure.SenderKeyStateStructure.SenderMessageKey} + */ + public static final class SenderMessageKey extends + com.google.protobuf.GeneratedMessage + implements SenderMessageKeyOrBuilder { + // Use SenderMessageKey.newBuilder() to construct. + private SenderMessageKey(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private SenderMessageKey(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final SenderMessageKey defaultInstance; + public static SenderMessageKey getDefaultInstance() { + return defaultInstance; + } + + public SenderMessageKey getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private SenderMessageKey( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + iteration_ = input.readUInt32(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + seed_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_SenderMessageKey_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_SenderMessageKey_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.class, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public SenderMessageKey parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new SenderMessageKey(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional uint32 iteration = 1; + public static final int ITERATION_FIELD_NUMBER = 1; + private int iteration_; + /** + * optional uint32 iteration = 1; + */ + public boolean hasIteration() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 iteration = 1; + */ + public int getIteration() { + return iteration_; + } + + // optional bytes seed = 2; + public static final int SEED_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString seed_; + /** + * optional bytes seed = 2; + */ + public boolean hasSeed() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes seed = 2; + */ + public com.google.protobuf.ByteString getSeed() { + return seed_; + } + + private void initFields() { + iteration_ = 0; + seed_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt32(1, iteration_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, seed_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, iteration_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, seed_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code textsecure.SenderKeyStateStructure.SenderMessageKey} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKeyOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_SenderMessageKey_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_SenderMessageKey_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.class, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.Builder.class); + } + + // Construct using org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + iteration_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + seed_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_SenderMessageKey_descriptor; + } + + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey getDefaultInstanceForType() { + return org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.getDefaultInstance(); + } + + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey build() { + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey buildPartial() { + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey result = new org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.iteration_ = iteration_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.seed_ = seed_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey) { + return mergeFrom((org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey other) { + if (other == org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.getDefaultInstance()) return this; + if (other.hasIteration()) { + setIteration(other.getIteration()); + } + if (other.hasSeed()) { + setSeed(other.getSeed()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional uint32 iteration = 1; + private int iteration_ ; + /** + * optional uint32 iteration = 1; + */ + public boolean hasIteration() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 iteration = 1; + */ + public int getIteration() { + return iteration_; + } + /** + * optional uint32 iteration = 1; + */ + public Builder setIteration(int value) { + bitField0_ |= 0x00000001; + iteration_ = value; + onChanged(); + return this; + } + /** + * optional uint32 iteration = 1; + */ + public Builder clearIteration() { + bitField0_ = (bitField0_ & ~0x00000001); + iteration_ = 0; + onChanged(); + return this; + } + + // optional bytes seed = 2; + private com.google.protobuf.ByteString seed_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes seed = 2; + */ + public boolean hasSeed() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes seed = 2; + */ + public com.google.protobuf.ByteString getSeed() { + return seed_; + } + /** + * optional bytes seed = 2; + */ + public Builder setSeed(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + seed_ = value; + onChanged(); + return this; + } + /** + * optional bytes seed = 2; + */ + public Builder clearSeed() { + bitField0_ = (bitField0_ & ~0x00000002); + seed_ = getDefaultInstance().getSeed(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:textsecure.SenderKeyStateStructure.SenderMessageKey) + } + + static { + defaultInstance = new SenderMessageKey(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:textsecure.SenderKeyStateStructure.SenderMessageKey) + } + + public interface SenderSigningKeyOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional bytes public = 1; + /** + * optional bytes public = 1; + */ + boolean hasPublic(); + /** + * optional bytes public = 1; + */ + com.google.protobuf.ByteString getPublic(); + + // optional bytes private = 2; + /** + * optional bytes private = 2; + */ + boolean hasPrivate(); + /** + * optional bytes private = 2; + */ + com.google.protobuf.ByteString getPrivate(); + } + /** + * Protobuf type {@code textsecure.SenderKeyStateStructure.SenderSigningKey} + */ + public static final class SenderSigningKey extends + com.google.protobuf.GeneratedMessage + implements SenderSigningKeyOrBuilder { + // Use SenderSigningKey.newBuilder() to construct. + private SenderSigningKey(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private SenderSigningKey(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final SenderSigningKey defaultInstance; + public static SenderSigningKey getDefaultInstance() { + return defaultInstance; + } + + public SenderSigningKey getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private SenderSigningKey( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + public_ = input.readBytes(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + private_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_SenderSigningKey_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_SenderSigningKey_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.class, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public SenderSigningKey parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new SenderSigningKey(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional bytes public = 1; + public static final int PUBLIC_FIELD_NUMBER = 1; + private com.google.protobuf.ByteString public_; + /** + * optional bytes public = 1; + */ + public boolean hasPublic() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes public = 1; + */ + public com.google.protobuf.ByteString getPublic() { + return public_; + } + + // optional bytes private = 2; + public static final int PRIVATE_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString private_; + /** + * optional bytes private = 2; + */ + public boolean hasPrivate() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes private = 2; + */ + public com.google.protobuf.ByteString getPrivate() { + return private_; + } + + private void initFields() { + public_ = com.google.protobuf.ByteString.EMPTY; + private_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, public_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, private_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, public_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, private_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code textsecure.SenderKeyStateStructure.SenderSigningKey} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKeyOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_SenderSigningKey_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_SenderSigningKey_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.class, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.Builder.class); + } + + // Construct using org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + public_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + private_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_SenderSigningKey_descriptor; + } + + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey getDefaultInstanceForType() { + return org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.getDefaultInstance(); + } + + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey build() { + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey buildPartial() { + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey result = new org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.public_ = public_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.private_ = private_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey) { + return mergeFrom((org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey other) { + if (other == org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.getDefaultInstance()) return this; + if (other.hasPublic()) { + setPublic(other.getPublic()); + } + if (other.hasPrivate()) { + setPrivate(other.getPrivate()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional bytes public = 1; + private com.google.protobuf.ByteString public_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes public = 1; + */ + public boolean hasPublic() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes public = 1; + */ + public com.google.protobuf.ByteString getPublic() { + return public_; + } + /** + * optional bytes public = 1; + */ + public Builder setPublic(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + public_ = value; + onChanged(); + return this; + } + /** + * optional bytes public = 1; + */ + public Builder clearPublic() { + bitField0_ = (bitField0_ & ~0x00000001); + public_ = getDefaultInstance().getPublic(); + onChanged(); + return this; + } + + // optional bytes private = 2; + private com.google.protobuf.ByteString private_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes private = 2; + */ + public boolean hasPrivate() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes private = 2; + */ + public com.google.protobuf.ByteString getPrivate() { + return private_; + } + /** + * optional bytes private = 2; + */ + public Builder setPrivate(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + private_ = value; + onChanged(); + return this; + } + /** + * optional bytes private = 2; + */ + public Builder clearPrivate() { + bitField0_ = (bitField0_ & ~0x00000002); + private_ = getDefaultInstance().getPrivate(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:textsecure.SenderKeyStateStructure.SenderSigningKey) + } + + static { + defaultInstance = new SenderSigningKey(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:textsecure.SenderKeyStateStructure.SenderSigningKey) + } + + private int bitField0_; + // optional uint32 senderKeyId = 1; + public static final int SENDERKEYID_FIELD_NUMBER = 1; + private int senderKeyId_; + /** + * optional uint32 senderKeyId = 1; + */ + public boolean hasSenderKeyId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 senderKeyId = 1; + */ + public int getSenderKeyId() { + return senderKeyId_; + } + + // optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2; + public static final int SENDERCHAINKEY_FIELD_NUMBER = 2; + private org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey senderChainKey_; + /** + * optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2; + */ + public boolean hasSenderChainKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey getSenderChainKey() { + return senderChainKey_; + } + /** + * optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKeyOrBuilder getSenderChainKeyOrBuilder() { + return senderChainKey_; + } + + // optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3; + public static final int SENDERSIGNINGKEY_FIELD_NUMBER = 3; + private org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey senderSigningKey_; + /** + * optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3; + */ + public boolean hasSenderSigningKey() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey getSenderSigningKey() { + return senderSigningKey_; + } + /** + * optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKeyOrBuilder getSenderSigningKeyOrBuilder() { + return senderSigningKey_; + } + + // repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + public static final int SENDERMESSAGEKEYS_FIELD_NUMBER = 4; + private java.util.List senderMessageKeys_; + /** + * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + */ + public java.util.List getSenderMessageKeysList() { + return senderMessageKeys_; + } + /** + * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + */ + public java.util.List + getSenderMessageKeysOrBuilderList() { + return senderMessageKeys_; + } + /** + * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + */ + public int getSenderMessageKeysCount() { + return senderMessageKeys_.size(); + } + /** + * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey getSenderMessageKeys(int index) { + return senderMessageKeys_.get(index); + } + /** + * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKeyOrBuilder getSenderMessageKeysOrBuilder( + int index) { + return senderMessageKeys_.get(index); + } + + private void initFields() { + senderKeyId_ = 0; + senderChainKey_ = org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.getDefaultInstance(); + senderSigningKey_ = org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.getDefaultInstance(); + senderMessageKeys_ = java.util.Collections.emptyList(); + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt32(1, senderKeyId_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeMessage(2, senderChainKey_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeMessage(3, senderSigningKey_); + } + for (int i = 0; i < senderMessageKeys_.size(); i++) { + output.writeMessage(4, senderMessageKeys_.get(i)); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, senderKeyId_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, senderChainKey_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, senderSigningKey_); + } + for (int i = 0; i < senderMessageKeys_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(4, senderMessageKeys_.get(i)); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code textsecure.SenderKeyStateStructure} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructureOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.class, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.Builder.class); + } + + // Construct using org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getSenderChainKeyFieldBuilder(); + getSenderSigningKeyFieldBuilder(); + getSenderMessageKeysFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + senderKeyId_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + if (senderChainKeyBuilder_ == null) { + senderChainKey_ = org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.getDefaultInstance(); + } else { + senderChainKeyBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + if (senderSigningKeyBuilder_ == null) { + senderSigningKey_ = org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.getDefaultInstance(); + } else { + senderSigningKeyBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + if (senderMessageKeysBuilder_ == null) { + senderMessageKeys_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000008); + } else { + senderMessageKeysBuilder_.clear(); + } + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyStateStructure_descriptor; + } + + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure getDefaultInstanceForType() { + return org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.getDefaultInstance(); + } + + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure build() { + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure buildPartial() { + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure result = new org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.senderKeyId_ = senderKeyId_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + if (senderChainKeyBuilder_ == null) { + result.senderChainKey_ = senderChainKey_; + } else { + result.senderChainKey_ = senderChainKeyBuilder_.build(); + } + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + if (senderSigningKeyBuilder_ == null) { + result.senderSigningKey_ = senderSigningKey_; + } else { + result.senderSigningKey_ = senderSigningKeyBuilder_.build(); + } + if (senderMessageKeysBuilder_ == null) { + if (((bitField0_ & 0x00000008) == 0x00000008)) { + senderMessageKeys_ = java.util.Collections.unmodifiableList(senderMessageKeys_); + bitField0_ = (bitField0_ & ~0x00000008); + } + result.senderMessageKeys_ = senderMessageKeys_; + } else { + result.senderMessageKeys_ = senderMessageKeysBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure) { + return mergeFrom((org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure other) { + if (other == org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.getDefaultInstance()) return this; + if (other.hasSenderKeyId()) { + setSenderKeyId(other.getSenderKeyId()); + } + if (other.hasSenderChainKey()) { + mergeSenderChainKey(other.getSenderChainKey()); + } + if (other.hasSenderSigningKey()) { + mergeSenderSigningKey(other.getSenderSigningKey()); + } + if (senderMessageKeysBuilder_ == null) { + if (!other.senderMessageKeys_.isEmpty()) { + if (senderMessageKeys_.isEmpty()) { + senderMessageKeys_ = other.senderMessageKeys_; + bitField0_ = (bitField0_ & ~0x00000008); + } else { + ensureSenderMessageKeysIsMutable(); + senderMessageKeys_.addAll(other.senderMessageKeys_); + } + onChanged(); + } + } else { + if (!other.senderMessageKeys_.isEmpty()) { + if (senderMessageKeysBuilder_.isEmpty()) { + senderMessageKeysBuilder_.dispose(); + senderMessageKeysBuilder_ = null; + senderMessageKeys_ = other.senderMessageKeys_; + bitField0_ = (bitField0_ & ~0x00000008); + senderMessageKeysBuilder_ = + com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ? + getSenderMessageKeysFieldBuilder() : null; + } else { + senderMessageKeysBuilder_.addAllMessages(other.senderMessageKeys_); + } + } + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional uint32 senderKeyId = 1; + private int senderKeyId_ ; + /** + * optional uint32 senderKeyId = 1; + */ + public boolean hasSenderKeyId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 senderKeyId = 1; + */ + public int getSenderKeyId() { + return senderKeyId_; + } + /** + * optional uint32 senderKeyId = 1; + */ + public Builder setSenderKeyId(int value) { + bitField0_ |= 0x00000001; + senderKeyId_ = value; + onChanged(); + return this; + } + /** + * optional uint32 senderKeyId = 1; + */ + public Builder clearSenderKeyId() { + bitField0_ = (bitField0_ & ~0x00000001); + senderKeyId_ = 0; + onChanged(); + return this; + } + + // optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2; + private org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey senderChainKey_ = org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.Builder, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKeyOrBuilder> senderChainKeyBuilder_; + /** + * optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2; + */ + public boolean hasSenderChainKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey getSenderChainKey() { + if (senderChainKeyBuilder_ == null) { + return senderChainKey_; + } else { + return senderChainKeyBuilder_.getMessage(); + } + } + /** + * optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2; + */ + public Builder setSenderChainKey(org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey value) { + if (senderChainKeyBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + senderChainKey_ = value; + onChanged(); + } else { + senderChainKeyBuilder_.setMessage(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2; + */ + public Builder setSenderChainKey( + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.Builder builderForValue) { + if (senderChainKeyBuilder_ == null) { + senderChainKey_ = builderForValue.build(); + onChanged(); + } else { + senderChainKeyBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2; + */ + public Builder mergeSenderChainKey(org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey value) { + if (senderChainKeyBuilder_ == null) { + if (((bitField0_ & 0x00000002) == 0x00000002) && + senderChainKey_ != org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.getDefaultInstance()) { + senderChainKey_ = + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.newBuilder(senderChainKey_).mergeFrom(value).buildPartial(); + } else { + senderChainKey_ = value; + } + onChanged(); + } else { + senderChainKeyBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2; + */ + public Builder clearSenderChainKey() { + if (senderChainKeyBuilder_ == null) { + senderChainKey_ = org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.getDefaultInstance(); + onChanged(); + } else { + senderChainKeyBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + /** + * optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.Builder getSenderChainKeyBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getSenderChainKeyFieldBuilder().getBuilder(); + } + /** + * optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKeyOrBuilder getSenderChainKeyOrBuilder() { + if (senderChainKeyBuilder_ != null) { + return senderChainKeyBuilder_.getMessageOrBuilder(); + } else { + return senderChainKey_; + } + } + /** + * optional .textsecure.SenderKeyStateStructure.SenderChainKey senderChainKey = 2; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.Builder, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKeyOrBuilder> + getSenderChainKeyFieldBuilder() { + if (senderChainKeyBuilder_ == null) { + senderChainKeyBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKey.Builder, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderChainKeyOrBuilder>( + senderChainKey_, + getParentForChildren(), + isClean()); + senderChainKey_ = null; + } + return senderChainKeyBuilder_; + } + + // optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3; + private org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey senderSigningKey_ = org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.Builder, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKeyOrBuilder> senderSigningKeyBuilder_; + /** + * optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3; + */ + public boolean hasSenderSigningKey() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey getSenderSigningKey() { + if (senderSigningKeyBuilder_ == null) { + return senderSigningKey_; + } else { + return senderSigningKeyBuilder_.getMessage(); + } + } + /** + * optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3; + */ + public Builder setSenderSigningKey(org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey value) { + if (senderSigningKeyBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + senderSigningKey_ = value; + onChanged(); + } else { + senderSigningKeyBuilder_.setMessage(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3; + */ + public Builder setSenderSigningKey( + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.Builder builderForValue) { + if (senderSigningKeyBuilder_ == null) { + senderSigningKey_ = builderForValue.build(); + onChanged(); + } else { + senderSigningKeyBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3; + */ + public Builder mergeSenderSigningKey(org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey value) { + if (senderSigningKeyBuilder_ == null) { + if (((bitField0_ & 0x00000004) == 0x00000004) && + senderSigningKey_ != org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.getDefaultInstance()) { + senderSigningKey_ = + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.newBuilder(senderSigningKey_).mergeFrom(value).buildPartial(); + } else { + senderSigningKey_ = value; + } + onChanged(); + } else { + senderSigningKeyBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3; + */ + public Builder clearSenderSigningKey() { + if (senderSigningKeyBuilder_ == null) { + senderSigningKey_ = org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.getDefaultInstance(); + onChanged(); + } else { + senderSigningKeyBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + /** + * optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.Builder getSenderSigningKeyBuilder() { + bitField0_ |= 0x00000004; + onChanged(); + return getSenderSigningKeyFieldBuilder().getBuilder(); + } + /** + * optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKeyOrBuilder getSenderSigningKeyOrBuilder() { + if (senderSigningKeyBuilder_ != null) { + return senderSigningKeyBuilder_.getMessageOrBuilder(); + } else { + return senderSigningKey_; + } + } + /** + * optional .textsecure.SenderKeyStateStructure.SenderSigningKey senderSigningKey = 3; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.Builder, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKeyOrBuilder> + getSenderSigningKeyFieldBuilder() { + if (senderSigningKeyBuilder_ == null) { + senderSigningKeyBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKey.Builder, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderSigningKeyOrBuilder>( + senderSigningKey_, + getParentForChildren(), + isClean()); + senderSigningKey_ = null; + } + return senderSigningKeyBuilder_; + } + + // repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + private java.util.List senderMessageKeys_ = + java.util.Collections.emptyList(); + private void ensureSenderMessageKeysIsMutable() { + if (!((bitField0_ & 0x00000008) == 0x00000008)) { + senderMessageKeys_ = new java.util.ArrayList(senderMessageKeys_); + bitField0_ |= 0x00000008; + } + } + + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.Builder, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKeyOrBuilder> senderMessageKeysBuilder_; + + /** + * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + */ + public java.util.List getSenderMessageKeysList() { + if (senderMessageKeysBuilder_ == null) { + return java.util.Collections.unmodifiableList(senderMessageKeys_); + } else { + return senderMessageKeysBuilder_.getMessageList(); + } + } + /** + * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + */ + public int getSenderMessageKeysCount() { + if (senderMessageKeysBuilder_ == null) { + return senderMessageKeys_.size(); + } else { + return senderMessageKeysBuilder_.getCount(); + } + } + /** + * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey getSenderMessageKeys(int index) { + if (senderMessageKeysBuilder_ == null) { + return senderMessageKeys_.get(index); + } else { + return senderMessageKeysBuilder_.getMessage(index); + } + } + /** + * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + */ + public Builder setSenderMessageKeys( + int index, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey value) { + if (senderMessageKeysBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureSenderMessageKeysIsMutable(); + senderMessageKeys_.set(index, value); + onChanged(); + } else { + senderMessageKeysBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + */ + public Builder setSenderMessageKeys( + int index, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.Builder builderForValue) { + if (senderMessageKeysBuilder_ == null) { + ensureSenderMessageKeysIsMutable(); + senderMessageKeys_.set(index, builderForValue.build()); + onChanged(); + } else { + senderMessageKeysBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + */ + public Builder addSenderMessageKeys(org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey value) { + if (senderMessageKeysBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureSenderMessageKeysIsMutable(); + senderMessageKeys_.add(value); + onChanged(); + } else { + senderMessageKeysBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + */ + public Builder addSenderMessageKeys( + int index, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey value) { + if (senderMessageKeysBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureSenderMessageKeysIsMutable(); + senderMessageKeys_.add(index, value); + onChanged(); + } else { + senderMessageKeysBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + */ + public Builder addSenderMessageKeys( + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.Builder builderForValue) { + if (senderMessageKeysBuilder_ == null) { + ensureSenderMessageKeysIsMutable(); + senderMessageKeys_.add(builderForValue.build()); + onChanged(); + } else { + senderMessageKeysBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + */ + public Builder addSenderMessageKeys( + int index, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.Builder builderForValue) { + if (senderMessageKeysBuilder_ == null) { + ensureSenderMessageKeysIsMutable(); + senderMessageKeys_.add(index, builderForValue.build()); + onChanged(); + } else { + senderMessageKeysBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + */ + public Builder addAllSenderMessageKeys( + Iterable values) { + if (senderMessageKeysBuilder_ == null) { + ensureSenderMessageKeysIsMutable(); + super.addAll(values, senderMessageKeys_); + onChanged(); + } else { + senderMessageKeysBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + */ + public Builder clearSenderMessageKeys() { + if (senderMessageKeysBuilder_ == null) { + senderMessageKeys_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000008); + onChanged(); + } else { + senderMessageKeysBuilder_.clear(); + } + return this; + } + /** + * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + */ + public Builder removeSenderMessageKeys(int index) { + if (senderMessageKeysBuilder_ == null) { + ensureSenderMessageKeysIsMutable(); + senderMessageKeys_.remove(index); + onChanged(); + } else { + senderMessageKeysBuilder_.remove(index); + } + return this; + } + /** + * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.Builder getSenderMessageKeysBuilder( + int index) { + return getSenderMessageKeysFieldBuilder().getBuilder(index); + } + /** + * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKeyOrBuilder getSenderMessageKeysOrBuilder( + int index) { + if (senderMessageKeysBuilder_ == null) { + return senderMessageKeys_.get(index); } else { + return senderMessageKeysBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + */ + public java.util.List + getSenderMessageKeysOrBuilderList() { + if (senderMessageKeysBuilder_ != null) { + return senderMessageKeysBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(senderMessageKeys_); + } + } + /** + * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.Builder addSenderMessageKeysBuilder() { + return getSenderMessageKeysFieldBuilder().addBuilder( + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.getDefaultInstance()); + } + /** + * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.Builder addSenderMessageKeysBuilder( + int index) { + return getSenderMessageKeysFieldBuilder().addBuilder( + index, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.getDefaultInstance()); + } + /** + * repeated .textsecure.SenderKeyStateStructure.SenderMessageKey senderMessageKeys = 4; + */ + public java.util.List + getSenderMessageKeysBuilderList() { + return getSenderMessageKeysFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.Builder, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKeyOrBuilder> + getSenderMessageKeysFieldBuilder() { + if (senderMessageKeysBuilder_ == null) { + senderMessageKeysBuilder_ = new com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKey.Builder, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.SenderMessageKeyOrBuilder>( + senderMessageKeys_, + ((bitField0_ & 0x00000008) == 0x00000008), + getParentForChildren(), + isClean()); + senderMessageKeys_ = null; + } + return senderMessageKeysBuilder_; + } + + // @@protoc_insertion_point(builder_scope:textsecure.SenderKeyStateStructure) + } + + static { + defaultInstance = new SenderKeyStateStructure(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:textsecure.SenderKeyStateStructure) + } + + public interface SenderKeyRecordStructureOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + /** + * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + */ + java.util.List + getSenderKeyStatesList(); + /** + * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + */ + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure getSenderKeyStates(int index); + /** + * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + */ + int getSenderKeyStatesCount(); + /** + * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + */ + java.util.List + getSenderKeyStatesOrBuilderList(); + /** + * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + */ + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructureOrBuilder getSenderKeyStatesOrBuilder( + int index); + } + /** + * Protobuf type {@code textsecure.SenderKeyRecordStructure} + */ + public static final class SenderKeyRecordStructure extends + com.google.protobuf.GeneratedMessage + implements SenderKeyRecordStructureOrBuilder { + // Use SenderKeyRecordStructure.newBuilder() to construct. + private SenderKeyRecordStructure(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private SenderKeyRecordStructure(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final SenderKeyRecordStructure defaultInstance; + public static SenderKeyRecordStructure getDefaultInstance() { + return defaultInstance; + } + + public SenderKeyRecordStructure getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private SenderKeyRecordStructure( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) { + senderKeyStates_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + senderKeyStates_.add(input.readMessage(org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.PARSER, extensionRegistry)); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) { + senderKeyStates_ = java.util.Collections.unmodifiableList(senderKeyStates_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyRecordStructure_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyRecordStructure_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructure.class, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructure.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public SenderKeyRecordStructure parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new SenderKeyRecordStructure(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + // repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + public static final int SENDERKEYSTATES_FIELD_NUMBER = 1; + private java.util.List senderKeyStates_; + /** + * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + */ + public java.util.List getSenderKeyStatesList() { + return senderKeyStates_; + } + /** + * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + */ + public java.util.List + getSenderKeyStatesOrBuilderList() { + return senderKeyStates_; + } + /** + * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + */ + public int getSenderKeyStatesCount() { + return senderKeyStates_.size(); + } + /** + * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure getSenderKeyStates(int index) { + return senderKeyStates_.get(index); + } + /** + * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructureOrBuilder getSenderKeyStatesOrBuilder( + int index) { + return senderKeyStates_.get(index); + } + + private void initFields() { + senderKeyStates_ = java.util.Collections.emptyList(); + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + for (int i = 0; i < senderKeyStates_.size(); i++) { + output.writeMessage(1, senderKeyStates_.get(i)); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + for (int i = 0; i < senderKeyStates_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, senderKeyStates_.get(i)); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructure parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructure parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructure parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructure parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructure parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructure parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructure parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructure parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructure parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructure parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructure prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code textsecure.SenderKeyRecordStructure} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructureOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyRecordStructure_descriptor; + } + + protected FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyRecordStructure_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructure.class, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructure.Builder.class); + } + + // Construct using org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructure.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getSenderKeyStatesFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + if (senderKeyStatesBuilder_ == null) { + senderKeyStates_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + } else { + senderKeyStatesBuilder_.clear(); + } + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.libsignal.state.StorageProtos.internal_static_textsecure_SenderKeyRecordStructure_descriptor; + } + + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructure getDefaultInstanceForType() { + return org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructure.getDefaultInstance(); + } + + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructure build() { + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructure result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructure buildPartial() { + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructure result = new org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructure(this); + int from_bitField0_ = bitField0_; + if (senderKeyStatesBuilder_ == null) { + if (((bitField0_ & 0x00000001) == 0x00000001)) { + senderKeyStates_ = java.util.Collections.unmodifiableList(senderKeyStates_); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.senderKeyStates_ = senderKeyStates_; + } else { + result.senderKeyStates_ = senderKeyStatesBuilder_.build(); + } + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructure) { + return mergeFrom((org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructure)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructure other) { + if (other == org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructure.getDefaultInstance()) return this; + if (senderKeyStatesBuilder_ == null) { + if (!other.senderKeyStates_.isEmpty()) { + if (senderKeyStates_.isEmpty()) { + senderKeyStates_ = other.senderKeyStates_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureSenderKeyStatesIsMutable(); + senderKeyStates_.addAll(other.senderKeyStates_); + } + onChanged(); + } + } else { + if (!other.senderKeyStates_.isEmpty()) { + if (senderKeyStatesBuilder_.isEmpty()) { + senderKeyStatesBuilder_.dispose(); + senderKeyStatesBuilder_ = null; + senderKeyStates_ = other.senderKeyStates_; + bitField0_ = (bitField0_ & ~0x00000001); + senderKeyStatesBuilder_ = + com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ? + getSenderKeyStatesFieldBuilder() : null; + } else { + senderKeyStatesBuilder_.addAllMessages(other.senderKeyStates_); + } + } + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructure parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.libsignal.state.StorageProtos.SenderKeyRecordStructure) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + private java.util.List senderKeyStates_ = + java.util.Collections.emptyList(); + private void ensureSenderKeyStatesIsMutable() { + if (!((bitField0_ & 0x00000001) == 0x00000001)) { + senderKeyStates_ = new java.util.ArrayList(senderKeyStates_); + bitField0_ |= 0x00000001; + } + } + + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.Builder, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructureOrBuilder> senderKeyStatesBuilder_; + + /** + * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + */ + public java.util.List getSenderKeyStatesList() { + if (senderKeyStatesBuilder_ == null) { + return java.util.Collections.unmodifiableList(senderKeyStates_); + } else { + return senderKeyStatesBuilder_.getMessageList(); + } + } + /** + * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + */ + public int getSenderKeyStatesCount() { + if (senderKeyStatesBuilder_ == null) { + return senderKeyStates_.size(); + } else { + return senderKeyStatesBuilder_.getCount(); + } + } + /** + * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure getSenderKeyStates(int index) { + if (senderKeyStatesBuilder_ == null) { + return senderKeyStates_.get(index); + } else { + return senderKeyStatesBuilder_.getMessage(index); + } + } + /** + * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + */ + public Builder setSenderKeyStates( + int index, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure value) { + if (senderKeyStatesBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureSenderKeyStatesIsMutable(); + senderKeyStates_.set(index, value); + onChanged(); + } else { + senderKeyStatesBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + */ + public Builder setSenderKeyStates( + int index, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.Builder builderForValue) { + if (senderKeyStatesBuilder_ == null) { + ensureSenderKeyStatesIsMutable(); + senderKeyStates_.set(index, builderForValue.build()); + onChanged(); + } else { + senderKeyStatesBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + */ + public Builder addSenderKeyStates(org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure value) { + if (senderKeyStatesBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureSenderKeyStatesIsMutable(); + senderKeyStates_.add(value); + onChanged(); + } else { + senderKeyStatesBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + */ + public Builder addSenderKeyStates( + int index, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure value) { + if (senderKeyStatesBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureSenderKeyStatesIsMutable(); + senderKeyStates_.add(index, value); + onChanged(); + } else { + senderKeyStatesBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + */ + public Builder addSenderKeyStates( + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.Builder builderForValue) { + if (senderKeyStatesBuilder_ == null) { + ensureSenderKeyStatesIsMutable(); + senderKeyStates_.add(builderForValue.build()); + onChanged(); + } else { + senderKeyStatesBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + */ + public Builder addSenderKeyStates( + int index, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.Builder builderForValue) { + if (senderKeyStatesBuilder_ == null) { + ensureSenderKeyStatesIsMutable(); + senderKeyStates_.add(index, builderForValue.build()); + onChanged(); + } else { + senderKeyStatesBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + */ + public Builder addAllSenderKeyStates( + Iterable values) { + if (senderKeyStatesBuilder_ == null) { + ensureSenderKeyStatesIsMutable(); + super.addAll(values, senderKeyStates_); + onChanged(); + } else { + senderKeyStatesBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + */ + public Builder clearSenderKeyStates() { + if (senderKeyStatesBuilder_ == null) { + senderKeyStates_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + } else { + senderKeyStatesBuilder_.clear(); + } + return this; + } + /** + * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + */ + public Builder removeSenderKeyStates(int index) { + if (senderKeyStatesBuilder_ == null) { + ensureSenderKeyStatesIsMutable(); + senderKeyStates_.remove(index); + onChanged(); + } else { + senderKeyStatesBuilder_.remove(index); + } + return this; + } + /** + * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.Builder getSenderKeyStatesBuilder( + int index) { + return getSenderKeyStatesFieldBuilder().getBuilder(index); + } + /** + * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructureOrBuilder getSenderKeyStatesOrBuilder( + int index) { + if (senderKeyStatesBuilder_ == null) { + return senderKeyStates_.get(index); } else { + return senderKeyStatesBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + */ + public java.util.List + getSenderKeyStatesOrBuilderList() { + if (senderKeyStatesBuilder_ != null) { + return senderKeyStatesBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(senderKeyStates_); + } + } + /** + * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.Builder addSenderKeyStatesBuilder() { + return getSenderKeyStatesFieldBuilder().addBuilder( + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.getDefaultInstance()); + } + /** + * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + */ + public org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.Builder addSenderKeyStatesBuilder( + int index) { + return getSenderKeyStatesFieldBuilder().addBuilder( + index, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.getDefaultInstance()); + } + /** + * repeated .textsecure.SenderKeyStateStructure senderKeyStates = 1; + */ + public java.util.List + getSenderKeyStatesBuilderList() { + return getSenderKeyStatesFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.Builder, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructureOrBuilder> + getSenderKeyStatesFieldBuilder() { + if (senderKeyStatesBuilder_ == null) { + senderKeyStatesBuilder_ = new com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructure.Builder, org.session.libsignal.libsignal.state.StorageProtos.SenderKeyStateStructureOrBuilder>( + senderKeyStates_, + ((bitField0_ & 0x00000001) == 0x00000001), + getParentForChildren(), + isClean()); + senderKeyStates_ = null; + } + return senderKeyStatesBuilder_; + } + + // @@protoc_insertion_point(builder_scope:textsecure.SenderKeyRecordStructure) + } + + static { + defaultInstance = new SenderKeyRecordStructure(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:textsecure.SenderKeyRecordStructure) + } + + private static com.google.protobuf.Descriptors.Descriptor + internal_static_textsecure_SessionStructure_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_textsecure_SessionStructure_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_textsecure_SessionStructure_Chain_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_textsecure_SessionStructure_Chain_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_textsecure_SessionStructure_Chain_ChainKey_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_textsecure_SessionStructure_Chain_ChainKey_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_textsecure_SessionStructure_Chain_MessageKey_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_textsecure_SessionStructure_Chain_MessageKey_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_textsecure_SessionStructure_PendingKeyExchange_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_textsecure_SessionStructure_PendingKeyExchange_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_textsecure_SessionStructure_PendingPreKey_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_textsecure_SessionStructure_PendingPreKey_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_textsecure_RecordStructure_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_textsecure_RecordStructure_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_textsecure_PreKeyRecordStructure_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_textsecure_PreKeyRecordStructure_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_textsecure_SignedPreKeyRecordStructure_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_textsecure_SignedPreKeyRecordStructure_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_textsecure_IdentityKeyPairStructure_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_textsecure_IdentityKeyPairStructure_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_textsecure_SenderKeyStateStructure_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_textsecure_SenderKeyStateStructure_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_textsecure_SenderKeyStateStructure_SenderChainKey_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_textsecure_SenderKeyStateStructure_SenderChainKey_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_textsecure_SenderKeyStateStructure_SenderMessageKey_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_textsecure_SenderKeyStateStructure_SenderMessageKey_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_textsecure_SenderKeyStateStructure_SenderSigningKey_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_textsecure_SenderKeyStateStructure_SenderSigningKey_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_textsecure_SenderKeyRecordStructure_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_textsecure_SenderKeyRecordStructure_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + String[] descriptorData = { + "\n\032LocalStorageProtocol.proto\022\ntextsecure" + + "\"\323\010\n\020SessionStructure\022\026\n\016sessionVersion\030" + + "\001 \001(\r\022\033\n\023localIdentityPublic\030\002 \001(\014\022\034\n\024re" + + "moteIdentityPublic\030\003 \001(\014\022\017\n\007rootKey\030\004 \001(" + + "\014\022\027\n\017previousCounter\030\005 \001(\r\0227\n\013senderChai" + + "n\030\006 \001(\0132\".textsecure.SessionStructure.Ch" + + "ain\022:\n\016receiverChains\030\007 \003(\0132\".textsecure" + + ".SessionStructure.Chain\022K\n\022pendingKeyExc" + + "hange\030\010 \001(\0132/.textsecure.SessionStructur" + + "e.PendingKeyExchange\022A\n\rpendingPreKey\030\t ", + "\001(\0132*.textsecure.SessionStructure.Pendin" + + "gPreKey\022\034\n\024remoteRegistrationId\030\n \001(\r\022\033\n" + + "\023localRegistrationId\030\013 \001(\r\022\024\n\014needsRefre" + + "sh\030\014 \001(\010\022\024\n\014aliceBaseKey\030\r \001(\014\032\271\002\n\005Chain" + + "\022\030\n\020senderRatchetKey\030\001 \001(\014\022\037\n\027senderRatc" + + "hetKeyPrivate\030\002 \001(\014\022=\n\010chainKey\030\003 \001(\0132+." + + "textsecure.SessionStructure.Chain.ChainK" + + "ey\022B\n\013messageKeys\030\004 \003(\0132-.textsecure.Ses" + + "sionStructure.Chain.MessageKey\032&\n\010ChainK" + + "ey\022\r\n\005index\030\001 \001(\r\022\013\n\003key\030\002 \001(\014\032J\n\nMessag", + "eKey\022\r\n\005index\030\001 \001(\r\022\021\n\tcipherKey\030\002 \001(\014\022\016" + + "\n\006macKey\030\003 \001(\014\022\n\n\002iv\030\004 \001(\014\032\315\001\n\022PendingKe" + + "yExchange\022\020\n\010sequence\030\001 \001(\r\022\024\n\014localBase" + + "Key\030\002 \001(\014\022\033\n\023localBaseKeyPrivate\030\003 \001(\014\022\027" + + "\n\017localRatchetKey\030\004 \001(\014\022\036\n\026localRatchetK" + + "eyPrivate\030\005 \001(\014\022\030\n\020localIdentityKey\030\007 \001(" + + "\014\022\037\n\027localIdentityKeyPrivate\030\010 \001(\014\032J\n\rPe" + + "ndingPreKey\022\020\n\010preKeyId\030\001 \001(\r\022\026\n\016signedP" + + "reKeyId\030\003 \001(\005\022\017\n\007baseKey\030\002 \001(\014\"\177\n\017Record" + + "Structure\0224\n\016currentSession\030\001 \001(\0132\034.text", + "secure.SessionStructure\0226\n\020previousSessi" + + "ons\030\002 \003(\0132\034.textsecure.SessionStructure\"" + + "J\n\025PreKeyRecordStructure\022\n\n\002id\030\001 \001(\r\022\021\n\t" + + "publicKey\030\002 \001(\014\022\022\n\nprivateKey\030\003 \001(\014\"v\n\033S" + + "ignedPreKeyRecordStructure\022\n\n\002id\030\001 \001(\r\022\021" + + "\n\tpublicKey\030\002 \001(\014\022\022\n\nprivateKey\030\003 \001(\014\022\021\n" + + "\tsignature\030\004 \001(\014\022\021\n\ttimestamp\030\005 \001(\006\"A\n\030I" + + "dentityKeyPairStructure\022\021\n\tpublicKey\030\001 \001" + + "(\014\022\022\n\nprivateKey\030\002 \001(\014\"\270\003\n\027SenderKeyStat" + + "eStructure\022\023\n\013senderKeyId\030\001 \001(\r\022J\n\016sende", + "rChainKey\030\002 \001(\01322.textsecure.SenderKeySt" + + "ateStructure.SenderChainKey\022N\n\020senderSig" + + "ningKey\030\003 \001(\01324.textsecure.SenderKeyStat" + + "eStructure.SenderSigningKey\022O\n\021senderMes" + + "sageKeys\030\004 \003(\01324.textsecure.SenderKeySta" + + "teStructure.SenderMessageKey\0321\n\016SenderCh" + + "ainKey\022\021\n\titeration\030\001 \001(\r\022\014\n\004seed\030\002 \001(\014\032" + + "3\n\020SenderMessageKey\022\021\n\titeration\030\001 \001(\r\022\014" + + "\n\004seed\030\002 \001(\014\0323\n\020SenderSigningKey\022\016\n\006publ" + + "ic\030\001 \001(\014\022\017\n\007private\030\002 \001(\014\"X\n\030SenderKeyRe", + "cordStructure\022<\n\017senderKeyStates\030\001 \003(\0132#" + + ".textsecure.SenderKeyStateStructureB3\n\"o" + + "rg.whispersystems.libsignal.stateB\rStora" + + "geProtos" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + internal_static_textsecure_SessionStructure_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_textsecure_SessionStructure_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_textsecure_SessionStructure_descriptor, + new String[] { "SessionVersion", "LocalIdentityPublic", "RemoteIdentityPublic", "RootKey", "PreviousCounter", "SenderChain", "ReceiverChains", "PendingKeyExchange", "PendingPreKey", "RemoteRegistrationId", "LocalRegistrationId", "NeedsRefresh", "AliceBaseKey", }); + internal_static_textsecure_SessionStructure_Chain_descriptor = + internal_static_textsecure_SessionStructure_descriptor.getNestedTypes().get(0); + internal_static_textsecure_SessionStructure_Chain_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_textsecure_SessionStructure_Chain_descriptor, + new String[] { "SenderRatchetKey", "SenderRatchetKeyPrivate", "ChainKey", "MessageKeys", }); + internal_static_textsecure_SessionStructure_Chain_ChainKey_descriptor = + internal_static_textsecure_SessionStructure_Chain_descriptor.getNestedTypes().get(0); + internal_static_textsecure_SessionStructure_Chain_ChainKey_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_textsecure_SessionStructure_Chain_ChainKey_descriptor, + new String[] { "Index", "Key", }); + internal_static_textsecure_SessionStructure_Chain_MessageKey_descriptor = + internal_static_textsecure_SessionStructure_Chain_descriptor.getNestedTypes().get(1); + internal_static_textsecure_SessionStructure_Chain_MessageKey_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_textsecure_SessionStructure_Chain_MessageKey_descriptor, + new String[] { "Index", "CipherKey", "MacKey", "Iv", }); + internal_static_textsecure_SessionStructure_PendingKeyExchange_descriptor = + internal_static_textsecure_SessionStructure_descriptor.getNestedTypes().get(1); + internal_static_textsecure_SessionStructure_PendingKeyExchange_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_textsecure_SessionStructure_PendingKeyExchange_descriptor, + new String[] { "Sequence", "LocalBaseKey", "LocalBaseKeyPrivate", "LocalRatchetKey", "LocalRatchetKeyPrivate", "LocalIdentityKey", "LocalIdentityKeyPrivate", }); + internal_static_textsecure_SessionStructure_PendingPreKey_descriptor = + internal_static_textsecure_SessionStructure_descriptor.getNestedTypes().get(2); + internal_static_textsecure_SessionStructure_PendingPreKey_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_textsecure_SessionStructure_PendingPreKey_descriptor, + new String[] { "PreKeyId", "SignedPreKeyId", "BaseKey", }); + internal_static_textsecure_RecordStructure_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_textsecure_RecordStructure_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_textsecure_RecordStructure_descriptor, + new String[] { "CurrentSession", "PreviousSessions", }); + internal_static_textsecure_PreKeyRecordStructure_descriptor = + getDescriptor().getMessageTypes().get(2); + internal_static_textsecure_PreKeyRecordStructure_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_textsecure_PreKeyRecordStructure_descriptor, + new String[] { "Id", "PublicKey", "PrivateKey", }); + internal_static_textsecure_SignedPreKeyRecordStructure_descriptor = + getDescriptor().getMessageTypes().get(3); + internal_static_textsecure_SignedPreKeyRecordStructure_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_textsecure_SignedPreKeyRecordStructure_descriptor, + new String[] { "Id", "PublicKey", "PrivateKey", "Signature", "Timestamp", }); + internal_static_textsecure_IdentityKeyPairStructure_descriptor = + getDescriptor().getMessageTypes().get(4); + internal_static_textsecure_IdentityKeyPairStructure_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_textsecure_IdentityKeyPairStructure_descriptor, + new String[] { "PublicKey", "PrivateKey", }); + internal_static_textsecure_SenderKeyStateStructure_descriptor = + getDescriptor().getMessageTypes().get(5); + internal_static_textsecure_SenderKeyStateStructure_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_textsecure_SenderKeyStateStructure_descriptor, + new String[] { "SenderKeyId", "SenderChainKey", "SenderSigningKey", "SenderMessageKeys", }); + internal_static_textsecure_SenderKeyStateStructure_SenderChainKey_descriptor = + internal_static_textsecure_SenderKeyStateStructure_descriptor.getNestedTypes().get(0); + internal_static_textsecure_SenderKeyStateStructure_SenderChainKey_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_textsecure_SenderKeyStateStructure_SenderChainKey_descriptor, + new String[] { "Iteration", "Seed", }); + internal_static_textsecure_SenderKeyStateStructure_SenderMessageKey_descriptor = + internal_static_textsecure_SenderKeyStateStructure_descriptor.getNestedTypes().get(1); + internal_static_textsecure_SenderKeyStateStructure_SenderMessageKey_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_textsecure_SenderKeyStateStructure_SenderMessageKey_descriptor, + new String[] { "Iteration", "Seed", }); + internal_static_textsecure_SenderKeyStateStructure_SenderSigningKey_descriptor = + internal_static_textsecure_SenderKeyStateStructure_descriptor.getNestedTypes().get(2); + internal_static_textsecure_SenderKeyStateStructure_SenderSigningKey_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_textsecure_SenderKeyStateStructure_SenderSigningKey_descriptor, + new String[] { "Public", "Private", }); + internal_static_textsecure_SenderKeyRecordStructure_descriptor = + getDescriptor().getMessageTypes().get(6); + internal_static_textsecure_SenderKeyRecordStructure_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_textsecure_SenderKeyRecordStructure_descriptor, + new String[] { "SenderKeyStates", }); + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/state/impl/InMemoryIdentityKeyStore.java b/libsignal/src/main/java/org/session/libsignal/libsignal/state/impl/InMemoryIdentityKeyStore.java new file mode 100644 index 000000000..7e48eb121 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/state/impl/InMemoryIdentityKeyStore.java @@ -0,0 +1,60 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.state.impl; + +import org.session.libsignal.libsignal.IdentityKey; +import org.session.libsignal.libsignal.IdentityKeyPair; +import org.session.libsignal.libsignal.SignalProtocolAddress; +import org.session.libsignal.libsignal.state.IdentityKeyStore; + +import java.util.HashMap; +import java.util.Map; + +public class InMemoryIdentityKeyStore implements IdentityKeyStore { + + private final Map trustedKeys = new HashMap(); + + private final IdentityKeyPair identityKeyPair; + private final int localRegistrationId; + + public InMemoryIdentityKeyStore(IdentityKeyPair identityKeyPair, int localRegistrationId) { + this.identityKeyPair = identityKeyPair; + this.localRegistrationId = localRegistrationId; + } + + @Override + public IdentityKeyPair getIdentityKeyPair() { + return identityKeyPair; + } + + @Override + public int getLocalRegistrationId() { + return localRegistrationId; + } + + @Override + public boolean saveIdentity(SignalProtocolAddress address, IdentityKey identityKey) { + IdentityKey existing = trustedKeys.get(address); + + if (!identityKey.equals(existing)) { + trustedKeys.put(address, identityKey); + return true; + } else { + return false; + } + } + + @Override + public boolean isTrustedIdentity(SignalProtocolAddress address, IdentityKey identityKey, Direction direction) { + IdentityKey trusted = trustedKeys.get(address); + return (trusted == null || trusted.equals(identityKey)); + } + + @Override + public IdentityKey getIdentity(SignalProtocolAddress address) { + return trustedKeys.get(address); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/state/impl/InMemoryPreKeyStore.java b/libsignal/src/main/java/org/session/libsignal/libsignal/state/impl/InMemoryPreKeyStore.java new file mode 100644 index 000000000..ed6b66c3c --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/state/impl/InMemoryPreKeyStore.java @@ -0,0 +1,47 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.state.impl; + +import org.session.libsignal.libsignal.InvalidKeyIdException; +import org.session.libsignal.libsignal.state.PreKeyRecord; +import org.session.libsignal.libsignal.state.PreKeyStore; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +public class InMemoryPreKeyStore implements PreKeyStore { + + private final Map store = new HashMap(); + + @Override + public PreKeyRecord loadPreKey(int preKeyId) throws InvalidKeyIdException { + try { + if (!store.containsKey(preKeyId)) { + throw new InvalidKeyIdException("No such prekeyrecord!"); + } + + return new PreKeyRecord(store.get(preKeyId)); + } catch (IOException e) { + throw new AssertionError(e); + } + } + + @Override + public void storePreKey(int preKeyId, PreKeyRecord record) { + store.put(preKeyId, record.serialize()); + } + + @Override + public boolean containsPreKey(int preKeyId) { + return store.containsKey(preKeyId); + } + + @Override + public void removePreKey(int preKeyId) { + store.remove(preKeyId); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/state/impl/InMemorySessionStore.java b/libsignal/src/main/java/org/session/libsignal/libsignal/state/impl/InMemorySessionStore.java new file mode 100644 index 000000000..9bc734e5e --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/state/impl/InMemorySessionStore.java @@ -0,0 +1,75 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.state.impl; + +import org.session.libsignal.libsignal.SignalProtocolAddress; +import org.session.libsignal.libsignal.state.SessionRecord; +import org.session.libsignal.libsignal.state.SessionStore; + +import java.io.IOException; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +public class InMemorySessionStore implements SessionStore { + + private Map sessions = new HashMap(); + + public InMemorySessionStore() {} + + @Override + public synchronized SessionRecord loadSession(SignalProtocolAddress remoteAddress) { + try { + if (containsSession(remoteAddress)) { + return new SessionRecord(sessions.get(remoteAddress)); + } else { + return new SessionRecord(); + } + } catch (IOException e) { + throw new AssertionError(e); + } + } + + @Override + public synchronized List getSubDeviceSessions(String name) { + List deviceIds = new LinkedList(); + + for (SignalProtocolAddress key : sessions.keySet()) { + if (key.getName().equals(name) && + key.getDeviceId() != 1) + { + deviceIds.add(key.getDeviceId()); + } + } + + return deviceIds; + } + + @Override + public synchronized void storeSession(SignalProtocolAddress address, SessionRecord record) { + sessions.put(address, record.serialize()); + } + + @Override + public synchronized boolean containsSession(SignalProtocolAddress address) { + return sessions.containsKey(address); + } + + @Override + public synchronized void deleteSession(SignalProtocolAddress address) { + sessions.remove(address); + } + + @Override + public synchronized void deleteAllSessions(String name) { + for (SignalProtocolAddress key : sessions.keySet()) { + if (key.getName().equals(name)) { + sessions.remove(key); + } + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/state/impl/InMemorySignalProtocolStore.java b/libsignal/src/main/java/org/session/libsignal/libsignal/state/impl/InMemorySignalProtocolStore.java new file mode 100644 index 000000000..eb0129e0b --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/state/impl/InMemorySignalProtocolStore.java @@ -0,0 +1,130 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.state.impl; + +import org.session.libsignal.libsignal.SignalProtocolAddress; +import org.session.libsignal.libsignal.IdentityKey; +import org.session.libsignal.libsignal.IdentityKeyPair; +import org.session.libsignal.libsignal.InvalidKeyIdException; +import org.session.libsignal.libsignal.state.SignalProtocolStore; +import org.session.libsignal.libsignal.state.PreKeyRecord; +import org.session.libsignal.libsignal.state.SessionRecord; +import org.session.libsignal.libsignal.state.SignedPreKeyRecord; + +import java.util.List; + +public class InMemorySignalProtocolStore implements SignalProtocolStore { + + private final InMemoryPreKeyStore preKeyStore = new InMemoryPreKeyStore(); + private final InMemorySessionStore sessionStore = new InMemorySessionStore(); + private final InMemorySignedPreKeyStore signedPreKeyStore = new InMemorySignedPreKeyStore(); + + private final InMemoryIdentityKeyStore identityKeyStore; + + public InMemorySignalProtocolStore(IdentityKeyPair identityKeyPair, int registrationId) { + this.identityKeyStore = new InMemoryIdentityKeyStore(identityKeyPair, registrationId); + } + + @Override + public IdentityKeyPair getIdentityKeyPair() { + return identityKeyStore.getIdentityKeyPair(); + } + + @Override + public int getLocalRegistrationId() { + return identityKeyStore.getLocalRegistrationId(); + } + + @Override + public boolean saveIdentity(SignalProtocolAddress address, IdentityKey identityKey) { + return identityKeyStore.saveIdentity(address, identityKey); + } + + @Override + public boolean isTrustedIdentity(SignalProtocolAddress address, IdentityKey identityKey, Direction direction) { + return identityKeyStore.isTrustedIdentity(address, identityKey, direction); + } + + @Override + public IdentityKey getIdentity(SignalProtocolAddress address) { + return identityKeyStore.getIdentity(address); + } + + @Override + public PreKeyRecord loadPreKey(int preKeyId) throws InvalidKeyIdException { + return preKeyStore.loadPreKey(preKeyId); + } + + @Override + public void storePreKey(int preKeyId, PreKeyRecord record) { + preKeyStore.storePreKey(preKeyId, record); + } + + @Override + public boolean containsPreKey(int preKeyId) { + return preKeyStore.containsPreKey(preKeyId); + } + + @Override + public void removePreKey(int preKeyId) { + preKeyStore.removePreKey(preKeyId); + } + + @Override + public SessionRecord loadSession(SignalProtocolAddress address) { + return sessionStore.loadSession(address); + } + + @Override + public List getSubDeviceSessions(String name) { + return sessionStore.getSubDeviceSessions(name); + } + + @Override + public void storeSession(SignalProtocolAddress address, SessionRecord record) { + sessionStore.storeSession(address, record); + } + + @Override + public boolean containsSession(SignalProtocolAddress address) { + return sessionStore.containsSession(address); + } + + @Override + public void deleteSession(SignalProtocolAddress address) { + sessionStore.deleteSession(address); + } + + @Override + public void deleteAllSessions(String name) { + sessionStore.deleteAllSessions(name); + } + + @Override + public SignedPreKeyRecord loadSignedPreKey(int signedPreKeyId) throws InvalidKeyIdException { + return signedPreKeyStore.loadSignedPreKey(signedPreKeyId); + } + + @Override + public List loadSignedPreKeys() { + return signedPreKeyStore.loadSignedPreKeys(); + } + + @Override + public void storeSignedPreKey(int signedPreKeyId, SignedPreKeyRecord record) { + signedPreKeyStore.storeSignedPreKey(signedPreKeyId, record); + } + + @Override + public boolean containsSignedPreKey(int signedPreKeyId) { + return signedPreKeyStore.containsSignedPreKey(signedPreKeyId); + } + + @Override + public void removeSignedPreKey(int signedPreKeyId) { + signedPreKeyStore.removeSignedPreKey(signedPreKeyId); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/state/impl/InMemorySignedPreKeyStore.java b/libsignal/src/main/java/org/session/libsignal/libsignal/state/impl/InMemorySignedPreKeyStore.java new file mode 100644 index 000000000..80b15b979 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/state/impl/InMemorySignedPreKeyStore.java @@ -0,0 +1,64 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.state.impl; + +import org.session.libsignal.libsignal.InvalidKeyIdException; +import org.session.libsignal.libsignal.state.SignedPreKeyRecord; +import org.session.libsignal.libsignal.state.SignedPreKeyStore; + +import java.io.IOException; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +public class InMemorySignedPreKeyStore implements SignedPreKeyStore { + + private final Map store = new HashMap(); + + @Override + public SignedPreKeyRecord loadSignedPreKey(int signedPreKeyId) throws InvalidKeyIdException { + try { + if (!store.containsKey(signedPreKeyId)) { + throw new InvalidKeyIdException("No such signedprekeyrecord! " + signedPreKeyId); + } + + return new SignedPreKeyRecord(store.get(signedPreKeyId)); + } catch (IOException e) { + throw new AssertionError(e); + } + } + + @Override + public List loadSignedPreKeys() { + try { + List results = new LinkedList(); + + for (byte[] serialized : store.values()) { + results.add(new SignedPreKeyRecord(serialized)); + } + + return results; + } catch (IOException e) { + throw new AssertionError(e); + } + } + + @Override + public void storeSignedPreKey(int signedPreKeyId, SignedPreKeyRecord record) { + store.put(signedPreKeyId, record.serialize()); + } + + @Override + public boolean containsSignedPreKey(int signedPreKeyId) { + return store.containsKey(signedPreKeyId); + } + + @Override + public void removeSignedPreKey(int signedPreKeyId) { + store.remove(signedPreKeyId); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/util/ByteArrayComparator.java b/libsignal/src/main/java/org/session/libsignal/libsignal/util/ByteArrayComparator.java new file mode 100644 index 000000000..9beb1b46e --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/util/ByteArrayComparator.java @@ -0,0 +1,18 @@ +package org.session.libsignal.libsignal.util; + +public abstract class ByteArrayComparator { + + protected int compare(byte[] left, byte[] right) { + for (int i = 0, j = 0; i < left.length && j < right.length; i++, j++) { + int a = (left[i] & 0xff); + int b = (right[j] & 0xff); + + if (a != b) { + return a - b; + } + } + + return left.length - right.length; + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/util/ByteUtil.java b/libsignal/src/main/java/org/session/libsignal/libsignal/util/ByteUtil.java new file mode 100644 index 000000000..8f050e006 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/util/ByteUtil.java @@ -0,0 +1,246 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.util; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.text.ParseException; + +public class ByteUtil { + + public static byte[] combine(byte[]... elements) { + try { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + for (byte[] element : elements) { + baos.write(element); + } + + return baos.toByteArray(); + } catch (IOException e) { + throw new AssertionError(e); + } + } + + public static byte[][] split(byte[] input, int firstLength, int secondLength) { + byte[][] parts = new byte[2][]; + + parts[0] = new byte[firstLength]; + System.arraycopy(input, 0, parts[0], 0, firstLength); + + parts[1] = new byte[secondLength]; + System.arraycopy(input, firstLength, parts[1], 0, secondLength); + + return parts; + } + + public static byte[][] split(byte[] input, int firstLength, int secondLength, int thirdLength) + throws ParseException + { + if (input == null || firstLength < 0 || secondLength < 0 || thirdLength < 0 || + input.length < firstLength + secondLength + thirdLength) + { + throw new ParseException("Input too small: " + (input == null ? null : Hex.toString(input)), 0); + } + + byte[][] parts = new byte[3][]; + + parts[0] = new byte[firstLength]; + System.arraycopy(input, 0, parts[0], 0, firstLength); + + parts[1] = new byte[secondLength]; + System.arraycopy(input, firstLength, parts[1], 0, secondLength); + + parts[2] = new byte[thirdLength]; + System.arraycopy(input, firstLength + secondLength, parts[2], 0, thirdLength); + + return parts; + } + + public static byte[] trim(byte[] input, int length) { + byte[] result = new byte[length]; + System.arraycopy(input, 0, result, 0, result.length); + + return result; + } + + public static byte[] copyFrom(byte[] input) { + byte[] output = new byte[input.length]; + System.arraycopy(input, 0, output, 0, output.length); + + return output; + } + + public static byte intsToByteHighAndLow(int highValue, int lowValue) { + return (byte)((highValue << 4 | lowValue) & 0xFF); + } + + public static int highBitsToInt(byte value) { + return (value & 0xFF) >> 4; + } + + public static int lowBitsToInt(byte value) { + return (value & 0xF); + } + + public static int highBitsToMedium(int value) { + return (value >> 12); + } + + public static int lowBitsToMedium(int value) { + return (value & 0xFFF); + } + + public static byte[] shortToByteArray(int value) { + byte[] bytes = new byte[2]; + shortToByteArray(bytes, 0, value); + return bytes; + } + + public static int shortToByteArray(byte[] bytes, int offset, int value) { + bytes[offset+1] = (byte)value; + bytes[offset] = (byte)(value >> 8); + return 2; + } + + public static int shortToLittleEndianByteArray(byte[] bytes, int offset, int value) { + bytes[offset] = (byte)value; + bytes[offset+1] = (byte)(value >> 8); + return 2; + } + + public static byte[] mediumToByteArray(int value) { + byte[] bytes = new byte[3]; + mediumToByteArray(bytes, 0, value); + return bytes; + } + + public static int mediumToByteArray(byte[] bytes, int offset, int value) { + bytes[offset + 2] = (byte)value; + bytes[offset + 1] = (byte)(value >> 8); + bytes[offset] = (byte)(value >> 16); + return 3; + } + + public static byte[] intToByteArray(int value) { + byte[] bytes = new byte[4]; + intToByteArray(bytes, 0, value); + return bytes; + } + + public static int intToByteArray(byte[] bytes, int offset, int value) { + bytes[offset + 3] = (byte)value; + bytes[offset + 2] = (byte)(value >> 8); + bytes[offset + 1] = (byte)(value >> 16); + bytes[offset] = (byte)(value >> 24); + return 4; + } + + public static int intToLittleEndianByteArray(byte[] bytes, int offset, int value) { + bytes[offset] = (byte)value; + bytes[offset+1] = (byte)(value >> 8); + bytes[offset+2] = (byte)(value >> 16); + bytes[offset+3] = (byte)(value >> 24); + return 4; + } + + public static byte[] longToByteArray(long l) { + byte[] bytes = new byte[8]; + longToByteArray(bytes, 0, l); + return bytes; + } + + public static int longToByteArray(byte[] bytes, int offset, long value) { + bytes[offset + 7] = (byte)value; + bytes[offset + 6] = (byte)(value >> 8); + bytes[offset + 5] = (byte)(value >> 16); + bytes[offset + 4] = (byte)(value >> 24); + bytes[offset + 3] = (byte)(value >> 32); + bytes[offset + 2] = (byte)(value >> 40); + bytes[offset + 1] = (byte)(value >> 48); + bytes[offset] = (byte)(value >> 56); + return 8; + } + + public static int longTo4ByteArray(byte[] bytes, int offset, long value) { + bytes[offset + 3] = (byte)value; + bytes[offset + 2] = (byte)(value >> 8); + bytes[offset + 1] = (byte)(value >> 16); + bytes[offset + 0] = (byte)(value >> 24); + return 4; + } + + public static int byteArrayToShort(byte[] bytes) { + return byteArrayToShort(bytes, 0); + } + + public static int byteArrayToShort(byte[] bytes, int offset) { + return + (bytes[offset] & 0xff) << 8 | (bytes[offset + 1] & 0xff); + } + + // The SSL patented 3-byte Value. + public static int byteArrayToMedium(byte[] bytes, int offset) { + return + (bytes[offset] & 0xff) << 16 | + (bytes[offset + 1] & 0xff) << 8 | + (bytes[offset + 2] & 0xff); + } + + public static int byteArrayToInt(byte[] bytes) { + return byteArrayToInt(bytes, 0); + } + + public static int byteArrayToInt(byte[] bytes, int offset) { + return + (bytes[offset] & 0xff) << 24 | + (bytes[offset + 1] & 0xff) << 16 | + (bytes[offset + 2] & 0xff) << 8 | + (bytes[offset + 3] & 0xff); + } + + public static int byteArrayToIntLittleEndian(byte[] bytes, int offset) { + return + (bytes[offset + 3] & 0xff) << 24 | + (bytes[offset + 2] & 0xff) << 16 | + (bytes[offset + 1] & 0xff) << 8 | + (bytes[offset] & 0xff); + } + + public static long byteArrayToLong(byte[] bytes) { + return byteArrayToLong(bytes, 0); + } + + public static long byteArray4ToLong(byte[] bytes, int offset) { + return + ((bytes[offset + 0] & 0xffL) << 24) | + ((bytes[offset + 1] & 0xffL) << 16) | + ((bytes[offset + 2] & 0xffL) << 8) | + ((bytes[offset + 3] & 0xffL)); + } + + public static long byteArray5ToLong(byte[] bytes, int offset) { + return + ((bytes[offset] & 0xffL) << 32) | + ((bytes[offset + 1] & 0xffL) << 24) | + ((bytes[offset + 2] & 0xffL) << 16) | + ((bytes[offset + 3] & 0xffL) << 8) | + ((bytes[offset + 4] & 0xffL)); + } + + public static long byteArrayToLong(byte[] bytes, int offset) { + return + ((bytes[offset] & 0xffL) << 56) | + ((bytes[offset + 1] & 0xffL) << 48) | + ((bytes[offset + 2] & 0xffL) << 40) | + ((bytes[offset + 3] & 0xffL) << 32) | + ((bytes[offset + 4] & 0xffL) << 24) | + ((bytes[offset + 5] & 0xffL) << 16) | + ((bytes[offset + 6] & 0xffL) << 8) | + ((bytes[offset + 7] & 0xffL)); + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/util/Hex.java b/libsignal/src/main/java/org/session/libsignal/libsignal/util/Hex.java new file mode 100644 index 000000000..7d75a2ea4 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/util/Hex.java @@ -0,0 +1,67 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.util; + +import java.io.IOException; + +/** + * Utility for generating hex dumps. + */ +public class Hex { + + private final static char[] HEX_DIGITS = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' + }; + + public static String toString(byte[] bytes) { + return toString(bytes, 0, bytes.length); + } + + public static String toString(byte[] bytes, int offset, int length) { + StringBuffer buf = new StringBuffer(); + for (int i = 0; i < length; i++) { + appendHexChar(buf, bytes[offset + i]); + buf.append(", "); + } + return buf.toString(); + } + + public static String toStringCondensed(byte[] bytes) { + StringBuffer buf = new StringBuffer(); + for (int i=0;i> 1]; + + for (int i = 0, j = 0; j < len; i++) { + int f = Character.digit(data[j], 16) << 4; + j++; + f = f | Character.digit(data[j], 16); + j++; + out[i] = (byte) (f & 0xFF); + } + + return out; + } + + private static void appendHexChar(StringBuffer buf, int b) { + buf.append("(byte)0x"); + buf.append(HEX_DIGITS[(b >> 4) & 0xf]); + buf.append(HEX_DIGITS[b & 0xf]); + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/util/IdentityKeyComparator.java b/libsignal/src/main/java/org/session/libsignal/libsignal/util/IdentityKeyComparator.java new file mode 100644 index 000000000..a58938f2a --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/util/IdentityKeyComparator.java @@ -0,0 +1,13 @@ +package org.session.libsignal.libsignal.util; + +import org.session.libsignal.libsignal.IdentityKey; + +import java.util.Comparator; + +public class IdentityKeyComparator extends ByteArrayComparator implements Comparator { + + @Override + public int compare(IdentityKey first, IdentityKey second) { + return compare(first.getPublicKey().serialize(), second.getPublicKey().serialize()); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/util/KeyHelper.java b/libsignal/src/main/java/org/session/libsignal/libsignal/util/KeyHelper.java new file mode 100644 index 000000000..817f0238c --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/util/KeyHelper.java @@ -0,0 +1,137 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.libsignal.util; + +import org.session.libsignal.libsignal.IdentityKey; +import org.session.libsignal.libsignal.IdentityKeyPair; +import org.session.libsignal.libsignal.InvalidKeyException; +import org.session.libsignal.libsignal.ecc.Curve; +import org.session.libsignal.libsignal.ecc.ECKeyPair; +import org.session.libsignal.libsignal.state.PreKeyRecord; +import org.session.libsignal.libsignal.state.SignedPreKeyRecord; + +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.LinkedList; +import java.util.List; + +/** + * Helper class for generating keys of different types. + * + * @author Moxie Marlinspike + */ +public class KeyHelper { + + private KeyHelper() {} + + /** + * Generate an identity key pair. Clients should only do this once, + * at install time. + * + * @return the generated IdentityKeyPair. + */ + public static IdentityKeyPair generateIdentityKeyPair() { + ECKeyPair keyPair = Curve.generateKeyPair(); + IdentityKey publicKey = new IdentityKey(keyPair.getPublicKey()); + return new IdentityKeyPair(publicKey, keyPair.getPrivateKey()); + } + + /** + * Generate a registration ID. Clients should only do this once, + * at install time. + * + * @param extendedRange By default (false), the generated registration + * ID is sized to require the minimal possible protobuf + * encoding overhead. Specify true if the caller needs + * the full range of MAX_INT at the cost of slightly + * higher encoding overhead. + * @return the generated registration ID. + */ + public static int generateRegistrationId(boolean extendedRange) { + try { + SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); + if (extendedRange) return secureRandom.nextInt(Integer.MAX_VALUE - 1) + 1; + else return secureRandom.nextInt(16380) + 1; + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } + } + + public static int getRandomSequence(int max) { + try { + return SecureRandom.getInstance("SHA1PRNG").nextInt(max); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } + } + + /** + * Generate a list of PreKeys. Clients should do this at install time, and + * subsequently any time the list of PreKeys stored on the server runs low. + *

+ * PreKey IDs are shorts, so they will eventually be repeated. Clients should + * store PreKeys in a circular buffer, so that they are repeated as infrequently + * as possible. + * + * @param start The starting PreKey ID, inclusive. + * @param count The number of PreKeys to generate. + * @return the list of generated PreKeyRecords. + */ + public static List generatePreKeys(int start, int count) { + List results = new LinkedList(); + + start--; + + for (int i=0;i { + private final T1 v1; + private final T2 v2; + + public Pair(T1 v1, T2 v2) { + this.v1 = v1; + this.v2 = v2; + } + + public T1 first(){ + return v1; + } + + public T2 second(){ + return v2; + } + + public boolean equals(Object o) { + return o instanceof Pair && + equal(((Pair) o).first(), first()) && + equal(((Pair) o).second(), second()); + } + + public int hashCode() { + return first().hashCode() ^ second().hashCode(); + } + + private boolean equal(Object first, Object second) { + if (first == null && second == null) return true; + if (first == null || second == null) return false; + return first.equals(second); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/util/guava/Absent.java b/libsignal/src/main/java/org/session/libsignal/libsignal/util/guava/Absent.java new file mode 100644 index 000000000..3f3c7a713 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/util/guava/Absent.java @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2011 The Guava Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.session.libsignal.libsignal.util.guava; + +import org.session.libsignal.libsignal.util.guava.Function; +import org.session.libsignal.libsignal.util.guava.Optional; +import org.session.libsignal.libsignal.util.guava.Supplier; + +import static org.session.libsignal.libsignal.util.guava.Preconditions.checkNotNull; + + + +import java.util.Collections; +import java.util.Set; + + +/** + * Implementation of an {@link Optional} not containing a reference. + */ + +final class Absent extends Optional { + static final Absent INSTANCE = new Absent(); + + @Override public boolean isPresent() { + return false; + } + + @Override public Object get() { + throw new IllegalStateException("value is absent"); + } + + @Override public Object or(Object defaultValue) { + return checkNotNull(defaultValue, "use orNull() instead of or(null)"); + } + + @SuppressWarnings("unchecked") // safe covariant cast + @Override public Optional or(Optional secondChoice) { + return (Optional) checkNotNull(secondChoice); + } + + @Override public Object or(Supplier supplier) { + return checkNotNull(supplier.get(), + "use orNull() instead of a Supplier that returns null"); + } + + @Override public Object orNull() { + return null; + } + + @Override public Set asSet() { + return Collections.emptySet(); + } + + @Override + public Optional transform(Function function) { + checkNotNull(function); + return Optional.absent(); + } + + @Override public boolean equals(Object object) { + return object == this; + } + + @Override public int hashCode() { + return 0x598df91c; + } + + @Override public String toString() { + return "Optional.absent()"; + } + + private Object readResolve() { + return INSTANCE; + } + + private static final long serialVersionUID = 0; +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/util/guava/Function.java b/libsignal/src/main/java/org/session/libsignal/libsignal/util/guava/Function.java new file mode 100644 index 000000000..5388b6ff1 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/util/guava/Function.java @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2007 The Guava Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.session.libsignal.libsignal.util.guava; + + + +/** + * Determines an output value based on an input value. + * + *

See the Guava User Guide article on the use of {@code + * Function}. + * + * @author Kevin Bourrillion + * @since 2.0 (imported from Google Collections Library) + */ + +public interface Function { + /** + * Returns the result of applying this function to {@code input}. This method is generally + * expected, but not absolutely required, to have the following properties: + * + *

    + *
  • Its execution does not cause any observable side effects. + *
  • The computation is consistent with equals; that is, {@link Objects#equal + * Objects.equal}{@code (a, b)} implies that {@code Objects.equal(function.apply(a), + * function.apply(b))}. + *
+ * + * @throws NullPointerException if {@code input} is null and this function does not accept null + * arguments + */ + T apply(F input); + + /** + * Indicates whether another object is equal to this function. + * + *

Most implementations will have no reason to override the behavior of {@link Object#equals}. + * However, an implementation may also choose to return {@code true} whenever {@code object} is a + * {@link Function} that it considers interchangeable with this one. "Interchangeable" + * typically means that {@code Objects.equal(this.apply(f), that.apply(f))} is true for all + * {@code f} of type {@code F}. Note that a {@code false} result from this method does not imply + * that the functions are known not to be interchangeable. + */ + @Override + boolean equals(Object object); +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/util/guava/Optional.java b/libsignal/src/main/java/org/session/libsignal/libsignal/util/guava/Optional.java new file mode 100644 index 000000000..23d4b483c --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/util/guava/Optional.java @@ -0,0 +1,234 @@ +/* + * Copyright (C) 2011 The Guava Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.session.libsignal.libsignal.util.guava; + +import org.session.libsignal.libsignal.util.guava.Supplier; + +import static org.session.libsignal.libsignal.util.guava.Preconditions.checkNotNull; + +import java.io.Serializable; +import java.util.Iterator; +import java.util.Set; + + +/** + * An immutable object that may contain a non-null reference to another object. Each + * instance of this type either contains a non-null reference, or contains nothing (in + * which case we say that the reference is "absent"); it is never said to "contain {@code + * null}". + * + *

A non-null {@code Optional} reference can be used as a replacement for a nullable + * {@code T} reference. It allows you to represent "a {@code T} that must be present" and + * a "a {@code T} that might be absent" as two distinct types in your program, which can + * aid clarity. + * + *

Some uses of this class include + * + *

    + *
  • As a method return type, as an alternative to returning {@code null} to indicate + * that no value was available + *
  • To distinguish between "unknown" (for example, not present in a map) and "known to + * have no value" (present in the map, with value {@code Optional.absent()}) + *
  • To wrap nullable references for storage in a collection that does not support + * {@code null} (though there are + * + * several other approaches to this that should be considered first) + *
+ * + *

A common alternative to using this class is to find or create a suitable + * null object for the + * type in question. + * + *

This class is not intended as a direct analogue of any existing "option" or "maybe" + * construct from other programming environments, though it may bear some similarities. + * + *

See the Guava User Guide article on + * using {@code Optional}. + * + * @param the type of instance that can be contained. {@code Optional} is naturally + * covariant on this type, so it is safe to cast an {@code Optional} to {@code + * Optional} for any supertype {@code S} of {@code T}. + * @author Kurt Alfred Kluever + * @author Kevin Bourrillion + * @since 10.0 + */ +public abstract class Optional implements Serializable { + /** + * Returns an {@code Optional} instance with no contained reference. + */ + @SuppressWarnings("unchecked") + public static Optional absent() { + return (Optional) Absent.INSTANCE; + } + + /** + * Returns an {@code Optional} instance containing the given non-null reference. + */ + public static Optional of(T reference) { + return new Present(checkNotNull(reference)); + } + + /** + * If {@code nullableReference} is non-null, returns an {@code Optional} instance containing that + * reference; otherwise returns {@link Optional#absent}. + */ + public static Optional fromNullable(T nullableReference) { + return (nullableReference == null) + ? Optional.absent() + : new Present(nullableReference); + } + + Optional() {} + + /** + * Returns {@code true} if this holder contains a (non-null) instance. + */ + public abstract boolean isPresent(); + + /** + * Returns the contained instance, which must be present. If the instance might be + * absent, use {@link #or(Object)} or {@link #orNull} instead. + * + * @throws IllegalStateException if the instance is absent ({@link #isPresent} returns + * {@code false}) + */ + public abstract T get(); + + /** + * Returns the contained instance if it is present; {@code defaultValue} otherwise. If + * no default value should be required because the instance is known to be present, use + * {@link #get()} instead. For a default value of {@code null}, use {@link #orNull}. + * + *

Note about generics: The signature {@code public T or(T defaultValue)} is overly + * restrictive. However, the ideal signature, {@code public S or(S)}, is not legal + * Java. As a result, some sensible operations involving subtypes are compile errors: + *

   {@code
+   *
+   *   Optional optionalInt = getSomeOptionalInt();
+   *   Number value = optionalInt.or(0.5); // error
+   *
+   *   FluentIterable numbers = getSomeNumbers();
+   *   Optional first = numbers.first();
+   *   Number value = first.or(0.5); // error}
+ * + * As a workaround, it is always safe to cast an {@code Optional} to {@code + * Optional}. Casting either of the above example {@code Optional} instances to {@code + * Optional} (where {@code Number} is the desired output type) solves the problem: + *
   {@code
+   *
+   *   Optional optionalInt = (Optional) getSomeOptionalInt();
+   *   Number value = optionalInt.or(0.5); // fine
+   *
+   *   FluentIterable numbers = getSomeNumbers();
+   *   Optional first = (Optional) numbers.first();
+   *   Number value = first.or(0.5); // fine}
+ */ + public abstract T or(T defaultValue); + + /** + * Returns this {@code Optional} if it has a value present; {@code secondChoice} + * otherwise. + */ + public abstract Optional or(Optional secondChoice); + + /** + * Returns the contained instance if it is present; {@code supplier.get()} otherwise. If the + * supplier returns {@code null}, a {@link NullPointerException} is thrown. + * + * @throws NullPointerException if the supplier returns {@code null} + */ + public abstract T or(Supplier supplier); + + /** + * Returns the contained instance if it is present; {@code null} otherwise. If the + * instance is known to be present, use {@link #get()} instead. + */ + public abstract T orNull(); + + /** + * Returns an immutable singleton {@link Set} whose only element is the contained instance + * if it is present; an empty immutable {@link Set} otherwise. + * + * @since 11.0 + */ + public abstract Set asSet(); + + /** + * If the instance is present, it is transformed with the given {@link Function}; otherwise, + * {@link Optional#absent} is returned. If the function returns {@code null}, a + * {@link NullPointerException} is thrown. + * + * @throws NullPointerException if the function returns {@code null} + * + * @since 12.0 + */ + + public abstract Optional transform(Function function); + + /** + * Returns {@code true} if {@code object} is an {@code Optional} instance, and either + * the contained references are {@linkplain Object#equals equal} to each other or both + * are absent. Note that {@code Optional} instances of differing parameterized types can + * be equal. + */ + @Override public abstract boolean equals(Object object); + + /** + * Returns a hash code for this instance. + */ + @Override public abstract int hashCode(); + + /** + * Returns a string representation for this instance. The form of this string + * representation is unspecified. + */ + @Override public abstract String toString(); + + /** + * Returns the value of each present instance from the supplied {@code optionals}, in order, + * skipping over occurrences of {@link Optional#absent}. Iterators are unmodifiable and are + * evaluated lazily. + * + * @since 11.0 (generics widened in 13.0) + */ + +// public static Iterable presentInstances( +// final Iterable> optionals) { +// checkNotNull(optionals); +// return new Iterable() { +// @Override public Iterator iterator() { +// return new AbstractIterator() { +// private final Iterator> iterator = +// checkNotNull(optionals.iterator()); +// +// @Override protected T computeNext() { +// while (iterator.hasNext()) { +// Optional optional = iterator.next(); +// if (optional.isPresent()) { +// return optional.get(); +// } +// } +// return endOfData(); +// } +// }; +// }; +// }; +// } + + private static final long serialVersionUID = 0; +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/util/guava/Preconditions.java b/libsignal/src/main/java/org/session/libsignal/libsignal/util/guava/Preconditions.java new file mode 100644 index 000000000..55edc0d18 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/util/guava/Preconditions.java @@ -0,0 +1,447 @@ +/* + * Copyright (C) 2007 The Guava Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.session.libsignal.libsignal.util.guava; + + +import java.util.NoSuchElementException; + + + +/** + * Simple static methods to be called at the start of your own methods to verify + * correct arguments and state. This allows constructs such as + *
+ *     if (count <= 0) {
+ *       throw new IllegalArgumentException("must be positive: " + count);
+ *     }
+ * + * to be replaced with the more compact + *
+ *     checkArgument(count > 0, "must be positive: %s", count);
+ * + * Note that the sense of the expression is inverted; with {@code Preconditions} + * you declare what you expect to be true, just as you do with an + * + * {@code assert} or a JUnit {@code assertTrue} call. + * + *

Warning: only the {@code "%s"} specifier is recognized as a + * placeholder in these messages, not the full range of {@link + * String#format(String, Object[])} specifiers. + * + *

Take care not to confuse precondition checking with other similar types + * of checks! Precondition exceptions -- including those provided here, but also + * {@link IndexOutOfBoundsException}, {@link NoSuchElementException}, {@link + * UnsupportedOperationException} and others -- are used to signal that the + * calling method has made an error. This tells the caller that it should + * not have invoked the method when it did, with the arguments it did, or + * perhaps ever. Postcondition or other invariant failures should not throw + * these types of exceptions. + * + *

See the Guava User Guide on + * using {@code Preconditions}. + * + * @author Kevin Bourrillion + * @since 2.0 (imported from Google Collections Library) + */ + +public final class Preconditions { + private Preconditions() {} + + /** + * Ensures the truth of an expression involving one or more parameters to the + * calling method. + * + * @param expression a boolean expression + * @throws IllegalArgumentException if {@code expression} is false + */ + public static void checkArgument(boolean expression) { + if (!expression) { + throw new IllegalArgumentException(); + } + } + + /** + * Ensures the truth of an expression involving one or more parameters to the + * calling method. + * + * @param expression a boolean expression + * @param errorMessage the exception message to use if the check fails; will + * be converted to a string using {@link String#valueOf(Object)} + * @throws IllegalArgumentException if {@code expression} is false + */ + public static void checkArgument( + boolean expression, Object errorMessage) { + if (!expression) { + throw new IllegalArgumentException(String.valueOf(errorMessage)); + } + } + + /** + * Ensures the truth of an expression involving one or more parameters to the + * calling method. + * + * @param expression a boolean expression + * @param errorMessageTemplate a template for the exception message should the + * check fail. The message is formed by replacing each {@code %s} + * placeholder in the template with an argument. These are matched by + * position - the first {@code %s} gets {@code errorMessageArgs[0]}, etc. + * Unmatched arguments will be appended to the formatted message in square + * braces. Unmatched placeholders will be left as-is. + * @param errorMessageArgs the arguments to be substituted into the message + * template. Arguments are converted to strings using + * {@link String#valueOf(Object)}. + * @throws IllegalArgumentException if {@code expression} is false + * @throws NullPointerException if the check fails and either {@code + * errorMessageTemplate} or {@code errorMessageArgs} is null (don't let + * this happen) + */ + public static void checkArgument(boolean expression, + String errorMessageTemplate, + Object... errorMessageArgs) { + if (!expression) { + throw new IllegalArgumentException( + format(errorMessageTemplate, errorMessageArgs)); + } + } + + /** + * Ensures the truth of an expression involving the state of the calling + * instance, but not involving any parameters to the calling method. + * + * @param expression a boolean expression + * @throws IllegalStateException if {@code expression} is false + */ + public static void checkState(boolean expression) { + if (!expression) { + throw new IllegalStateException(); + } + } + + /** + * Ensures the truth of an expression involving the state of the calling + * instance, but not involving any parameters to the calling method. + * + * @param expression a boolean expression + * @param errorMessage the exception message to use if the check fails; will + * be converted to a string using {@link String#valueOf(Object)} + * @throws IllegalStateException if {@code expression} is false + */ + public static void checkState( + boolean expression, Object errorMessage) { + if (!expression) { + throw new IllegalStateException(String.valueOf(errorMessage)); + } + } + + /** + * Ensures the truth of an expression involving the state of the calling + * instance, but not involving any parameters to the calling method. + * + * @param expression a boolean expression + * @param errorMessageTemplate a template for the exception message should the + * check fail. The message is formed by replacing each {@code %s} + * placeholder in the template with an argument. These are matched by + * position - the first {@code %s} gets {@code errorMessageArgs[0]}, etc. + * Unmatched arguments will be appended to the formatted message in square + * braces. Unmatched placeholders will be left as-is. + * @param errorMessageArgs the arguments to be substituted into the message + * template. Arguments are converted to strings using + * {@link String#valueOf(Object)}. + * @throws IllegalStateException if {@code expression} is false + * @throws NullPointerException if the check fails and either {@code + * errorMessageTemplate} or {@code errorMessageArgs} is null (don't let + * this happen) + */ + public static void checkState(boolean expression, + String errorMessageTemplate, + Object... errorMessageArgs) { + if (!expression) { + throw new IllegalStateException( + format(errorMessageTemplate, errorMessageArgs)); + } + } + + /** + * Ensures that an object reference passed as a parameter to the calling + * method is not null. + * + * @param reference an object reference + * @return the non-null reference that was validated + * @throws NullPointerException if {@code reference} is null + */ + public static T checkNotNull(T reference) { + if (reference == null) { + throw new NullPointerException(); + } + return reference; + } + + /** + * Ensures that an object reference passed as a parameter to the calling + * method is not null. + * + * @param reference an object reference + * @param errorMessage the exception message to use if the check fails; will + * be converted to a string using {@link String#valueOf(Object)} + * @return the non-null reference that was validated + * @throws NullPointerException if {@code reference} is null + */ + public static T checkNotNull(T reference, Object errorMessage) { + if (reference == null) { + throw new NullPointerException(String.valueOf(errorMessage)); + } + return reference; + } + + /** + * Ensures that an object reference passed as a parameter to the calling + * method is not null. + * + * @param reference an object reference + * @param errorMessageTemplate a template for the exception message should the + * check fail. The message is formed by replacing each {@code %s} + * placeholder in the template with an argument. These are matched by + * position - the first {@code %s} gets {@code errorMessageArgs[0]}, etc. + * Unmatched arguments will be appended to the formatted message in square + * braces. Unmatched placeholders will be left as-is. + * @param errorMessageArgs the arguments to be substituted into the message + * template. Arguments are converted to strings using + * {@link String#valueOf(Object)}. + * @return the non-null reference that was validated + * @throws NullPointerException if {@code reference} is null + */ + public static T checkNotNull(T reference, + String errorMessageTemplate, + Object... errorMessageArgs) { + if (reference == null) { + // If either of these parameters is null, the right thing happens anyway + throw new NullPointerException( + format(errorMessageTemplate, errorMessageArgs)); + } + return reference; + } + + /* + * All recent hotspots (as of 2009) *really* like to have the natural code + * + * if (guardExpression) { + * throw new BadException(messageExpression); + * } + * + * refactored so that messageExpression is moved to a separate + * String-returning method. + * + * if (guardExpression) { + * throw new BadException(badMsg(...)); + * } + * + * The alternative natural refactorings into void or Exception-returning + * methods are much slower. This is a big deal - we're talking factors of + * 2-8 in microbenchmarks, not just 10-20%. (This is a hotspot optimizer + * bug, which should be fixed, but that's a separate, big project). + * + * The coding pattern above is heavily used in java.util, e.g. in ArrayList. + * There is a RangeCheckMicroBenchmark in the JDK that was used to test this. + * + * But the methods in this class want to throw different exceptions, + * depending on the args, so it appears that this pattern is not directly + * applicable. But we can use the ridiculous, devious trick of throwing an + * exception in the middle of the construction of another exception. + * Hotspot is fine with that. + */ + + /** + * Ensures that {@code index} specifies a valid element in an array, + * list or string of size {@code size}. An element index may range from zero, + * inclusive, to {@code size}, exclusive. + * + * @param index a user-supplied index identifying an element of an array, list + * or string + * @param size the size of that array, list or string + * @return the value of {@code index} + * @throws IndexOutOfBoundsException if {@code index} is negative or is not + * less than {@code size} + * @throws IllegalArgumentException if {@code size} is negative + */ + public static int checkElementIndex(int index, int size) { + return checkElementIndex(index, size, "index"); + } + + /** + * Ensures that {@code index} specifies a valid element in an array, + * list or string of size {@code size}. An element index may range from zero, + * inclusive, to {@code size}, exclusive. + * + * @param index a user-supplied index identifying an element of an array, list + * or string + * @param size the size of that array, list or string + * @param desc the text to use to describe this index in an error message + * @return the value of {@code index} + * @throws IndexOutOfBoundsException if {@code index} is negative or is not + * less than {@code size} + * @throws IllegalArgumentException if {@code size} is negative + */ + public static int checkElementIndex( + int index, int size, String desc) { + // Carefully optimized for execution by hotspot (explanatory comment above) + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(badElementIndex(index, size, desc)); + } + return index; + } + + private static String badElementIndex(int index, int size, String desc) { + if (index < 0) { + return format("%s (%s) must not be negative", desc, index); + } else if (size < 0) { + throw new IllegalArgumentException("negative size: " + size); + } else { // index >= size + return format("%s (%s) must be less than size (%s)", desc, index, size); + } + } + + /** + * Ensures that {@code index} specifies a valid position in an array, + * list or string of size {@code size}. A position index may range from zero + * to {@code size}, inclusive. + * + * @param index a user-supplied index identifying a position in an array, list + * or string + * @param size the size of that array, list or string + * @return the value of {@code index} + * @throws IndexOutOfBoundsException if {@code index} is negative or is + * greater than {@code size} + * @throws IllegalArgumentException if {@code size} is negative + */ + public static int checkPositionIndex(int index, int size) { + return checkPositionIndex(index, size, "index"); + } + + /** + * Ensures that {@code index} specifies a valid position in an array, + * list or string of size {@code size}. A position index may range from zero + * to {@code size}, inclusive. + * + * @param index a user-supplied index identifying a position in an array, list + * or string + * @param size the size of that array, list or string + * @param desc the text to use to describe this index in an error message + * @return the value of {@code index} + * @throws IndexOutOfBoundsException if {@code index} is negative or is + * greater than {@code size} + * @throws IllegalArgumentException if {@code size} is negative + */ + public static int checkPositionIndex( + int index, int size, String desc) { + // Carefully optimized for execution by hotspot (explanatory comment above) + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException(badPositionIndex(index, size, desc)); + } + return index; + } + + private static String badPositionIndex(int index, int size, String desc) { + if (index < 0) { + return format("%s (%s) must not be negative", desc, index); + } else if (size < 0) { + throw new IllegalArgumentException("negative size: " + size); + } else { // index > size + return format("%s (%s) must not be greater than size (%s)", + desc, index, size); + } + } + + /** + * Ensures that {@code start} and {@code end} specify a valid positions + * in an array, list or string of size {@code size}, and are in order. A + * position index may range from zero to {@code size}, inclusive. + * + * @param start a user-supplied index identifying a starting position in an + * array, list or string + * @param end a user-supplied index identifying a ending position in an array, + * list or string + * @param size the size of that array, list or string + * @throws IndexOutOfBoundsException if either index is negative or is + * greater than {@code size}, or if {@code end} is less than {@code start} + * @throws IllegalArgumentException if {@code size} is negative + */ + public static void checkPositionIndexes(int start, int end, int size) { + // Carefully optimized for execution by hotspot (explanatory comment above) + if (start < 0 || end < start || end > size) { + throw new IndexOutOfBoundsException(badPositionIndexes(start, end, size)); + } + } + + private static String badPositionIndexes(int start, int end, int size) { + if (start < 0 || start > size) { + return badPositionIndex(start, size, "start index"); + } + if (end < 0 || end > size) { + return badPositionIndex(end, size, "end index"); + } + // end < start + return format("end index (%s) must not be less than start index (%s)", + end, start); + } + + /** + * Substitutes each {@code %s} in {@code template} with an argument. These + * are matched by position - the first {@code %s} gets {@code args[0]}, etc. + * If there are more arguments than placeholders, the unmatched arguments will + * be appended to the end of the formatted message in square braces. + * + * @param template a non-null string containing 0 or more {@code %s} + * placeholders. + * @param args the arguments to be substituted into the message + * template. Arguments are converted to strings using + * {@link String#valueOf(Object)}. Arguments can be null. + */ + static String format(String template, + Object... args) { + template = String.valueOf(template); // null -> "null" + + // start substituting the arguments into the '%s' placeholders + StringBuilder builder = new StringBuilder( + template.length() + 16 * args.length); + int templateStart = 0; + int i = 0; + while (i < args.length) { + int placeholderStart = template.indexOf("%s", templateStart); + if (placeholderStart == -1) { + break; + } + builder.append(template.substring(templateStart, placeholderStart)); + builder.append(args[i++]); + templateStart = placeholderStart + 2; + } + builder.append(template.substring(templateStart)); + + // if we run out of placeholders, append the extra args in square braces + if (i < args.length) { + builder.append(" ["); + builder.append(args[i++]); + while (i < args.length) { + builder.append(", "); + builder.append(args[i++]); + } + builder.append(']'); + } + + return builder.toString(); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/util/guava/Present.java b/libsignal/src/main/java/org/session/libsignal/libsignal/util/guava/Present.java new file mode 100644 index 000000000..7eee2a074 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/util/guava/Present.java @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2011 The Guava Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.session.libsignal.libsignal.util.guava; + +import org.session.libsignal.libsignal.util.guava.Function; +import org.session.libsignal.libsignal.util.guava.Optional; +import org.session.libsignal.libsignal.util.guava.Supplier; + +import static org.session.libsignal.libsignal.util.guava.Preconditions.checkNotNull; + +import java.util.Collections; +import java.util.Set; + +/** + * Implementation of an {@link Optional} containing a reference. + */ + +final class Present extends Optional { + private final T reference; + + Present(T reference) { + this.reference = reference; + } + + @Override public boolean isPresent() { + return true; + } + + @Override public T get() { + return reference; + } + + @Override public T or(T defaultValue) { + checkNotNull(defaultValue, "use orNull() instead of or(null)"); + return reference; + } + + @Override public Optional or(Optional secondChoice) { + checkNotNull(secondChoice); + return this; + } + + @Override public T or(Supplier supplier) { + checkNotNull(supplier); + return reference; + } + + @Override public T orNull() { + return reference; + } + + @Override public Set asSet() { + return Collections.singleton(reference); + } + + @Override public Optional transform(Function function) { + return new Present(checkNotNull(function.apply(reference), + "Transformation function cannot return null.")); + } + + @Override public boolean equals(Object object) { + if (object instanceof Present) { + Present other = (Present) object; + return reference.equals(other.reference); + } + return false; + } + + @Override public int hashCode() { + return 0x598df91c + reference.hashCode(); + } + + @Override public String toString() { + return "Optional.of(" + reference + ")"; + } + + private static final long serialVersionUID = 0; +} diff --git a/libsignal/src/main/java/org/session/libsignal/libsignal/util/guava/Supplier.java b/libsignal/src/main/java/org/session/libsignal/libsignal/util/guava/Supplier.java new file mode 100644 index 000000000..e7ca97ffc --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/libsignal/util/guava/Supplier.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2007 The Guava Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.session.libsignal.libsignal.util.guava; + + +/** + * A class that can supply objects of a single type. Semantically, this could + * be a factory, generator, builder, closure, or something else entirely. No + * guarantees are implied by this interface. + * + * @author Harry Heymann + * @since 2.0 (imported from Google Collections Library) + */ +public interface Supplier { + /** + * Retrieves an instance of the appropriate type. The returned object may or + * may not be a new instance, depending on the implementation. + * + * @return an instance of the appropriate type + */ + T get(); +} diff --git a/libsignal/src/main/java/org/session/libsignal/metadata/InvalidMetadataMessageException.java b/libsignal/src/main/java/org/session/libsignal/metadata/InvalidMetadataMessageException.java new file mode 100644 index 000000000..48fbe3909 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/metadata/InvalidMetadataMessageException.java @@ -0,0 +1,13 @@ +package org.session.libsignal.metadata; + + +public class InvalidMetadataMessageException extends Exception { + public InvalidMetadataMessageException(String s) { + super(s); + } + + public InvalidMetadataMessageException(Exception s) { + super(s); + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/metadata/InvalidMetadataVersionException.java b/libsignal/src/main/java/org/session/libsignal/metadata/InvalidMetadataVersionException.java new file mode 100644 index 000000000..39054f60a --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/metadata/InvalidMetadataVersionException.java @@ -0,0 +1,8 @@ +package org.session.libsignal.metadata; + + +public class InvalidMetadataVersionException extends Exception { + public InvalidMetadataVersionException(String s) { + super(s); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/metadata/ProtocolDuplicateMessageException.java b/libsignal/src/main/java/org/session/libsignal/metadata/ProtocolDuplicateMessageException.java new file mode 100644 index 000000000..c3078d587 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/metadata/ProtocolDuplicateMessageException.java @@ -0,0 +1,8 @@ +package org.session.libsignal.metadata; + + +public class ProtocolDuplicateMessageException extends ProtocolException { + public ProtocolDuplicateMessageException(Exception e, String sender, int senderDevice) { + super(e, sender, senderDevice); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/metadata/ProtocolException.java b/libsignal/src/main/java/org/session/libsignal/metadata/ProtocolException.java new file mode 100644 index 000000000..b2d981841 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/metadata/ProtocolException.java @@ -0,0 +1,22 @@ +package org.session.libsignal.metadata; + + +public abstract class ProtocolException extends Exception { + + private final String sender; + private final int senderDevice; + + public ProtocolException(Exception e, String sender, int senderDevice) { + super(e); + this.sender = sender; + this.senderDevice = senderDevice; + } + + public String getSender() { + return sender; + } + + public int getSenderDevice() { + return senderDevice; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/metadata/ProtocolInvalidKeyException.java b/libsignal/src/main/java/org/session/libsignal/metadata/ProtocolInvalidKeyException.java new file mode 100644 index 000000000..3a7c0af20 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/metadata/ProtocolInvalidKeyException.java @@ -0,0 +1,10 @@ +package org.session.libsignal.metadata; + + +import org.session.libsignal.libsignal.InvalidKeyException; + +public class ProtocolInvalidKeyException extends ProtocolException { + public ProtocolInvalidKeyException(InvalidKeyException e, String sender, int senderDevice) { + super(e, sender, senderDevice); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/metadata/ProtocolInvalidKeyIdException.java b/libsignal/src/main/java/org/session/libsignal/metadata/ProtocolInvalidKeyIdException.java new file mode 100644 index 000000000..81d035b55 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/metadata/ProtocolInvalidKeyIdException.java @@ -0,0 +1,8 @@ +package org.session.libsignal.metadata; + + +public class ProtocolInvalidKeyIdException extends ProtocolException { + public ProtocolInvalidKeyIdException(Exception e, String sender, int senderDevice) { + super(e, sender, senderDevice); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/metadata/ProtocolInvalidMessageException.java b/libsignal/src/main/java/org/session/libsignal/metadata/ProtocolInvalidMessageException.java new file mode 100644 index 000000000..6230fccaa --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/metadata/ProtocolInvalidMessageException.java @@ -0,0 +1,10 @@ +package org.session.libsignal.metadata; + + +import org.session.libsignal.libsignal.InvalidMessageException; + +public class ProtocolInvalidMessageException extends ProtocolException { + public ProtocolInvalidMessageException(InvalidMessageException e, String sender, int senderDevice) { + super(e, sender, senderDevice); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/metadata/ProtocolInvalidVersionException.java b/libsignal/src/main/java/org/session/libsignal/metadata/ProtocolInvalidVersionException.java new file mode 100644 index 000000000..9d0d5161d --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/metadata/ProtocolInvalidVersionException.java @@ -0,0 +1,10 @@ +package org.session.libsignal.metadata; + + +import org.session.libsignal.libsignal.InvalidVersionException; + +public class ProtocolInvalidVersionException extends ProtocolException { + public ProtocolInvalidVersionException(InvalidVersionException e, String sender, int senderDevice) { + super(e, sender, senderDevice); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/metadata/ProtocolLegacyMessageException.java b/libsignal/src/main/java/org/session/libsignal/metadata/ProtocolLegacyMessageException.java new file mode 100644 index 000000000..5f52bb5fa --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/metadata/ProtocolLegacyMessageException.java @@ -0,0 +1,10 @@ +package org.session.libsignal.metadata; + + +import org.session.libsignal.libsignal.LegacyMessageException; + +public class ProtocolLegacyMessageException extends ProtocolException { + public ProtocolLegacyMessageException(LegacyMessageException e, String sender, int senderDeviceId) { + super(e, sender, senderDeviceId); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/metadata/ProtocolNoSessionException.java b/libsignal/src/main/java/org/session/libsignal/metadata/ProtocolNoSessionException.java new file mode 100644 index 000000000..b290c4d64 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/metadata/ProtocolNoSessionException.java @@ -0,0 +1,10 @@ +package org.session.libsignal.metadata; + + +import org.session.libsignal.libsignal.NoSessionException; + +public class ProtocolNoSessionException extends ProtocolException { + public ProtocolNoSessionException(NoSessionException e, String sender, int senderDevice) { + super(e, sender, senderDevice); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/metadata/ProtocolUntrustedIdentityException.java b/libsignal/src/main/java/org/session/libsignal/metadata/ProtocolUntrustedIdentityException.java new file mode 100644 index 000000000..c68c06931 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/metadata/ProtocolUntrustedIdentityException.java @@ -0,0 +1,10 @@ +package org.session.libsignal.metadata; + + +import org.session.libsignal.libsignal.UntrustedIdentityException; + +public class ProtocolUntrustedIdentityException extends ProtocolException { + public ProtocolUntrustedIdentityException(UntrustedIdentityException e, String sender, int senderDevice) { + super(e, sender, senderDevice); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/metadata/SealedSessionCipher.java b/libsignal/src/main/java/org/session/libsignal/metadata/SealedSessionCipher.java new file mode 100644 index 000000000..fd7c3de04 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/metadata/SealedSessionCipher.java @@ -0,0 +1,305 @@ +package org.session.libsignal.metadata; + +import org.session.libsignal.metadata.certificate.CertificateValidator; +import org.session.libsignal.metadata.certificate.InvalidCertificateException; +import org.session.libsignal.metadata.certificate.SenderCertificate; +import org.session.libsignal.metadata.protocol.UnidentifiedSenderMessage; +import org.session.libsignal.metadata.protocol.UnidentifiedSenderMessageContent; +import org.session.libsignal.libsignal.DuplicateMessageException; +import org.session.libsignal.libsignal.IdentityKey; +import org.session.libsignal.libsignal.IdentityKeyPair; +import org.session.libsignal.libsignal.InvalidKeyException; +import org.session.libsignal.libsignal.InvalidKeyIdException; +import org.session.libsignal.libsignal.InvalidMacException; +import org.session.libsignal.libsignal.InvalidMessageException; +import org.session.libsignal.libsignal.InvalidVersionException; +import org.session.libsignal.libsignal.LegacyMessageException; +import org.session.libsignal.libsignal.NoSessionException; +import org.session.libsignal.libsignal.SessionCipher; +import org.session.libsignal.libsignal.SignalProtocolAddress; +import org.session.libsignal.libsignal.UntrustedIdentityException; +import org.session.libsignal.libsignal.ecc.Curve; +import org.session.libsignal.libsignal.ecc.ECKeyPair; +import org.session.libsignal.libsignal.ecc.ECPrivateKey; +import org.session.libsignal.libsignal.ecc.ECPublicKey; +import org.session.libsignal.libsignal.kdf.HKDFv3; +import org.session.libsignal.libsignal.loki.FallbackSessionCipher; +import org.session.libsignal.libsignal.loki.LokiSessionCipher; +import org.session.libsignal.libsignal.loki.SessionResetProtocol; +import org.session.libsignal.libsignal.protocol.CiphertextMessage; +import org.session.libsignal.libsignal.protocol.PreKeySignalMessage; +import org.session.libsignal.libsignal.protocol.SignalMessage; +import org.session.libsignal.libsignal.state.SignalProtocolStore; +import org.session.libsignal.libsignal.util.ByteUtil; +import org.session.libsignal.libsignal.util.Hex; +import org.session.libsignal.libsignal.util.Pair; + +import java.io.IOException; +import java.security.InvalidAlgorithmParameterException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.text.ParseException; + +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.Mac; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +public class SealedSessionCipher { + + private final SignalProtocolStore signalProtocolStore; + private final SessionResetProtocol sessionResetProtocol; + private final SignalProtocolAddress localAddress; + + public SealedSessionCipher(SignalProtocolStore signalProtocolStore, + SessionResetProtocol sessionResetProtocol, + SignalProtocolAddress localAddress) + { + this.signalProtocolStore = signalProtocolStore; + this.sessionResetProtocol = sessionResetProtocol; + this.localAddress = localAddress; + } + + public byte[] encrypt(SignalProtocolAddress destinationAddress, SenderCertificate senderCertificate, byte[] paddedPlaintext) + throws InvalidKeyException, UntrustedIdentityException + { + CiphertextMessage message = new SessionCipher(signalProtocolStore, destinationAddress).encrypt(paddedPlaintext); + return encrypt(destinationAddress, senderCertificate, message); + } + + public byte[] encrypt(SignalProtocolAddress destinationAddress, SenderCertificate senderCertificate, CiphertextMessage message) + throws InvalidKeyException + { + try { + IdentityKeyPair ourIdentity = signalProtocolStore.getIdentityKeyPair(); + byte[] theirPublicKey = Hex.fromStringCondensed(destinationAddress.getName()); + ECPublicKey theirIdentity = new IdentityKey(theirPublicKey, 0).getPublicKey(); + + ECKeyPair ephemeral = Curve.generateKeyPair(); + byte[] ephemeralSalt = ByteUtil.combine("UnidentifiedDelivery".getBytes(), theirIdentity.serialize(), ephemeral.getPublicKey().serialize()); + EphemeralKeys ephemeralKeys = calculateEphemeralKeys(theirIdentity, ephemeral.getPrivateKey(), ephemeralSalt); + byte[] staticKeyCiphertext = encrypt(ephemeralKeys.cipherKey, ephemeralKeys.macKey, ourIdentity.getPublicKey().serialize()); + + byte[] staticSalt = ByteUtil.combine(ephemeralKeys.chainKey, staticKeyCiphertext); + StaticKeys staticKeys = calculateStaticKeys(theirIdentity, ourIdentity.getPrivateKey(), staticSalt); + UnidentifiedSenderMessageContent content = new UnidentifiedSenderMessageContent(message.getType(), senderCertificate, message.serialize()); + byte[] messageBytes = encrypt(staticKeys.cipherKey, staticKeys.macKey, content.getSerialized()); + + return new UnidentifiedSenderMessage(ephemeral.getPublicKey(), staticKeyCiphertext, messageBytes).getSerialized(); + } catch (IOException e) { + throw new InvalidKeyException(e); + } + } + + /** + * Decrypt a sealed session message. + * This will return a Pair which is the CipherTextMessage type and the decrypted message content + */ + public Pair> decrypt(CertificateValidator validator, byte[] ciphertext, long timestamp, String prefixedPublicKey) + throws + InvalidMetadataMessageException, InvalidMetadataVersionException, + ProtocolInvalidMessageException, ProtocolInvalidKeyException, + ProtocolNoSessionException, ProtocolLegacyMessageException, + ProtocolInvalidVersionException, ProtocolDuplicateMessageException, + ProtocolInvalidKeyIdException, ProtocolUntrustedIdentityException, + SelfSendException, IOException + { + UnidentifiedSenderMessageContent content; + + try { + IdentityKeyPair ourIdentity = signalProtocolStore.getIdentityKeyPair(); + UnidentifiedSenderMessage wrapper = new UnidentifiedSenderMessage(ciphertext); + byte[] ephemeralSalt = ByteUtil.combine("UnidentifiedDelivery".getBytes(), ourIdentity.getPublicKey().serialize(), wrapper.getEphemeral().serialize()); + EphemeralKeys ephemeralKeys = calculateEphemeralKeys(wrapper.getEphemeral(), ourIdentity.getPrivateKey(), ephemeralSalt); + byte[] staticKeyBytes = decrypt(ephemeralKeys.cipherKey, ephemeralKeys.macKey, wrapper.getEncryptedStatic()); + + ECPublicKey staticKey = Curve.decodePoint(staticKeyBytes, 0); + byte[] staticSalt = ByteUtil.combine(ephemeralKeys.chainKey, wrapper.getEncryptedStatic()); + StaticKeys staticKeys = calculateStaticKeys(staticKey, ourIdentity.getPrivateKey(), staticSalt); + byte[] messageBytes = decrypt(staticKeys.cipherKey, staticKeys.macKey, wrapper.getEncryptedMessage()); + + content = new UnidentifiedSenderMessageContent(messageBytes); + validator.validate(content.getSenderCertificate(), timestamp); + + if (content.getSenderCertificate().getSender().equals(localAddress.getName()) && + content.getSenderCertificate().getSenderDeviceId() == localAddress.getDeviceId()) + { + throw new SelfSendException(); + } + } catch (InvalidKeyException e) { + throw new InvalidMetadataMessageException(e); + } catch (InvalidMacException e) { + throw new InvalidMetadataMessageException(e); + } catch (InvalidCertificateException e) { + throw new InvalidMetadataMessageException(e); + } + + try { + Pair dataPair = new Pair<>(content.getType(), decrypt(content)); + return new Pair<>( + new SignalProtocolAddress(content.getSenderCertificate().getSender(), content.getSenderCertificate().getSenderDeviceId()), + dataPair + ); + } catch (InvalidMessageException e) { + throw new ProtocolInvalidMessageException(e, content.getSenderCertificate().getSender(), content.getSenderCertificate().getSenderDeviceId()); + } catch (InvalidKeyException e) { + throw new ProtocolInvalidKeyException(e, content.getSenderCertificate().getSender(), content.getSenderCertificate().getSenderDeviceId()); + } catch (NoSessionException e) { + throw new ProtocolNoSessionException(e, content.getSenderCertificate().getSender(), content.getSenderCertificate().getSenderDeviceId()); + } catch (LegacyMessageException e) { + throw new ProtocolLegacyMessageException(e, content.getSenderCertificate().getSender(), content.getSenderCertificate().getSenderDeviceId()); + } catch (InvalidVersionException e) { + throw new ProtocolInvalidVersionException(e, content.getSenderCertificate().getSender(), content.getSenderCertificate().getSenderDeviceId()); + } catch (DuplicateMessageException e) { + throw new ProtocolDuplicateMessageException(e, content.getSenderCertificate().getSender(), content.getSenderCertificate().getSenderDeviceId()); + } catch (InvalidKeyIdException e) { + throw new ProtocolInvalidKeyIdException(e, content.getSenderCertificate().getSender(), content.getSenderCertificate().getSenderDeviceId()); + } catch (UntrustedIdentityException e) { + throw new ProtocolUntrustedIdentityException(e, content.getSenderCertificate().getSender(), content.getSenderCertificate().getSenderDeviceId()); + } + } + + public int getSessionVersion(SignalProtocolAddress remoteAddress) { + return new SessionCipher(signalProtocolStore, remoteAddress).getSessionVersion(); + } + + public int getRemoteRegistrationId(SignalProtocolAddress remoteAddress) { + return new SessionCipher(signalProtocolStore, remoteAddress).getRemoteRegistrationId(); + } + + private EphemeralKeys calculateEphemeralKeys(ECPublicKey ephemeralPublic, ECPrivateKey ephemeralPrivate, byte[] salt) throws InvalidKeyException { + try { + byte[] ephemeralSecret = Curve.calculateAgreement(ephemeralPublic, ephemeralPrivate); + byte[] ephemeralDerived = new HKDFv3().deriveSecrets(ephemeralSecret, salt, new byte[0], 96); + byte[][] ephemeralDerivedParts = ByteUtil.split(ephemeralDerived, 32, 32, 32); + + return new EphemeralKeys(ephemeralDerivedParts[0], ephemeralDerivedParts[1], ephemeralDerivedParts[2]); + } catch (ParseException e) { + throw new AssertionError(e); + } + } + + private StaticKeys calculateStaticKeys(ECPublicKey staticPublic, ECPrivateKey staticPrivate, byte[] salt) throws InvalidKeyException { + try { + byte[] staticSecret = Curve.calculateAgreement(staticPublic, staticPrivate); + byte[] staticDerived = new HKDFv3().deriveSecrets(staticSecret, salt, new byte[0], 96); + byte[][] staticDerivedParts = ByteUtil.split(staticDerived, 32, 32, 32); + + return new StaticKeys(staticDerivedParts[1], staticDerivedParts[2]); + } catch (ParseException e) { + throw new AssertionError(e); + } + } + + private byte[] decrypt(UnidentifiedSenderMessageContent message) + throws InvalidVersionException, InvalidMessageException, InvalidKeyException, DuplicateMessageException, InvalidKeyIdException, UntrustedIdentityException, LegacyMessageException, NoSessionException + { + + SignalProtocolAddress sender = new SignalProtocolAddress(message.getSenderCertificate().getSender(), message.getSenderCertificate().getSenderDeviceId()); + + switch (message.getType()) { + case CiphertextMessage.WHISPER_TYPE: return new LokiSessionCipher(signalProtocolStore, sessionResetProtocol, sender).decrypt(new SignalMessage(message.getContent())); + case CiphertextMessage.PREKEY_TYPE: return new LokiSessionCipher(signalProtocolStore, sessionResetProtocol, sender).decrypt(new PreKeySignalMessage(message.getContent())); + case CiphertextMessage.FALLBACK_MESSAGE_TYPE: { + try { + byte[] privateKey = signalProtocolStore.getIdentityKeyPair().getPrivateKey().serialize(); + return new FallbackSessionCipher(privateKey, sender.getName()).decrypt(message.getContent()); + } catch (Exception e) { + throw new InvalidMessageException("Failed to decrypt fallback message."); + } + } + default: throw new InvalidMessageException("Unknown type: " + message.getType()); + } + } + + private byte[] encrypt(SecretKeySpec cipherKey, SecretKeySpec macKey, byte[] plaintext) { + try { + Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding"); + cipher.init(Cipher.ENCRYPT_MODE, cipherKey, new IvParameterSpec(new byte[16])); + + Mac mac = Mac.getInstance("HmacSHA256"); + mac.init(macKey); + + byte[] ciphertext = cipher.doFinal(plaintext); + byte[] ourFullMac = mac.doFinal(ciphertext); + byte[] ourMac = ByteUtil.trim(ourFullMac, 10); + + return ByteUtil.combine(ciphertext, ourMac); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (NoSuchPaddingException e) { + throw new AssertionError(e); + } catch (java.security.InvalidKeyException e) { + throw new AssertionError(e); + } catch (BadPaddingException e) { + throw new AssertionError(e); + } catch (IllegalBlockSizeException e) { + throw new AssertionError(e); + } catch (InvalidAlgorithmParameterException e) { + throw new AssertionError(e); + } + } + + private byte[] decrypt(SecretKeySpec cipherKey, SecretKeySpec macKey, byte[] ciphertext) throws InvalidMacException { + try { + if (ciphertext.length < 10) { + throw new InvalidMacException("Ciphertext not long enough for MAC!"); + } + + byte[][] ciphertextParts = ByteUtil.split(ciphertext, ciphertext.length - 10, 10); + + Mac mac = Mac.getInstance("HmacSHA256"); + mac.init(macKey); + + byte[] digest = mac.doFinal(ciphertextParts[0]); + byte[] ourMac = ByteUtil.trim(digest, 10); + byte[] theirMac = ciphertextParts[1]; + + if (!MessageDigest.isEqual(ourMac, theirMac)) { + throw new InvalidMacException("Bad mac!"); + } + + Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding"); + cipher.init(Cipher.DECRYPT_MODE, cipherKey, new IvParameterSpec(new byte[16])); + + return cipher.doFinal(ciphertextParts[0]); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (java.security.InvalidKeyException e) { + throw new AssertionError(e); + } catch (NoSuchPaddingException e) { + throw new AssertionError(e); + } catch (InvalidAlgorithmParameterException e) { + throw new AssertionError(e); + } catch (IllegalBlockSizeException e) { + throw new AssertionError(e); + } catch (BadPaddingException e) { + throw new AssertionError(e); + } + } + + private static class EphemeralKeys { + private final byte[] chainKey; + private final SecretKeySpec cipherKey; + private final SecretKeySpec macKey; + + private EphemeralKeys(byte[] chainKey, byte[] cipherKey, byte[] macKey) { + this.chainKey = chainKey; + this.cipherKey = new SecretKeySpec(cipherKey, "AES"); + this.macKey = new SecretKeySpec(macKey, "HmacSHA256"); + } + } + + private static class StaticKeys { + private final SecretKeySpec cipherKey; + private final SecretKeySpec macKey; + + private StaticKeys(byte[] cipherKey, byte[] macKey) { + this.cipherKey = new SecretKeySpec(cipherKey, "AES"); + this.macKey = new SecretKeySpec(macKey, "HmacSHA256"); + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/metadata/SelfSendException.java b/libsignal/src/main/java/org/session/libsignal/metadata/SelfSendException.java new file mode 100644 index 000000000..ff6afe207 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/metadata/SelfSendException.java @@ -0,0 +1,3 @@ +package org.session.libsignal.metadata; + +public class SelfSendException extends Exception { } diff --git a/libsignal/src/main/java/org/session/libsignal/metadata/SignalProtos.java b/libsignal/src/main/java/org/session/libsignal/metadata/SignalProtos.java new file mode 100644 index 000000000..2a9179072 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/metadata/SignalProtos.java @@ -0,0 +1,2959 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: UnidentifiedDelivery.proto + +package org.session.libsignal.metadata; + +public final class SignalProtos { + private SignalProtos() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + } + public interface ServerCertificateOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional bytes certificate = 1; + /** + * optional bytes certificate = 1; + */ + boolean hasCertificate(); + /** + * optional bytes certificate = 1; + */ + com.google.protobuf.ByteString getCertificate(); + + // optional bytes signature = 2; + /** + * optional bytes signature = 2; + */ + boolean hasSignature(); + /** + * optional bytes signature = 2; + */ + com.google.protobuf.ByteString getSignature(); + } + /** + * Protobuf type {@code signal.ServerCertificate} + */ + public static final class ServerCertificate extends + com.google.protobuf.GeneratedMessage + implements ServerCertificateOrBuilder { + // Use ServerCertificate.newBuilder() to construct. + private ServerCertificate(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private ServerCertificate(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final ServerCertificate defaultInstance; + public static ServerCertificate getDefaultInstance() { + return defaultInstance; + } + + public ServerCertificate getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private ServerCertificate( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + certificate_ = input.readBytes(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + signature_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return SignalProtos.internal_static_signal_ServerCertificate_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return SignalProtos.internal_static_signal_ServerCertificate_fieldAccessorTable + .ensureFieldAccessorsInitialized( + ServerCertificate.class, Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public ServerCertificate parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new ServerCertificate(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public interface CertificateOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional uint32 id = 1; + /** + * optional uint32 id = 1; + */ + boolean hasId(); + /** + * optional uint32 id = 1; + */ + int getId(); + + // optional bytes key = 2; + /** + * optional bytes key = 2; + */ + boolean hasKey(); + /** + * optional bytes key = 2; + */ + com.google.protobuf.ByteString getKey(); + } + /** + * Protobuf type {@code signal.ServerCertificate.Certificate} + */ + public static final class Certificate extends + com.google.protobuf.GeneratedMessage + implements CertificateOrBuilder { + // Use Certificate.newBuilder() to construct. + private Certificate(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Certificate(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Certificate defaultInstance; + public static Certificate getDefaultInstance() { + return defaultInstance; + } + + public Certificate getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Certificate( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + id_ = input.readUInt32(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + key_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return SignalProtos.internal_static_signal_ServerCertificate_Certificate_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return SignalProtos.internal_static_signal_ServerCertificate_Certificate_fieldAccessorTable + .ensureFieldAccessorsInitialized( + Certificate.class, Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Certificate parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Certificate(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional uint32 id = 1; + public static final int ID_FIELD_NUMBER = 1; + private int id_; + /** + * optional uint32 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 id = 1; + */ + public int getId() { + return id_; + } + + // optional bytes key = 2; + public static final int KEY_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString key_; + /** + * optional bytes key = 2; + */ + public boolean hasKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes key = 2; + */ + public com.google.protobuf.ByteString getKey() { + return key_; + } + + private void initFields() { + id_ = 0; + key_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt32(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, key_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, key_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static Certificate parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static Certificate parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static Certificate parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static Certificate parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static Certificate parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static Certificate parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static Certificate parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static Certificate parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static Certificate parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static Certificate parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(Certificate prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signal.ServerCertificate.Certificate} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements CertificateOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return SignalProtos.internal_static_signal_ServerCertificate_Certificate_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return SignalProtos.internal_static_signal_ServerCertificate_Certificate_fieldAccessorTable + .ensureFieldAccessorsInitialized( + Certificate.class, Builder.class); + } + + // Construct using org.session.libsignal.metadata.SignalProtos.ServerCertificate.Certificate.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + id_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + key_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return SignalProtos.internal_static_signal_ServerCertificate_Certificate_descriptor; + } + + public Certificate getDefaultInstanceForType() { + return Certificate.getDefaultInstance(); + } + + public Certificate build() { + Certificate result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public Certificate buildPartial() { + Certificate result = new Certificate(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.id_ = id_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.key_ = key_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof Certificate) { + return mergeFrom((Certificate)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(Certificate other) { + if (other == Certificate.getDefaultInstance()) return this; + if (other.hasId()) { + setId(other.getId()); + } + if (other.hasKey()) { + setKey(other.getKey()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + Certificate parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (Certificate) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional uint32 id = 1; + private int id_ ; + /** + * optional uint32 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 id = 1; + */ + public int getId() { + return id_; + } + /** + * optional uint32 id = 1; + */ + public Builder setId(int value) { + bitField0_ |= 0x00000001; + id_ = value; + onChanged(); + return this; + } + /** + * optional uint32 id = 1; + */ + public Builder clearId() { + bitField0_ = (bitField0_ & ~0x00000001); + id_ = 0; + onChanged(); + return this; + } + + // optional bytes key = 2; + private com.google.protobuf.ByteString key_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes key = 2; + */ + public boolean hasKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes key = 2; + */ + public com.google.protobuf.ByteString getKey() { + return key_; + } + /** + * optional bytes key = 2; + */ + public Builder setKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + key_ = value; + onChanged(); + return this; + } + /** + * optional bytes key = 2; + */ + public Builder clearKey() { + bitField0_ = (bitField0_ & ~0x00000002); + key_ = getDefaultInstance().getKey(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signal.ServerCertificate.Certificate) + } + + static { + defaultInstance = new Certificate(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signal.ServerCertificate.Certificate) + } + + private int bitField0_; + // optional bytes certificate = 1; + public static final int CERTIFICATE_FIELD_NUMBER = 1; + private com.google.protobuf.ByteString certificate_; + /** + * optional bytes certificate = 1; + */ + public boolean hasCertificate() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes certificate = 1; + */ + public com.google.protobuf.ByteString getCertificate() { + return certificate_; + } + + // optional bytes signature = 2; + public static final int SIGNATURE_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString signature_; + /** + * optional bytes signature = 2; + */ + public boolean hasSignature() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes signature = 2; + */ + public com.google.protobuf.ByteString getSignature() { + return signature_; + } + + private void initFields() { + certificate_ = com.google.protobuf.ByteString.EMPTY; + signature_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, certificate_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, signature_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, certificate_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, signature_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static ServerCertificate parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static ServerCertificate parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static ServerCertificate parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static ServerCertificate parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static ServerCertificate parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static ServerCertificate parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static ServerCertificate parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static ServerCertificate parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static ServerCertificate parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static ServerCertificate parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(ServerCertificate prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signal.ServerCertificate} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements ServerCertificateOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return SignalProtos.internal_static_signal_ServerCertificate_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return SignalProtos.internal_static_signal_ServerCertificate_fieldAccessorTable + .ensureFieldAccessorsInitialized( + ServerCertificate.class, Builder.class); + } + + // Construct using org.session.libsignal.metadata.SignalProtos.ServerCertificate.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + certificate_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + signature_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return SignalProtos.internal_static_signal_ServerCertificate_descriptor; + } + + public ServerCertificate getDefaultInstanceForType() { + return ServerCertificate.getDefaultInstance(); + } + + public ServerCertificate build() { + ServerCertificate result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public ServerCertificate buildPartial() { + ServerCertificate result = new ServerCertificate(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.certificate_ = certificate_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.signature_ = signature_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof ServerCertificate) { + return mergeFrom((ServerCertificate)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(ServerCertificate other) { + if (other == ServerCertificate.getDefaultInstance()) return this; + if (other.hasCertificate()) { + setCertificate(other.getCertificate()); + } + if (other.hasSignature()) { + setSignature(other.getSignature()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + ServerCertificate parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (ServerCertificate) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional bytes certificate = 1; + private com.google.protobuf.ByteString certificate_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes certificate = 1; + */ + public boolean hasCertificate() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes certificate = 1; + */ + public com.google.protobuf.ByteString getCertificate() { + return certificate_; + } + /** + * optional bytes certificate = 1; + */ + public Builder setCertificate(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + certificate_ = value; + onChanged(); + return this; + } + /** + * optional bytes certificate = 1; + */ + public Builder clearCertificate() { + bitField0_ = (bitField0_ & ~0x00000001); + certificate_ = getDefaultInstance().getCertificate(); + onChanged(); + return this; + } + + // optional bytes signature = 2; + private com.google.protobuf.ByteString signature_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes signature = 2; + */ + public boolean hasSignature() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes signature = 2; + */ + public com.google.protobuf.ByteString getSignature() { + return signature_; + } + /** + * optional bytes signature = 2; + */ + public Builder setSignature(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + signature_ = value; + onChanged(); + return this; + } + /** + * optional bytes signature = 2; + */ + public Builder clearSignature() { + bitField0_ = (bitField0_ & ~0x00000002); + signature_ = getDefaultInstance().getSignature(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signal.ServerCertificate) + } + + static { + defaultInstance = new ServerCertificate(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signal.ServerCertificate) + } + + public interface SenderCertificateOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional string sender = 1; + /** + * optional string sender = 1; + */ + boolean hasSender(); + /** + * optional string sender = 1; + */ + String getSender(); + /** + * optional string sender = 1; + */ + com.google.protobuf.ByteString + getSenderBytes(); + + // optional uint32 senderDevice = 2; + /** + * optional uint32 senderDevice = 2; + */ + boolean hasSenderDevice(); + /** + * optional uint32 senderDevice = 2; + */ + int getSenderDevice(); + } + /** + * Protobuf type {@code signal.SenderCertificate} + */ + public static final class SenderCertificate extends + com.google.protobuf.GeneratedMessage + implements SenderCertificateOrBuilder { + // Use SenderCertificate.newBuilder() to construct. + private SenderCertificate(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private SenderCertificate(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final SenderCertificate defaultInstance; + public static SenderCertificate getDefaultInstance() { + return defaultInstance; + } + + public SenderCertificate getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private SenderCertificate( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + sender_ = input.readBytes(); + break; + } + case 16: { + bitField0_ |= 0x00000002; + senderDevice_ = input.readUInt32(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return SignalProtos.internal_static_signal_SenderCertificate_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return SignalProtos.internal_static_signal_SenderCertificate_fieldAccessorTable + .ensureFieldAccessorsInitialized( + SenderCertificate.class, Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public SenderCertificate parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new SenderCertificate(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional string sender = 1; + public static final int SENDER_FIELD_NUMBER = 1; + private Object sender_; + /** + * optional string sender = 1; + */ + public boolean hasSender() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string sender = 1; + */ + public String getSender() { + Object ref = sender_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + sender_ = s; + } + return s; + } + } + /** + * optional string sender = 1; + */ + public com.google.protobuf.ByteString + getSenderBytes() { + Object ref = sender_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + sender_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional uint32 senderDevice = 2; + public static final int SENDERDEVICE_FIELD_NUMBER = 2; + private int senderDevice_; + /** + * optional uint32 senderDevice = 2; + */ + public boolean hasSenderDevice() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional uint32 senderDevice = 2; + */ + public int getSenderDevice() { + return senderDevice_; + } + + private void initFields() { + sender_ = ""; + senderDevice_ = 0; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getSenderBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeUInt32(2, senderDevice_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getSenderBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(2, senderDevice_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static SenderCertificate parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static SenderCertificate parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static SenderCertificate parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static SenderCertificate parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static SenderCertificate parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static SenderCertificate parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static SenderCertificate parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static SenderCertificate parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static SenderCertificate parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static SenderCertificate parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(SenderCertificate prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signal.SenderCertificate} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements SenderCertificateOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return SignalProtos.internal_static_signal_SenderCertificate_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return SignalProtos.internal_static_signal_SenderCertificate_fieldAccessorTable + .ensureFieldAccessorsInitialized( + SenderCertificate.class, Builder.class); + } + + // Construct using org.session.libsignal.metadata.SignalProtos.SenderCertificate.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + sender_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + senderDevice_ = 0; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return SignalProtos.internal_static_signal_SenderCertificate_descriptor; + } + + public SenderCertificate getDefaultInstanceForType() { + return SenderCertificate.getDefaultInstance(); + } + + public SenderCertificate build() { + SenderCertificate result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public SenderCertificate buildPartial() { + SenderCertificate result = new SenderCertificate(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.sender_ = sender_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.senderDevice_ = senderDevice_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof SenderCertificate) { + return mergeFrom((SenderCertificate)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(SenderCertificate other) { + if (other == SenderCertificate.getDefaultInstance()) return this; + if (other.hasSender()) { + bitField0_ |= 0x00000001; + sender_ = other.sender_; + onChanged(); + } + if (other.hasSenderDevice()) { + setSenderDevice(other.getSenderDevice()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + SenderCertificate parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (SenderCertificate) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional string sender = 1; + private Object sender_ = ""; + /** + * optional string sender = 1; + */ + public boolean hasSender() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string sender = 1; + */ + public String getSender() { + Object ref = sender_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + sender_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string sender = 1; + */ + public com.google.protobuf.ByteString + getSenderBytes() { + Object ref = sender_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + sender_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string sender = 1; + */ + public Builder setSender( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + sender_ = value; + onChanged(); + return this; + } + /** + * optional string sender = 1; + */ + public Builder clearSender() { + bitField0_ = (bitField0_ & ~0x00000001); + sender_ = getDefaultInstance().getSender(); + onChanged(); + return this; + } + /** + * optional string sender = 1; + */ + public Builder setSenderBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + sender_ = value; + onChanged(); + return this; + } + + // optional uint32 senderDevice = 2; + private int senderDevice_ ; + /** + * optional uint32 senderDevice = 2; + */ + public boolean hasSenderDevice() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional uint32 senderDevice = 2; + */ + public int getSenderDevice() { + return senderDevice_; + } + /** + * optional uint32 senderDevice = 2; + */ + public Builder setSenderDevice(int value) { + bitField0_ |= 0x00000002; + senderDevice_ = value; + onChanged(); + return this; + } + /** + * optional uint32 senderDevice = 2; + */ + public Builder clearSenderDevice() { + bitField0_ = (bitField0_ & ~0x00000002); + senderDevice_ = 0; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signal.SenderCertificate) + } + + static { + defaultInstance = new SenderCertificate(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signal.SenderCertificate) + } + + public interface UnidentifiedSenderMessageOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional bytes ephemeralPublic = 1; + /** + * optional bytes ephemeralPublic = 1; + */ + boolean hasEphemeralPublic(); + /** + * optional bytes ephemeralPublic = 1; + */ + com.google.protobuf.ByteString getEphemeralPublic(); + + // optional bytes encryptedStatic = 2; + /** + * optional bytes encryptedStatic = 2; + */ + boolean hasEncryptedStatic(); + /** + * optional bytes encryptedStatic = 2; + */ + com.google.protobuf.ByteString getEncryptedStatic(); + + // optional bytes encryptedMessage = 3; + /** + * optional bytes encryptedMessage = 3; + */ + boolean hasEncryptedMessage(); + /** + * optional bytes encryptedMessage = 3; + */ + com.google.protobuf.ByteString getEncryptedMessage(); + } + /** + * Protobuf type {@code signal.UnidentifiedSenderMessage} + */ + public static final class UnidentifiedSenderMessage extends + com.google.protobuf.GeneratedMessage + implements UnidentifiedSenderMessageOrBuilder { + // Use UnidentifiedSenderMessage.newBuilder() to construct. + private UnidentifiedSenderMessage(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private UnidentifiedSenderMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final UnidentifiedSenderMessage defaultInstance; + public static UnidentifiedSenderMessage getDefaultInstance() { + return defaultInstance; + } + + public UnidentifiedSenderMessage getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private UnidentifiedSenderMessage( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + ephemeralPublic_ = input.readBytes(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + encryptedStatic_ = input.readBytes(); + break; + } + case 26: { + bitField0_ |= 0x00000004; + encryptedMessage_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return SignalProtos.internal_static_signal_UnidentifiedSenderMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return SignalProtos.internal_static_signal_UnidentifiedSenderMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + UnidentifiedSenderMessage.class, Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public UnidentifiedSenderMessage parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new UnidentifiedSenderMessage(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public interface MessageOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional .signal.UnidentifiedSenderMessage.Message.Type type = 1; + /** + * optional .signal.UnidentifiedSenderMessage.Message.Type type = 1; + */ + boolean hasType(); + /** + * optional .signal.UnidentifiedSenderMessage.Message.Type type = 1; + */ + Message.Type getType(); + + // optional .signal.SenderCertificate senderCertificate = 2; + /** + * optional .signal.SenderCertificate senderCertificate = 2; + */ + boolean hasSenderCertificate(); + /** + * optional .signal.SenderCertificate senderCertificate = 2; + */ + SenderCertificate getSenderCertificate(); + /** + * optional .signal.SenderCertificate senderCertificate = 2; + */ + SenderCertificateOrBuilder getSenderCertificateOrBuilder(); + + // optional bytes content = 3; + /** + * optional bytes content = 3; + */ + boolean hasContent(); + /** + * optional bytes content = 3; + */ + com.google.protobuf.ByteString getContent(); + } + /** + * Protobuf type {@code signal.UnidentifiedSenderMessage.Message} + */ + public static final class Message extends + com.google.protobuf.GeneratedMessage + implements MessageOrBuilder { + // Use Message.newBuilder() to construct. + private Message(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Message(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Message defaultInstance; + public static Message getDefaultInstance() { + return defaultInstance; + } + + public Message getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Message( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + int rawValue = input.readEnum(); + Type value = Type.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(1, rawValue); + } else { + bitField0_ |= 0x00000001; + type_ = value; + } + break; + } + case 18: { + SenderCertificate.Builder subBuilder = null; + if (((bitField0_ & 0x00000002) == 0x00000002)) { + subBuilder = senderCertificate_.toBuilder(); + } + senderCertificate_ = input.readMessage(SenderCertificate.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(senderCertificate_); + senderCertificate_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000002; + break; + } + case 26: { + bitField0_ |= 0x00000004; + content_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return SignalProtos.internal_static_signal_UnidentifiedSenderMessage_Message_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return SignalProtos.internal_static_signal_UnidentifiedSenderMessage_Message_fieldAccessorTable + .ensureFieldAccessorsInitialized( + Message.class, Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Message parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Message(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + /** + * Protobuf enum {@code signal.UnidentifiedSenderMessage.Message.Type} + */ + public enum Type + implements com.google.protobuf.ProtocolMessageEnum { + /** + * PREKEY_MESSAGE = 1; + */ + PREKEY_MESSAGE(0, 1), + /** + * MESSAGE = 2; + */ + MESSAGE(1, 2), + /** + * FALLBACK_MESSAGE = 3; + */ + FALLBACK_MESSAGE(2, 3), + ; + + /** + * PREKEY_MESSAGE = 1; + */ + public static final int PREKEY_MESSAGE_VALUE = 1; + /** + * MESSAGE = 2; + */ + public static final int MESSAGE_VALUE = 2; + /** + * FALLBACK_MESSAGE = 3; + */ + public static final int FALLBACK_MESSAGE_VALUE = 3; + + + public final int getNumber() { return value; } + + public static Type valueOf(int value) { + switch (value) { + case 1: return PREKEY_MESSAGE; + case 2: return MESSAGE; + case 3: return FALLBACK_MESSAGE; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static com.google.protobuf.Internal.EnumLiteMap + internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Type findValueByNumber(int number) { + return Type.valueOf(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(index); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return Message.getDescriptor().getEnumTypes().get(0); + } + + private static final Type[] VALUES = values(); + + public static Type valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int index; + private final int value; + + private Type(int index, int value) { + this.index = index; + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:signal.UnidentifiedSenderMessage.Message.Type) + } + + private int bitField0_; + // optional .signal.UnidentifiedSenderMessage.Message.Type type = 1; + public static final int TYPE_FIELD_NUMBER = 1; + private Type type_; + /** + * optional .signal.UnidentifiedSenderMessage.Message.Type type = 1; + */ + public boolean hasType() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional .signal.UnidentifiedSenderMessage.Message.Type type = 1; + */ + public Type getType() { + return type_; + } + + // optional .signal.SenderCertificate senderCertificate = 2; + public static final int SENDERCERTIFICATE_FIELD_NUMBER = 2; + private SenderCertificate senderCertificate_; + /** + * optional .signal.SenderCertificate senderCertificate = 2; + */ + public boolean hasSenderCertificate() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .signal.SenderCertificate senderCertificate = 2; + */ + public SenderCertificate getSenderCertificate() { + return senderCertificate_; + } + /** + * optional .signal.SenderCertificate senderCertificate = 2; + */ + public SenderCertificateOrBuilder getSenderCertificateOrBuilder() { + return senderCertificate_; + } + + // optional bytes content = 3; + public static final int CONTENT_FIELD_NUMBER = 3; + private com.google.protobuf.ByteString content_; + /** + * optional bytes content = 3; + */ + public boolean hasContent() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes content = 3; + */ + public com.google.protobuf.ByteString getContent() { + return content_; + } + + private void initFields() { + type_ = Type.PREKEY_MESSAGE; + senderCertificate_ = SenderCertificate.getDefaultInstance(); + content_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeEnum(1, type_.getNumber()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeMessage(2, senderCertificate_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(3, content_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(1, type_.getNumber()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, senderCertificate_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, content_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static Message parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static Message parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static Message parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static Message parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static Message parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static Message parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static Message parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static Message parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static Message parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static Message parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(Message prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signal.UnidentifiedSenderMessage.Message} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements MessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return SignalProtos.internal_static_signal_UnidentifiedSenderMessage_Message_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return SignalProtos.internal_static_signal_UnidentifiedSenderMessage_Message_fieldAccessorTable + .ensureFieldAccessorsInitialized( + Message.class, Builder.class); + } + + // Construct using org.session.libsignal.metadata.SignalProtos.UnidentifiedSenderMessage.Message.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getSenderCertificateFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + type_ = Type.PREKEY_MESSAGE; + bitField0_ = (bitField0_ & ~0x00000001); + if (senderCertificateBuilder_ == null) { + senderCertificate_ = SenderCertificate.getDefaultInstance(); + } else { + senderCertificateBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + content_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return SignalProtos.internal_static_signal_UnidentifiedSenderMessage_Message_descriptor; + } + + public Message getDefaultInstanceForType() { + return Message.getDefaultInstance(); + } + + public Message build() { + Message result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public Message buildPartial() { + Message result = new Message(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.type_ = type_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + if (senderCertificateBuilder_ == null) { + result.senderCertificate_ = senderCertificate_; + } else { + result.senderCertificate_ = senderCertificateBuilder_.build(); + } + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.content_ = content_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof Message) { + return mergeFrom((Message)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(Message other) { + if (other == Message.getDefaultInstance()) return this; + if (other.hasType()) { + setType(other.getType()); + } + if (other.hasSenderCertificate()) { + mergeSenderCertificate(other.getSenderCertificate()); + } + if (other.hasContent()) { + setContent(other.getContent()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + Message parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (Message) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional .signal.UnidentifiedSenderMessage.Message.Type type = 1; + private Type type_ = Type.PREKEY_MESSAGE; + /** + * optional .signal.UnidentifiedSenderMessage.Message.Type type = 1; + */ + public boolean hasType() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional .signal.UnidentifiedSenderMessage.Message.Type type = 1; + */ + public Type getType() { + return type_; + } + /** + * optional .signal.UnidentifiedSenderMessage.Message.Type type = 1; + */ + public Builder setType(Type value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + type_ = value; + onChanged(); + return this; + } + /** + * optional .signal.UnidentifiedSenderMessage.Message.Type type = 1; + */ + public Builder clearType() { + bitField0_ = (bitField0_ & ~0x00000001); + type_ = Type.PREKEY_MESSAGE; + onChanged(); + return this; + } + + // optional .signal.SenderCertificate senderCertificate = 2; + private SenderCertificate senderCertificate_ = SenderCertificate.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + SenderCertificate, SenderCertificate.Builder, SenderCertificateOrBuilder> senderCertificateBuilder_; + /** + * optional .signal.SenderCertificate senderCertificate = 2; + */ + public boolean hasSenderCertificate() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .signal.SenderCertificate senderCertificate = 2; + */ + public SenderCertificate getSenderCertificate() { + if (senderCertificateBuilder_ == null) { + return senderCertificate_; + } else { + return senderCertificateBuilder_.getMessage(); + } + } + /** + * optional .signal.SenderCertificate senderCertificate = 2; + */ + public Builder setSenderCertificate(SenderCertificate value) { + if (senderCertificateBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + senderCertificate_ = value; + onChanged(); + } else { + senderCertificateBuilder_.setMessage(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .signal.SenderCertificate senderCertificate = 2; + */ + public Builder setSenderCertificate( + SenderCertificate.Builder builderForValue) { + if (senderCertificateBuilder_ == null) { + senderCertificate_ = builderForValue.build(); + onChanged(); + } else { + senderCertificateBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .signal.SenderCertificate senderCertificate = 2; + */ + public Builder mergeSenderCertificate(SenderCertificate value) { + if (senderCertificateBuilder_ == null) { + if (((bitField0_ & 0x00000002) == 0x00000002) && + senderCertificate_ != SenderCertificate.getDefaultInstance()) { + senderCertificate_ = + SenderCertificate.newBuilder(senderCertificate_).mergeFrom(value).buildPartial(); + } else { + senderCertificate_ = value; + } + onChanged(); + } else { + senderCertificateBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .signal.SenderCertificate senderCertificate = 2; + */ + public Builder clearSenderCertificate() { + if (senderCertificateBuilder_ == null) { + senderCertificate_ = SenderCertificate.getDefaultInstance(); + onChanged(); + } else { + senderCertificateBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + /** + * optional .signal.SenderCertificate senderCertificate = 2; + */ + public SenderCertificate.Builder getSenderCertificateBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getSenderCertificateFieldBuilder().getBuilder(); + } + /** + * optional .signal.SenderCertificate senderCertificate = 2; + */ + public SenderCertificateOrBuilder getSenderCertificateOrBuilder() { + if (senderCertificateBuilder_ != null) { + return senderCertificateBuilder_.getMessageOrBuilder(); + } else { + return senderCertificate_; + } + } + /** + * optional .signal.SenderCertificate senderCertificate = 2; + */ + private com.google.protobuf.SingleFieldBuilder< + SenderCertificate, SenderCertificate.Builder, SenderCertificateOrBuilder> + getSenderCertificateFieldBuilder() { + if (senderCertificateBuilder_ == null) { + senderCertificateBuilder_ = new com.google.protobuf.SingleFieldBuilder< + SenderCertificate, SenderCertificate.Builder, SenderCertificateOrBuilder>( + senderCertificate_, + getParentForChildren(), + isClean()); + senderCertificate_ = null; + } + return senderCertificateBuilder_; + } + + // optional bytes content = 3; + private com.google.protobuf.ByteString content_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes content = 3; + */ + public boolean hasContent() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes content = 3; + */ + public com.google.protobuf.ByteString getContent() { + return content_; + } + /** + * optional bytes content = 3; + */ + public Builder setContent(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + content_ = value; + onChanged(); + return this; + } + /** + * optional bytes content = 3; + */ + public Builder clearContent() { + bitField0_ = (bitField0_ & ~0x00000004); + content_ = getDefaultInstance().getContent(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signal.UnidentifiedSenderMessage.Message) + } + + static { + defaultInstance = new Message(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signal.UnidentifiedSenderMessage.Message) + } + + private int bitField0_; + // optional bytes ephemeralPublic = 1; + public static final int EPHEMERALPUBLIC_FIELD_NUMBER = 1; + private com.google.protobuf.ByteString ephemeralPublic_; + /** + * optional bytes ephemeralPublic = 1; + */ + public boolean hasEphemeralPublic() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes ephemeralPublic = 1; + */ + public com.google.protobuf.ByteString getEphemeralPublic() { + return ephemeralPublic_; + } + + // optional bytes encryptedStatic = 2; + public static final int ENCRYPTEDSTATIC_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString encryptedStatic_; + /** + * optional bytes encryptedStatic = 2; + */ + public boolean hasEncryptedStatic() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes encryptedStatic = 2; + */ + public com.google.protobuf.ByteString getEncryptedStatic() { + return encryptedStatic_; + } + + // optional bytes encryptedMessage = 3; + public static final int ENCRYPTEDMESSAGE_FIELD_NUMBER = 3; + private com.google.protobuf.ByteString encryptedMessage_; + /** + * optional bytes encryptedMessage = 3; + */ + public boolean hasEncryptedMessage() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes encryptedMessage = 3; + */ + public com.google.protobuf.ByteString getEncryptedMessage() { + return encryptedMessage_; + } + + private void initFields() { + ephemeralPublic_ = com.google.protobuf.ByteString.EMPTY; + encryptedStatic_ = com.google.protobuf.ByteString.EMPTY; + encryptedMessage_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, ephemeralPublic_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, encryptedStatic_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(3, encryptedMessage_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, ephemeralPublic_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, encryptedStatic_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, encryptedMessage_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static UnidentifiedSenderMessage parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static UnidentifiedSenderMessage parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static UnidentifiedSenderMessage parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static UnidentifiedSenderMessage parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static UnidentifiedSenderMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static UnidentifiedSenderMessage parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static UnidentifiedSenderMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static UnidentifiedSenderMessage parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static UnidentifiedSenderMessage parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static UnidentifiedSenderMessage parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(UnidentifiedSenderMessage prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signal.UnidentifiedSenderMessage} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements UnidentifiedSenderMessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return SignalProtos.internal_static_signal_UnidentifiedSenderMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return SignalProtos.internal_static_signal_UnidentifiedSenderMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + UnidentifiedSenderMessage.class, Builder.class); + } + + // Construct using org.session.libsignal.metadata.SignalProtos.UnidentifiedSenderMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + ephemeralPublic_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + encryptedStatic_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + encryptedMessage_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return SignalProtos.internal_static_signal_UnidentifiedSenderMessage_descriptor; + } + + public UnidentifiedSenderMessage getDefaultInstanceForType() { + return UnidentifiedSenderMessage.getDefaultInstance(); + } + + public UnidentifiedSenderMessage build() { + UnidentifiedSenderMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public UnidentifiedSenderMessage buildPartial() { + UnidentifiedSenderMessage result = new UnidentifiedSenderMessage(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.ephemeralPublic_ = ephemeralPublic_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.encryptedStatic_ = encryptedStatic_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.encryptedMessage_ = encryptedMessage_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof UnidentifiedSenderMessage) { + return mergeFrom((UnidentifiedSenderMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(UnidentifiedSenderMessage other) { + if (other == UnidentifiedSenderMessage.getDefaultInstance()) return this; + if (other.hasEphemeralPublic()) { + setEphemeralPublic(other.getEphemeralPublic()); + } + if (other.hasEncryptedStatic()) { + setEncryptedStatic(other.getEncryptedStatic()); + } + if (other.hasEncryptedMessage()) { + setEncryptedMessage(other.getEncryptedMessage()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + UnidentifiedSenderMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (UnidentifiedSenderMessage) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional bytes ephemeralPublic = 1; + private com.google.protobuf.ByteString ephemeralPublic_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes ephemeralPublic = 1; + */ + public boolean hasEphemeralPublic() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes ephemeralPublic = 1; + */ + public com.google.protobuf.ByteString getEphemeralPublic() { + return ephemeralPublic_; + } + /** + * optional bytes ephemeralPublic = 1; + */ + public Builder setEphemeralPublic(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + ephemeralPublic_ = value; + onChanged(); + return this; + } + /** + * optional bytes ephemeralPublic = 1; + */ + public Builder clearEphemeralPublic() { + bitField0_ = (bitField0_ & ~0x00000001); + ephemeralPublic_ = getDefaultInstance().getEphemeralPublic(); + onChanged(); + return this; + } + + // optional bytes encryptedStatic = 2; + private com.google.protobuf.ByteString encryptedStatic_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes encryptedStatic = 2; + */ + public boolean hasEncryptedStatic() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes encryptedStatic = 2; + */ + public com.google.protobuf.ByteString getEncryptedStatic() { + return encryptedStatic_; + } + /** + * optional bytes encryptedStatic = 2; + */ + public Builder setEncryptedStatic(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + encryptedStatic_ = value; + onChanged(); + return this; + } + /** + * optional bytes encryptedStatic = 2; + */ + public Builder clearEncryptedStatic() { + bitField0_ = (bitField0_ & ~0x00000002); + encryptedStatic_ = getDefaultInstance().getEncryptedStatic(); + onChanged(); + return this; + } + + // optional bytes encryptedMessage = 3; + private com.google.protobuf.ByteString encryptedMessage_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes encryptedMessage = 3; + */ + public boolean hasEncryptedMessage() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes encryptedMessage = 3; + */ + public com.google.protobuf.ByteString getEncryptedMessage() { + return encryptedMessage_; + } + /** + * optional bytes encryptedMessage = 3; + */ + public Builder setEncryptedMessage(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + encryptedMessage_ = value; + onChanged(); + return this; + } + /** + * optional bytes encryptedMessage = 3; + */ + public Builder clearEncryptedMessage() { + bitField0_ = (bitField0_ & ~0x00000004); + encryptedMessage_ = getDefaultInstance().getEncryptedMessage(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signal.UnidentifiedSenderMessage) + } + + static { + defaultInstance = new UnidentifiedSenderMessage(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signal.UnidentifiedSenderMessage) + } + + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signal_ServerCertificate_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signal_ServerCertificate_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signal_ServerCertificate_Certificate_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signal_ServerCertificate_Certificate_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signal_SenderCertificate_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signal_SenderCertificate_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signal_UnidentifiedSenderMessage_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signal_UnidentifiedSenderMessage_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signal_UnidentifiedSenderMessage_Message_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signal_UnidentifiedSenderMessage_Message_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + String[] descriptorData = { + "\n\032UnidentifiedDelivery.proto\022\006signal\"c\n\021" + + "ServerCertificate\022\023\n\013certificate\030\001 \001(\014\022\021" + + "\n\tsignature\030\002 \001(\014\032&\n\013Certificate\022\n\n\002id\030\001" + + " \001(\r\022\013\n\003key\030\002 \001(\014\"9\n\021SenderCertificate\022\016" + + "\n\006sender\030\001 \001(\t\022\024\n\014senderDevice\030\002 \001(\r\"\267\002\n" + + "\031UnidentifiedSenderMessage\022\027\n\017ephemeralP" + + "ublic\030\001 \001(\014\022\027\n\017encryptedStatic\030\002 \001(\014\022\030\n\020" + + "encryptedMessage\030\003 \001(\014\032\315\001\n\007Message\022<\n\004ty" + + "pe\030\001 \001(\0162..signal.UnidentifiedSenderMess" + + "age.Message.Type\0224\n\021senderCertificate\030\002 ", + "\001(\0132\031.signal.SenderCertificate\022\017\n\007conten" + + "t\030\003 \001(\014\"=\n\004Type\022\022\n\016PREKEY_MESSAGE\020\001\022\013\n\007M" + + "ESSAGE\020\002\022\024\n\020FALLBACK_MESSAGE\020\003B-\n\035org.si" + + "gnal.libsignal.metadataB\014SignalProtos" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + internal_static_signal_ServerCertificate_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_signal_ServerCertificate_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signal_ServerCertificate_descriptor, + new String[] { "Certificate", "Signature", }); + internal_static_signal_ServerCertificate_Certificate_descriptor = + internal_static_signal_ServerCertificate_descriptor.getNestedTypes().get(0); + internal_static_signal_ServerCertificate_Certificate_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signal_ServerCertificate_Certificate_descriptor, + new String[] { "Id", "Key", }); + internal_static_signal_SenderCertificate_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_signal_SenderCertificate_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signal_SenderCertificate_descriptor, + new String[] { "Sender", "SenderDevice", }); + internal_static_signal_UnidentifiedSenderMessage_descriptor = + getDescriptor().getMessageTypes().get(2); + internal_static_signal_UnidentifiedSenderMessage_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signal_UnidentifiedSenderMessage_descriptor, + new String[] { "EphemeralPublic", "EncryptedStatic", "EncryptedMessage", }); + internal_static_signal_UnidentifiedSenderMessage_Message_descriptor = + internal_static_signal_UnidentifiedSenderMessage_descriptor.getNestedTypes().get(0); + internal_static_signal_UnidentifiedSenderMessage_Message_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signal_UnidentifiedSenderMessage_Message_descriptor, + new String[] { "Type", "SenderCertificate", "Content", }); + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/libsignal/src/main/java/org/session/libsignal/metadata/certificate/CertificateValidator.java b/libsignal/src/main/java/org/session/libsignal/metadata/certificate/CertificateValidator.java new file mode 100644 index 000000000..3671cf386 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/metadata/certificate/CertificateValidator.java @@ -0,0 +1,24 @@ +package org.session.libsignal.metadata.certificate; + + +import java.util.HashSet; +import java.util.Set; + +public class CertificateValidator { + + @SuppressWarnings("MismatchedQueryAndUpdateOfCollection") + private static final Set REVOKED = new HashSet() {{ + + }}; + + public void validate(SenderCertificate certificate, long validationTime) throws InvalidCertificateException { + if (certificate.getSender() == null || certificate.getSenderDeviceId() <= 0) { + throw new InvalidCertificateException("Sender or sender device id is invalid"); + } + } + + // VisibleForTesting + void validate(ServerCertificate certificate) throws InvalidCertificateException { + } +} + diff --git a/libsignal/src/main/java/org/session/libsignal/metadata/certificate/InvalidCertificateException.java b/libsignal/src/main/java/org/session/libsignal/metadata/certificate/InvalidCertificateException.java new file mode 100644 index 000000000..989ce597c --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/metadata/certificate/InvalidCertificateException.java @@ -0,0 +1,12 @@ +package org.session.libsignal.metadata.certificate; + + +public class InvalidCertificateException extends Exception { + public InvalidCertificateException(String s) { + super(s); + } + + public InvalidCertificateException(Exception e) { + super(e); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/metadata/certificate/SenderCertificate.java b/libsignal/src/main/java/org/session/libsignal/metadata/certificate/SenderCertificate.java new file mode 100644 index 000000000..586b0659e --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/metadata/certificate/SenderCertificate.java @@ -0,0 +1,51 @@ +package org.session.libsignal.metadata.certificate; + + +import com.google.protobuf.InvalidProtocolBufferException; + +import org.session.libsignal.metadata.SignalProtos; + + +public class SenderCertificate { + + private final int senderDeviceId; + private final String sender; + + private final byte[] serialized; + private final byte[] certificate; + + public SenderCertificate(byte[] serialized) throws InvalidCertificateException { + try { + SignalProtos.SenderCertificate certificate = SignalProtos.SenderCertificate.parseFrom(serialized); + + if (!certificate.hasSenderDevice() || !certificate.hasSender()) { + throw new InvalidCertificateException("Missing fields"); + } + + this.sender = certificate.getSender(); + this.senderDeviceId = certificate.getSenderDevice(); + + this.serialized = serialized; + this.certificate = certificate.toByteArray(); + } catch (InvalidProtocolBufferException e) { + throw new InvalidCertificateException(e); + } + } + + + public int getSenderDeviceId() { + return senderDeviceId; + } + + public String getSender() { + return sender; + } + + public byte[] getSerialized() { + return serialized; + } + + public byte[] getCertificate() { + return certificate; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/metadata/certificate/ServerCertificate.java b/libsignal/src/main/java/org/session/libsignal/metadata/certificate/ServerCertificate.java new file mode 100644 index 000000000..7b794e6eb --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/metadata/certificate/ServerCertificate.java @@ -0,0 +1,66 @@ +package org.session.libsignal.metadata.certificate; + + +import com.google.protobuf.InvalidProtocolBufferException; + +import org.session.libsignal.metadata.SignalProtos; +import org.session.libsignal.libsignal.InvalidKeyException; +import org.session.libsignal.libsignal.ecc.Curve; +import org.session.libsignal.libsignal.ecc.ECPublicKey; + +public class ServerCertificate { + + private final int keyId; + private final ECPublicKey key; + + private final byte[] serialized; + private final byte[] certificate; + private final byte[] signature; + + public ServerCertificate(byte[] serialized) throws InvalidCertificateException { + try { + SignalProtos.ServerCertificate wrapper = SignalProtos.ServerCertificate.parseFrom(serialized); + + if (!wrapper.hasCertificate() || !wrapper.hasSignature()) { + throw new InvalidCertificateException("Missing fields"); + } + + SignalProtos.ServerCertificate.Certificate certificate = SignalProtos.ServerCertificate.Certificate.parseFrom(wrapper.getCertificate()); + + if (!certificate.hasId() || !certificate.hasKey()) { + throw new InvalidCertificateException("Missing fields"); + } + + this.keyId = certificate.getId(); + this.key = Curve.decodePoint(certificate.getKey().toByteArray(), 0); + this.serialized = serialized; + this.certificate = wrapper.getCertificate().toByteArray(); + this.signature = wrapper.getSignature().toByteArray(); + + } catch (InvalidProtocolBufferException e) { + throw new InvalidCertificateException(e); + } catch (InvalidKeyException e) { + throw new InvalidCertificateException(e); + } + } + + public int getKeyId() { + return keyId; + } + + public ECPublicKey getKey() { + return key; + } + + public byte[] getSerialized() { + return serialized; + } + + public byte[] getCertificate() { + return certificate; + } + + public byte[] getSignature() { + return signature; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/metadata/protocol/UnidentifiedSenderMessage.java b/libsignal/src/main/java/org/session/libsignal/metadata/protocol/UnidentifiedSenderMessage.java new file mode 100644 index 000000000..8e05a3ef6 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/metadata/protocol/UnidentifiedSenderMessage.java @@ -0,0 +1,87 @@ +package org.session.libsignal.metadata.protocol; + + +import com.google.protobuf.ByteString; +import com.google.protobuf.InvalidProtocolBufferException; + +import org.session.libsignal.metadata.InvalidMetadataMessageException; +import org.session.libsignal.metadata.InvalidMetadataVersionException; +import org.session.libsignal.metadata.SignalProtos; +import org.session.libsignal.libsignal.InvalidKeyException; +import org.session.libsignal.libsignal.ecc.Curve; +import org.session.libsignal.libsignal.ecc.ECPublicKey; +import org.session.libsignal.libsignal.util.ByteUtil; + +public class UnidentifiedSenderMessage { + + private static final int CIPHERTEXT_VERSION = 1; + + private final int version; + private final ECPublicKey ephemeral; + private final byte[] encryptedStatic; + private final byte[] encryptedMessage; + private final byte[] serialized; + + public UnidentifiedSenderMessage(byte[] serialized) + throws InvalidMetadataMessageException, InvalidMetadataVersionException + { + try { + this.version = ByteUtil.highBitsToInt(serialized[0]); + + if (version > CIPHERTEXT_VERSION) { + throw new InvalidMetadataVersionException("Unknown version: " + this.version); + } + + SignalProtos.UnidentifiedSenderMessage unidentifiedSenderMessage = SignalProtos.UnidentifiedSenderMessage.parseFrom(ByteString.copyFrom(serialized, 1, serialized.length - 1)); + + if (!unidentifiedSenderMessage.hasEphemeralPublic() || + !unidentifiedSenderMessage.hasEncryptedStatic() || + !unidentifiedSenderMessage.hasEncryptedMessage()) + { + throw new InvalidMetadataMessageException("Missing fields"); + } + + this.ephemeral = Curve.decodePoint(unidentifiedSenderMessage.getEphemeralPublic().toByteArray(), 0); + this.encryptedStatic = unidentifiedSenderMessage.getEncryptedStatic().toByteArray(); + this.encryptedMessage = unidentifiedSenderMessage.getEncryptedMessage().toByteArray(); + this.serialized = serialized; + } catch (InvalidProtocolBufferException e) { + throw new InvalidMetadataMessageException(e); + } catch (InvalidKeyException e) { + throw new InvalidMetadataMessageException(e); + } + } + + public UnidentifiedSenderMessage(ECPublicKey ephemeral, byte[] encryptedStatic, byte[] encryptedMessage) { + this.version = CIPHERTEXT_VERSION; + this.ephemeral = ephemeral; + this.encryptedStatic = encryptedStatic; + this.encryptedMessage = encryptedMessage; + + byte[] versionBytes = {ByteUtil.intsToByteHighAndLow(CIPHERTEXT_VERSION, CIPHERTEXT_VERSION)}; + byte[] messageBytes = SignalProtos.UnidentifiedSenderMessage.newBuilder() + .setEncryptedMessage(ByteString.copyFrom(encryptedMessage)) + .setEncryptedStatic(ByteString.copyFrom(encryptedStatic)) + .setEphemeralPublic(ByteString.copyFrom(ephemeral.serialize())) + .build() + .toByteArray(); + + this.serialized = ByteUtil.combine(versionBytes, messageBytes); + } + + public ECPublicKey getEphemeral() { + return ephemeral; + } + + public byte[] getEncryptedStatic() { + return encryptedStatic; + } + + public byte[] getEncryptedMessage() { + return encryptedMessage; + } + + public byte[] getSerialized() { + return serialized; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/metadata/protocol/UnidentifiedSenderMessageContent.java b/libsignal/src/main/java/org/session/libsignal/metadata/protocol/UnidentifiedSenderMessageContent.java new file mode 100644 index 000000000..650a05fc4 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/metadata/protocol/UnidentifiedSenderMessageContent.java @@ -0,0 +1,85 @@ +package org.session.libsignal.metadata.protocol; + + +import com.google.protobuf.ByteString; +import com.google.protobuf.InvalidProtocolBufferException; + +import org.session.libsignal.metadata.InvalidMetadataMessageException; +import org.session.libsignal.metadata.SignalProtos; +import org.session.libsignal.metadata.certificate.InvalidCertificateException; +import org.session.libsignal.metadata.certificate.SenderCertificate; +import org.session.libsignal.libsignal.protocol.CiphertextMessage; + +public class UnidentifiedSenderMessageContent { + + private final int type; + private final SenderCertificate senderCertificate; + private final byte[] content; + private final byte[] serialized; + + public UnidentifiedSenderMessageContent(byte[] serialized) throws InvalidMetadataMessageException, InvalidCertificateException { + try { + SignalProtos.UnidentifiedSenderMessage.Message message = SignalProtos.UnidentifiedSenderMessage.Message.parseFrom(serialized); + + if (!message.hasType() || !message.hasSenderCertificate() || !message.hasContent()) { + throw new InvalidMetadataMessageException("Missing fields"); + } + + switch (message.getType()) { + case MESSAGE: this.type = CiphertextMessage.WHISPER_TYPE; break; + case PREKEY_MESSAGE: this.type = CiphertextMessage.PREKEY_TYPE; break; + case FALLBACK_MESSAGE: this.type = CiphertextMessage.FALLBACK_MESSAGE_TYPE; break; + default: throw new InvalidMetadataMessageException("Unknown type: " + message.getType().getNumber()); + } + + this.senderCertificate = new SenderCertificate(message.getSenderCertificate().toByteArray()); + this.content = message.getContent().toByteArray(); + this.serialized = serialized; + } catch (InvalidProtocolBufferException e) { + throw new InvalidMetadataMessageException(e); + } + } + + public UnidentifiedSenderMessageContent(int type, SenderCertificate senderCertificate, byte[] content) { + try { + this.serialized = SignalProtos.UnidentifiedSenderMessage.Message.newBuilder() + .setType(SignalProtos.UnidentifiedSenderMessage.Message.Type.valueOf(getProtoType(type))) + .setSenderCertificate(SignalProtos.SenderCertificate.parseFrom(senderCertificate.getSerialized())) + .setContent(ByteString.copyFrom(content)) + .build() + .toByteArray(); + + this.type = type; + this.senderCertificate = senderCertificate; + this.content = content; + } catch (InvalidProtocolBufferException e) { + throw new AssertionError(e); + } + } + + public int getType() { + return type; + } + + public SenderCertificate getSenderCertificate() { + return senderCertificate; + } + + public byte[] getContent() { + return content; + } + + public byte[] getSerialized() { + return serialized; + } + + private int getProtoType(int type) { + switch (type) { + case CiphertextMessage.WHISPER_TYPE: return SignalProtos.UnidentifiedSenderMessage.Message.Type.MESSAGE_VALUE; + case CiphertextMessage.PREKEY_TYPE: return SignalProtos.UnidentifiedSenderMessage.Message.Type.PREKEY_MESSAGE_VALUE; + case CiphertextMessage.FALLBACK_MESSAGE_TYPE: return SignalProtos.UnidentifiedSenderMessage.Message.Type.FALLBACK_MESSAGE_VALUE; + default: throw new AssertionError(type); + } + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/SignalServiceAccountManager.java b/libsignal/src/main/java/org/session/libsignal/service/api/SignalServiceAccountManager.java new file mode 100644 index 000000000..916393cb1 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/SignalServiceAccountManager.java @@ -0,0 +1,447 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api; + + +import com.google.protobuf.ByteString; + +import org.whispersystems.curve25519.Curve25519; +import org.whispersystems.curve25519.Curve25519KeyPair; +import org.session.libsignal.libsignal.IdentityKey; +import org.session.libsignal.libsignal.IdentityKeyPair; +import org.session.libsignal.libsignal.InvalidKeyException; +import org.session.libsignal.libsignal.ecc.ECPublicKey; +import org.session.libsignal.libsignal.logging.Log; +import org.session.libsignal.libsignal.state.PreKeyRecord; +import org.session.libsignal.libsignal.state.SignedPreKeyRecord; +import org.session.libsignal.libsignal.util.Pair; +import org.session.libsignal.libsignal.util.guava.Optional; +import org.session.libsignal.service.api.crypto.InvalidCiphertextException; +import org.session.libsignal.service.api.crypto.ProfileCipher; +import org.session.libsignal.service.api.crypto.ProfileCipherOutputStream; +import org.session.libsignal.service.api.messages.calls.TurnServerInfo; +import org.session.libsignal.service.api.messages.multidevice.DeviceInfo; +import org.session.libsignal.service.api.push.ContactTokenDetails; +import org.session.libsignal.service.api.push.SignedPreKeyEntity; +import org.session.libsignal.service.api.util.CredentialsProvider; +import org.session.libsignal.service.api.util.StreamDetails; +import org.session.libsignal.service.internal.configuration.SignalServiceConfiguration; +import org.session.libsignal.service.internal.contacts.crypto.ContactDiscoveryCipher; +import org.session.libsignal.service.internal.contacts.crypto.Quote; +import org.session.libsignal.service.internal.contacts.crypto.RemoteAttestation; +import org.session.libsignal.service.internal.contacts.crypto.RemoteAttestationKeys; +import org.session.libsignal.service.internal.contacts.crypto.UnauthenticatedQuoteException; +import org.session.libsignal.service.internal.contacts.crypto.UnauthenticatedResponseException; +import org.session.libsignal.service.internal.contacts.entities.DiscoveryRequest; +import org.session.libsignal.service.internal.contacts.entities.DiscoveryResponse; +import org.session.libsignal.service.internal.contacts.entities.RemoteAttestationRequest; +import org.session.libsignal.service.internal.contacts.entities.RemoteAttestationResponse; +import org.session.libsignal.service.internal.crypto.ProvisioningCipher; +import org.session.libsignal.service.internal.push.ProfileAvatarData; +import org.session.libsignal.service.internal.push.PushServiceSocket; +import org.session.libsignal.service.internal.push.http.ProfileCipherOutputStreamFactory; +import org.session.libsignal.service.internal.util.Base64; +import org.session.libsignal.service.internal.util.StaticCredentialsProvider; +import org.session.libsignal.service.internal.util.Util; + +import java.io.IOException; +import java.security.KeyStore; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.SignatureException; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; + +import static org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage; + +/** + * The main interface for creating, registering, and + * managing a Signal Service account. + * + * @author Moxie Marlinspike + */ +public class SignalServiceAccountManager { + + private static final String TAG = SignalServiceAccountManager.class.getSimpleName(); + + private final PushServiceSocket pushServiceSocket; + private final String user; + private final String userAgent; + + /** + * Construct a SignalServiceAccountManager. + * + * @param configuration The URL for the Signal Service. + * @param user A Signal Service phone number. + * @param password A Signal Service password. + * @param userAgent A string which identifies the client software. + */ + public SignalServiceAccountManager(SignalServiceConfiguration configuration, + String user, String password, + String userAgent) + { + this(configuration, new StaticCredentialsProvider(user, password, null), userAgent); + } + + public SignalServiceAccountManager(SignalServiceConfiguration configuration, + CredentialsProvider credentialsProvider, + String userAgent) + { + this.pushServiceSocket = new PushServiceSocket(configuration, credentialsProvider, userAgent); + this.user = credentialsProvider.getUser(); + this.userAgent = userAgent; + } + + public byte[] getSenderCertificate() throws IOException { + return this.pushServiceSocket.getSenderCertificate(); + } + + public void setPin(Optional pin) throws IOException { + if (pin.isPresent()) { + this.pushServiceSocket.setPin(pin.get()); + } else { + this.pushServiceSocket.removePin(); + } + } + + /** + * Register/Unregister a Google Cloud Messaging registration ID. + * + * @param gcmRegistrationId The GCM id to register. A call with an absent value will unregister. + * @throws IOException + */ + public void setGcmId(Optional gcmRegistrationId) throws IOException { + if (gcmRegistrationId.isPresent()) { + this.pushServiceSocket.registerGcmId(gcmRegistrationId.get()); + } else { + this.pushServiceSocket.unregisterGcmId(); + } + } + + /** + * Request an SMS verification code. On success, the server will send + * an SMS verification code to this Signal user. + * + * @throws IOException + */ + public void requestSmsVerificationCode(boolean androidSmsRetrieverSupported, Optional captchaToken) throws IOException { + this.pushServiceSocket.requestSmsVerificationCode(androidSmsRetrieverSupported, captchaToken); + } + + /** + * Request a Voice verification code. On success, the server will + * make a voice call to this Signal user. + * + * @throws IOException + */ + public void requestVoiceVerificationCode(Locale locale, Optional captchaToken) throws IOException { + this.pushServiceSocket.requestVoiceVerificationCode(locale, captchaToken); + } + + /** + * Verify a Signal Service account with a received SMS or voice verification code. + * + * @param verificationCode The verification code received via SMS or Voice + * (see {@link #requestSmsVerificationCode} and + * {@link #requestVoiceVerificationCode}). + * @param signalingKey 52 random bytes. A 32 byte AES key and a 20 byte Hmac256 key, + * concatenated. + * @param signalProtocolRegistrationId A random 14-bit number that identifies this Signal install. + * This value should remain consistent across registrations for the + * same install, but probabilistically differ across registrations + * for separate installs. + * + * @throws IOException + */ + public void verifyAccountWithCode(String verificationCode, String signalingKey, int signalProtocolRegistrationId, boolean fetchesMessages, String pin, + byte[] unidentifiedAccessKey, boolean unrestrictedUnidentifiedAccess) + throws IOException + { + this.pushServiceSocket.verifyAccountCode(verificationCode, signalingKey, + signalProtocolRegistrationId, + fetchesMessages, pin, + unidentifiedAccessKey, + unrestrictedUnidentifiedAccess); + } + + /** + * Refresh account attributes with server. + * + * @param signalingKey 52 random bytes. A 32 byte AES key and a 20 byte Hmac256 key, concatenated. + * @param signalProtocolRegistrationId A random 14-bit number that identifies this Signal install. + * This value should remain consistent across registrations for the same + * install, but probabilistically differ across registrations for + * separate installs. + * + * @throws IOException + */ + public void setAccountAttributes(String signalingKey, int signalProtocolRegistrationId, boolean fetchesMessages, String pin, + byte[] unidentifiedAccessKey, boolean unrestrictedUnidentifiedAccess) + throws IOException + { + this.pushServiceSocket.setAccountAttributes(signalingKey, signalProtocolRegistrationId, fetchesMessages, pin, + unidentifiedAccessKey, unrestrictedUnidentifiedAccess); + } + + /** + * Register an identity key, signed prekey, and list of one time prekeys + * with the server. + * + * @param identityKey The client's long-term identity keypair. + * @param signedPreKey The client's signed prekey. + * @param oneTimePreKeys The client's list of one-time prekeys. + * + * @throws IOException + */ + public void setPreKeys(IdentityKey identityKey, SignedPreKeyRecord signedPreKey, List oneTimePreKeys) + throws IOException + { + this.pushServiceSocket.registerPreKeys(identityKey, signedPreKey, oneTimePreKeys); + } + + /** + * @return The server's count of currently available (eg. unused) prekeys for this user. + * @throws IOException + */ + public int getPreKeysCount() throws IOException { + return this.pushServiceSocket.getAvailablePreKeys(); + } + + /** + * Set the client's signed prekey. + * + * @param signedPreKey The client's new signed prekey. + * @throws IOException + */ + public void setSignedPreKey(SignedPreKeyRecord signedPreKey) throws IOException { + this.pushServiceSocket.setCurrentSignedPreKey(signedPreKey); + } + + /** + * @return The server's view of the client's current signed prekey. + * @throws IOException + */ + public SignedPreKeyEntity getSignedPreKey() throws IOException { + return this.pushServiceSocket.getCurrentSignedPreKey(); + } + + /** + * Checks whether a contact is currently registered with the server. + * + * @param e164number The contact to check. + * @return An optional ContactTokenDetails, present if registered, absent if not. + * @throws IOException + */ + public Optional getContact(String e164number) throws IOException { + String contactToken = createDirectoryServerToken(e164number, true); + ContactTokenDetails contactTokenDetails = this.pushServiceSocket.getContactTokenDetails(contactToken); + + if (contactTokenDetails != null) { + contactTokenDetails.setNumber(e164number); + } + + return Optional.fromNullable(contactTokenDetails); + } + + /** + * Checks which contacts in a set are registered with the server. + * + * @param e164numbers The contacts to check. + * @return A list of ContactTokenDetails for the registered users. + * @throws IOException + */ + public List getContacts(Set e164numbers) + throws IOException + { + Map contactTokensMap = createDirectoryServerTokenMap(e164numbers); + List activeTokens = this.pushServiceSocket.retrieveDirectory(contactTokensMap.keySet()); + + for (ContactTokenDetails activeToken : activeTokens) { + activeToken.setNumber(contactTokensMap.get(activeToken.getToken())); + } + + return activeTokens; + } + + public List getRegisteredUsers(KeyStore iasKeyStore, Set e164numbers, String mrenclave) + throws IOException, Quote.InvalidQuoteFormatException, UnauthenticatedQuoteException, SignatureException, UnauthenticatedResponseException + { + try { + String authorization = this.pushServiceSocket.getContactDiscoveryAuthorization(); + Curve25519 curve = Curve25519.getInstance(Curve25519.BEST); + Curve25519KeyPair keyPair = curve.generateKeyPair(); + + ContactDiscoveryCipher cipher = new ContactDiscoveryCipher(); + RemoteAttestationRequest attestationRequest = new RemoteAttestationRequest(keyPair.getPublicKey()); + Pair> attestationResponse = this.pushServiceSocket.getContactDiscoveryRemoteAttestation(authorization, attestationRequest, mrenclave); + + RemoteAttestationKeys keys = new RemoteAttestationKeys(keyPair, attestationResponse.first().getServerEphemeralPublic(), attestationResponse.first().getServerStaticPublic()); + Quote quote = new Quote(attestationResponse.first().getQuote()); + byte[] requestId = cipher.getRequestId(keys, attestationResponse.first()); + + cipher.verifyServerQuote(quote, attestationResponse.first().getServerStaticPublic(), mrenclave); + cipher.verifyIasSignature(iasKeyStore, attestationResponse.first().getCertificates(), attestationResponse.first().getSignatureBody(), attestationResponse.first().getSignature(), quote); + + RemoteAttestation remoteAttestation = new RemoteAttestation(requestId, keys); + List addressBook = new LinkedList(); + + for (String e164number : e164numbers) { + addressBook.add(e164number.substring(1)); + } + + DiscoveryRequest request = cipher.createDiscoveryRequest(addressBook, remoteAttestation); + DiscoveryResponse response = this.pushServiceSocket.getContactDiscoveryRegisteredUsers(authorization, request, attestationResponse.second(), mrenclave); + byte[] data = cipher.getDiscoveryResponseData(response, remoteAttestation); + + Iterator addressBookIterator = addressBook.iterator(); + List results = new LinkedList(); + + for (byte aData : data) { + String candidate = addressBookIterator.next(); + + if (aData != 0) results.add('+' + candidate); + } + + return results; + } catch (InvalidCiphertextException e) { + throw new UnauthenticatedResponseException(e); + } + } + + public void reportContactDiscoveryServiceMatch() { + try { + this.pushServiceSocket.reportContactDiscoveryServiceMatch(); + } catch (IOException e) { + Log.w(TAG, "Request to indicate a contact discovery result match failed. Ignoring.", e); + } + } + + public void reportContactDiscoveryServiceMismatch() { + try { + this.pushServiceSocket.reportContactDiscoveryServiceMismatch(); + } catch (IOException e) { + Log.w(TAG, "Request to indicate a contact discovery result mismatch failed. Ignoring.", e); + } + } + + public void reportContactDiscoveryServiceAttestationError(String reason) { + try { + this.pushServiceSocket.reportContactDiscoveryServiceAttestationError(reason); + } catch (IOException e) { + Log.w(TAG, "Request to indicate a contact discovery attestation error failed. Ignoring.", e); + } + } + + public void reportContactDiscoveryServiceUnexpectedError(String reason) { + try { + this.pushServiceSocket.reportContactDiscoveryServiceUnexpectedError(reason); + } catch (IOException e) { + Log.w(TAG, "Request to indicate a contact discovery unexpected error failed. Ignoring.", e); + } + } + + public String getNewDeviceVerificationCode() throws IOException { + return this.pushServiceSocket.getNewDeviceVerificationCode(); + } + + public void addDevice(String deviceIdentifier, + ECPublicKey deviceKey, + IdentityKeyPair identityKeyPair, + Optional profileKey, + String code) + throws InvalidKeyException, IOException + { + ProvisioningCipher cipher = new ProvisioningCipher(deviceKey); + ProvisionMessage.Builder message = ProvisionMessage.newBuilder() + .setIdentityKeyPublic(ByteString.copyFrom(identityKeyPair.getPublicKey().serialize())) + .setIdentityKeyPrivate(ByteString.copyFrom(identityKeyPair.getPrivateKey().serialize())) + .setNumber(user) + .setProvisioningCode(code); + + if (profileKey.isPresent()) { + message.setProfileKey(ByteString.copyFrom(profileKey.get())); + } + + byte[] ciphertext = cipher.encrypt(message.build()); + this.pushServiceSocket.sendProvisioningMessage(deviceIdentifier, ciphertext); + } + + public List getDevices() throws IOException { + return this.pushServiceSocket.getDevices(); + } + + public void removeDevice(long deviceId) throws IOException { + this.pushServiceSocket.removeDevice(deviceId); + } + + public TurnServerInfo getTurnServerInfo() throws IOException { + return this.pushServiceSocket.getTurnServerInfo(); + } + + public void setProfileName(byte[] key, String name) + throws IOException + { + if (name == null) name = ""; + + String ciphertextName = Base64.encodeBytesWithoutPadding(new ProfileCipher(key).encryptName(name.getBytes("UTF-8"), ProfileCipher.NAME_PADDED_LENGTH)); + + this.pushServiceSocket.setProfileName(ciphertextName); + } + + public void setProfileAvatar(byte[] key, StreamDetails avatar) + throws IOException + { + ProfileAvatarData profileAvatarData = null; + + if (avatar != null) { + profileAvatarData = new ProfileAvatarData(avatar.getStream(), + ProfileCipherOutputStream.getCiphertextLength(avatar.getLength()), + avatar.getContentType(), + new ProfileCipherOutputStreamFactory(key)); + } + + this.pushServiceSocket.setProfileAvatar(profileAvatarData); + } + + public void setSoTimeoutMillis(long soTimeoutMillis) { + this.pushServiceSocket.setSoTimeoutMillis(soTimeoutMillis); + } + + public void cancelInFlightRequests() { + this.pushServiceSocket.cancelInFlightRequests(); + } + + private String createDirectoryServerToken(String e164number, boolean urlSafe) { + try { + MessageDigest digest = MessageDigest.getInstance("SHA1"); + byte[] token = Util.trim(digest.digest(e164number.getBytes()), 10); + String encoded = Base64.encodeBytesWithoutPadding(token); + + if (urlSafe) return encoded.replace('+', '-').replace('/', '_'); + else return encoded; + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } + } + + private Map createDirectoryServerTokenMap(Collection e164numbers) { + Map tokenMap = new HashMap(e164numbers.size()); + + for (String number : e164numbers) { + tokenMap.put(createDirectoryServerToken(number, false), number); + } + + return tokenMap; + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/SignalServiceMessagePipe.java b/libsignal/src/main/java/org/session/libsignal/service/api/SignalServiceMessagePipe.java new file mode 100644 index 000000000..bdb96da33 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/SignalServiceMessagePipe.java @@ -0,0 +1,275 @@ +/* + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api; + +import com.google.protobuf.ByteString; + +import org.session.libsignal.libsignal.InvalidVersionException; +import org.session.libsignal.libsignal.util.Pair; +import org.session.libsignal.libsignal.util.guava.Optional; +import org.session.libsignal.service.api.crypto.UnidentifiedAccess; +import org.session.libsignal.service.api.messages.SignalServiceEnvelope; +import org.session.libsignal.service.api.profiles.SignalServiceProfile; +import org.session.libsignal.service.api.push.SignalServiceAddress; +import org.session.libsignal.service.api.util.CredentialsProvider; +import org.session.libsignal.service.internal.push.AttachmentUploadAttributes; +import org.session.libsignal.service.internal.push.OutgoingPushMessageList; +import org.session.libsignal.service.internal.push.SendMessageResponse; +import org.session.libsignal.service.internal.util.Base64; +import org.session.libsignal.service.internal.util.JsonUtil; +import org.session.libsignal.service.internal.util.Util; +import org.session.libsignal.service.internal.websocket.WebSocketConnection; + +import java.io.IOException; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage; +import static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage; + +/** + * A SignalServiceMessagePipe represents a dedicated connection + * to the Signal Service, which the server can push messages + * down through. + */ +public class SignalServiceMessagePipe { + + private static final String TAG = SignalServiceMessagePipe.class.getName(); + + private final WebSocketConnection websocket; + private final Optional credentialsProvider; + + SignalServiceMessagePipe(WebSocketConnection websocket, Optional credentialsProvider) { + this.websocket = websocket; + this.credentialsProvider = credentialsProvider; + + this.websocket.connect(); + } + + /** + * A blocking call that reads a message off the pipe. When this + * call returns, the message has been acknowledged and will not + * be retransmitted. + * + * @param timeout The timeout to wait for. + * @param unit The timeout time unit. + * @return A new message. + * + * @throws InvalidVersionException + * @throws IOException + * @throws TimeoutException + */ + public SignalServiceEnvelope read(long timeout, TimeUnit unit) + throws InvalidVersionException, IOException, TimeoutException + { + return read(timeout, unit, new NullMessagePipeCallback()); + } + + /** + * A blocking call that reads a message off the pipe (see {@link #read(long, TimeUnit)} + * + * Unlike {@link #read(long, TimeUnit)}, this method allows you + * to specify a callback that will be called before the received message is acknowledged. + * This allows you to write the received message to durable storage before acknowledging + * receipt of it to the server. + * + * @param timeout The timeout to wait for. + * @param unit The timeout time unit. + * @param callback A callback that will be called before the message receipt is + * acknowledged to the server. + * @return The message read (same as the message sent through the callback). + * @throws TimeoutException + * @throws IOException + * @throws InvalidVersionException + */ + public SignalServiceEnvelope read(long timeout, TimeUnit unit, MessagePipeCallback callback) + throws TimeoutException, IOException, InvalidVersionException + { + if (!credentialsProvider.isPresent()) { + throw new IllegalArgumentException("You can't read messages if you haven't specified credentials"); + } + + while (true) { + WebSocketRequestMessage request = websocket.readRequest(unit.toMillis(timeout)); + WebSocketResponseMessage response = createWebSocketResponse(request); + boolean signalKeyEncrypted = isSignalKeyEncrypted(request); + + try { + if (isSignalServiceEnvelope(request)) { + SignalServiceEnvelope envelope = new SignalServiceEnvelope(request.getBody().toByteArray(), + credentialsProvider.get().getSignalingKey(), + signalKeyEncrypted); + + callback.onMessage(envelope); + return envelope; + } + } finally { + websocket.sendResponse(response); + } + } + } + + public SendMessageResponse send(OutgoingPushMessageList list, Optional unidentifiedAccess) throws IOException { + try { + List headers = new LinkedList() {{ + add("content-type:application/json"); + }}; + + if (unidentifiedAccess.isPresent()) { + headers.add("Unidentified-Access-Key:" + Base64.encodeBytes(unidentifiedAccess.get().getUnidentifiedAccessKey())); + } + + WebSocketRequestMessage requestMessage = WebSocketRequestMessage.newBuilder() + .setId(SecureRandom.getInstance("SHA1PRNG").nextLong()) + .setVerb("PUT") + .setPath(String.format("/v1/messages/%s", list.getDestination())) + .addAllHeaders(headers) + .setBody(ByteString.copyFrom(JsonUtil.toJson(list).getBytes())) + .build(); + + Pair response = websocket.sendRequest(requestMessage).get(10, TimeUnit.SECONDS); + + if (response.first() < 200 || response.first() >= 300) { + throw new IOException("Non-successful response: " + response.first()); + } + + if (Util.isEmpty(response.second())) return new SendMessageResponse(false); + else return JsonUtil.fromJson(response.second(), SendMessageResponse.class); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (InterruptedException e) { + throw new IOException(e); + } catch (ExecutionException e) { + throw new IOException(e); + } catch (TimeoutException e) { + throw new IOException(e); + } + } + + public SignalServiceProfile getProfile(SignalServiceAddress address, Optional unidentifiedAccess) throws IOException { + try { + List headers = new LinkedList(); + + if (unidentifiedAccess.isPresent()) { + headers.add("Unidentified-Access-Key:" + Base64.encodeBytes(unidentifiedAccess.get().getUnidentifiedAccessKey())); + } + + WebSocketRequestMessage requestMessage = WebSocketRequestMessage.newBuilder() + .setId(SecureRandom.getInstance("SHA1PRNG").nextLong()) + .setVerb("GET") + .setPath(String.format("/v1/profile/%s", address.getNumber())) + .addAllHeaders(headers) + .build(); + + Pair response = websocket.sendRequest(requestMessage).get(10, TimeUnit.SECONDS); + + if (response.first() < 200 || response.first() >= 300) { + throw new IOException("Non-successful response: " + response.first()); + } + + return JsonUtil.fromJson(response.second(), SignalServiceProfile.class); + } catch (NoSuchAlgorithmException nsae) { + throw new AssertionError(nsae); + } catch (InterruptedException e) { + throw new IOException(e); + } catch (ExecutionException e) { + throw new IOException(e); + } catch (TimeoutException e) { + throw new IOException(e); + } + } + + public AttachmentUploadAttributes getAttachmentUploadAttributes() throws IOException { + try { + WebSocketRequestMessage requestMessage = WebSocketRequestMessage.newBuilder() + .setId(new SecureRandom().nextLong()) + .setVerb("GET") + .setPath("/v2/attachments/form/upload") + .build(); + + Pair response = websocket.sendRequest(requestMessage).get(10, TimeUnit.SECONDS); + + if (response.first() < 200 || response.first() >= 300) { + throw new IOException("Non-successful response: " + response.first()); + } + + return JsonUtil.fromJson(response.second(), AttachmentUploadAttributes.class); + } catch (InterruptedException e) { + throw new IOException(e); + } catch (ExecutionException e) { + throw new IOException(e); + } catch (TimeoutException e) { + throw new IOException(e); + } + } + + /** + * Close this connection to the server. + */ + public void shutdown() { + websocket.disconnect(); + } + + private boolean isSignalServiceEnvelope(WebSocketRequestMessage message) { + return "PUT".equals(message.getVerb()) && "/api/v1/message".equals(message.getPath()); + } + + private boolean isSignalKeyEncrypted(WebSocketRequestMessage message) { + List headers = message.getHeadersList(); + + if (headers == null || headers.isEmpty()) { + return true; + } + + for (String header : headers) { + String[] parts = header.split(":"); + + if (parts.length == 2 && parts[0] != null && parts[0].trim().equalsIgnoreCase("X-Signal-Key")) { + if (parts[1] != null && parts[1].trim().equalsIgnoreCase("false")) { + return false; + } + } + } + + return true; + } + + private WebSocketResponseMessage createWebSocketResponse(WebSocketRequestMessage request) { + if (isSignalServiceEnvelope(request)) { + return WebSocketResponseMessage.newBuilder() + .setId(request.getId()) + .setStatus(200) + .setMessage("OK") + .build(); + } else { + return WebSocketResponseMessage.newBuilder() + .setId(request.getId()) + .setStatus(400) + .setMessage("Unknown") + .build(); + } + } + + /** + * For receiving a callback when a new message has been + * received. + */ + public static interface MessagePipeCallback { + public void onMessage(SignalServiceEnvelope envelope); + } + + private static class NullMessagePipeCallback implements MessagePipeCallback { + @Override + public void onMessage(SignalServiceEnvelope envelope) {} + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/SignalServiceMessageReceiver.java b/libsignal/src/main/java/org/session/libsignal/service/api/SignalServiceMessageReceiver.java new file mode 100644 index 000000000..7e23798e8 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/SignalServiceMessageReceiver.java @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api; + +import org.session.libsignal.libsignal.InvalidMessageException; +import org.session.libsignal.libsignal.util.guava.Optional; +import org.session.libsignal.service.api.crypto.AttachmentCipherInputStream; +import org.session.libsignal.service.api.crypto.ProfileCipherInputStream; +import org.session.libsignal.service.api.crypto.UnidentifiedAccess; +import org.session.libsignal.service.api.messages.SignalServiceAttachment.ProgressListener; +import org.session.libsignal.service.api.messages.SignalServiceAttachmentPointer; +import org.session.libsignal.service.api.messages.SignalServiceDataMessage; +import org.session.libsignal.service.api.messages.SignalServiceEnvelope; +import org.session.libsignal.service.api.messages.SignalServiceStickerManifest; +import org.session.libsignal.service.api.profiles.SignalServiceProfile; +import org.session.libsignal.service.api.push.SignalServiceAddress; +import org.session.libsignal.service.api.util.CredentialsProvider; +import org.session.libsignal.service.api.util.SleepTimer; +import org.session.libsignal.service.api.websocket.ConnectivityListener; +import org.session.libsignal.service.internal.configuration.SignalServiceConfiguration; +import org.session.libsignal.service.internal.push.PushServiceSocket; +import org.session.libsignal.service.internal.push.SignalServiceEnvelopeEntity; +import org.session.libsignal.service.internal.sticker.StickerProtos; +import org.session.libsignal.service.internal.util.StaticCredentialsProvider; +import org.session.libsignal.service.internal.util.Util; +import org.session.libsignal.service.internal.websocket.WebSocketConnection; +import org.session.libsignal.service.loki.utilities.DownloadUtilities; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +/** + * The primary interface for receiving Signal Service messages. + * + * @author Moxie Marlinspike + */ +@SuppressWarnings("OptionalUsedAsFieldOrParameterType") +public class SignalServiceMessageReceiver { + + private final PushServiceSocket socket; + private final SignalServiceConfiguration urls; + private final CredentialsProvider credentialsProvider; + private final String userAgent; + private final ConnectivityListener connectivityListener; + private final SleepTimer sleepTimer; + + /** + * Construct a SignalServiceMessageReceiver. + * + * @param urls The URL of the Signal Service. + * @param user The Signal Service username (eg. phone number). + * @param password The Signal Service user password. + * @param signalingKey The 52 byte signaling key assigned to this user at registration. + */ + public SignalServiceMessageReceiver(SignalServiceConfiguration urls, + String user, String password, + String signalingKey, String userAgent, + ConnectivityListener listener, + SleepTimer timer) + { + this(urls, new StaticCredentialsProvider(user, password, signalingKey), userAgent, listener, timer); + } + + /** + * Construct a SignalServiceMessageReceiver. + * + * @param urls The URL of the Signal Service. + * @param credentials The Signal Service user's credentials. + */ + public SignalServiceMessageReceiver(SignalServiceConfiguration urls, + CredentialsProvider credentials, + String userAgent, + ConnectivityListener listener, + SleepTimer timer) + { + this.urls = urls; + this.credentialsProvider = credentials; + this.socket = new PushServiceSocket(urls, credentials, userAgent); + this.userAgent = userAgent; + this.connectivityListener = listener; + this.sleepTimer = timer; + } + + /** + * Retrieves a SignalServiceAttachment. + * + * @param pointer The {@link SignalServiceAttachmentPointer} + * received in a {@link SignalServiceDataMessage}. + * @param destination The download destination for this attachment. + * + * @return An InputStream that streams the plaintext attachment contents. + * @throws IOException + * @throws InvalidMessageException + */ + public InputStream retrieveAttachment(SignalServiceAttachmentPointer pointer, File destination, int maxSizeBytes) + throws IOException, InvalidMessageException + { + return retrieveAttachment(pointer, destination, maxSizeBytes, null); + } + + public SignalServiceProfile retrieveProfile(SignalServiceAddress address, Optional unidentifiedAccess) + throws IOException + { + return socket.retrieveProfile(address, unidentifiedAccess); + } + + public InputStream retrieveProfileAvatar(String path, File destination, byte[] profileKey, int maxSizeBytes) + throws IOException + { + DownloadUtilities.INSTANCE.downloadFile(destination, path, maxSizeBytes, null); + return new ProfileCipherInputStream(new FileInputStream(destination), profileKey); + } + + /** + * Retrieves a SignalServiceAttachment. + * + * @param pointer The {@link SignalServiceAttachmentPointer} + * received in a {@link SignalServiceDataMessage}. + * @param destination The download destination for this attachment. + * @param listener An optional listener (may be null) to receive callbacks on download progress. + * + * @return An InputStream that streams the plaintext attachment contents. + * @throws IOException + * @throws InvalidMessageException + */ + public InputStream retrieveAttachment(SignalServiceAttachmentPointer pointer, File destination, int maxSizeBytes, ProgressListener listener) + throws IOException, InvalidMessageException + { + // Loki - Fetch attachment + if (pointer.getUrl().isEmpty()) throw new InvalidMessageException("Missing attachment URL."); + DownloadUtilities.INSTANCE.downloadFile(destination, pointer.getUrl(), maxSizeBytes, listener); + + // Loki - Assume we're retrieving an attachment for an open group server if the digest is not set + if (!pointer.getDigest().isPresent()) { return new FileInputStream(destination); } + + return AttachmentCipherInputStream.createForAttachment(destination, pointer.getSize().or(0), pointer.getKey(), pointer.getDigest().get()); + } + + public InputStream retrieveSticker(byte[] packId, byte[] packKey, int stickerId) + throws IOException, InvalidMessageException + { + byte[] data = socket.retrieveSticker(packId, stickerId); + return AttachmentCipherInputStream.createForStickerData(data, packKey); + } + + /** + * Retrieves a {@link SignalServiceStickerManifest}. + * + * @param packId The 16-byte packId that identifies the sticker pack. + * @param packKey The 32-byte packKey that decrypts the sticker pack. + * @return The {@link SignalServiceStickerManifest} representing the sticker pack. + * @throws IOException + * @throws InvalidMessageException + */ + public SignalServiceStickerManifest retrieveStickerManifest(byte[] packId, byte[] packKey) + throws IOException, InvalidMessageException + { + byte[] manifestBytes = socket.retrieveStickerManifest(packId); + + InputStream cipherStream = AttachmentCipherInputStream.createForStickerData(manifestBytes, packKey); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + + Util.copy(cipherStream, outputStream); + + StickerProtos.Pack pack = StickerProtos.Pack.parseFrom(outputStream.toByteArray()); + List stickers = new ArrayList(pack.getStickersCount()); + SignalServiceStickerManifest.StickerInfo cover = pack.hasCover() ? new SignalServiceStickerManifest.StickerInfo(pack.getCover().getId(), pack.getCover().getEmoji()) + : null; + + for (StickerProtos.Pack.Sticker sticker : pack.getStickersList()) { + stickers.add(new SignalServiceStickerManifest.StickerInfo(sticker.getId(), sticker.getEmoji())); + } + + return new SignalServiceStickerManifest(pack.getTitle(), pack.getAuthor(), cover, stickers); + } + + /** + * Creates a pipe for receiving SignalService messages. + * + * Callers must call {@link SignalServiceMessagePipe#shutdown()} when finished with the pipe. + * + * @return A SignalServiceMessagePipe for receiving Signal Service messages. + */ + public SignalServiceMessagePipe createMessagePipe() { + WebSocketConnection webSocket = new WebSocketConnection(urls.getSignalServiceUrls()[0].getUrl(), + urls.getSignalServiceUrls()[0].getTrustStore(), + Optional.of(credentialsProvider), userAgent, connectivityListener, + sleepTimer); + + return new SignalServiceMessagePipe(webSocket, Optional.of(credentialsProvider)); + } + + public SignalServiceMessagePipe createUnidentifiedMessagePipe() { + WebSocketConnection webSocket = new WebSocketConnection(urls.getSignalServiceUrls()[0].getUrl(), + urls.getSignalServiceUrls()[0].getTrustStore(), + Optional.absent(), userAgent, connectivityListener, + sleepTimer); + + return new SignalServiceMessagePipe(webSocket, Optional.of(credentialsProvider)); + } + + public List retrieveMessages() throws IOException { + return retrieveMessages(new NullMessageReceivedCallback()); + } + + public List retrieveMessages(MessageReceivedCallback callback) + throws IOException + { + List results = new LinkedList(); + List entities = socket.getMessages(); + + for (SignalServiceEnvelopeEntity entity : entities) { + SignalServiceEnvelope envelope; + + if (entity.getSource() != null && entity.getSourceDevice() > 0) { + envelope = new SignalServiceEnvelope(entity.getType(), entity.getSource(), + entity.getSourceDevice(), entity.getTimestamp(), + entity.getMessage(), entity.getContent(), + entity.getServerTimestamp(), entity.getServerUuid()); + } else { + envelope = new SignalServiceEnvelope(entity.getType(), entity.getTimestamp(), + entity.getMessage(), entity.getContent(), + entity.getServerTimestamp(), entity.getServerUuid()); + } + + callback.onMessage(envelope); + results.add(envelope); + + if (envelope.hasUuid()) socket.acknowledgeMessage(envelope.getUuid()); + else socket.acknowledgeMessage(entity.getSource(), entity.getTimestamp()); + } + + return results; + } + + + public interface MessageReceivedCallback { + public void onMessage(SignalServiceEnvelope envelope); + } + + public static class NullMessageReceivedCallback implements MessageReceivedCallback { + @Override + public void onMessage(SignalServiceEnvelope envelope) {} + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/SignalServiceMessageSender.java b/libsignal/src/main/java/org/session/libsignal/service/api/SignalServiceMessageSender.java new file mode 100644 index 000000000..ab998c840 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/SignalServiceMessageSender.java @@ -0,0 +1,1492 @@ +/* + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.service.api; + +import com.google.protobuf.ByteString; +import com.google.protobuf.InvalidProtocolBufferException; + +import org.jetbrains.annotations.Nullable; +import org.session.libsignal.metadata.SealedSessionCipher; +import org.session.libsignal.libsignal.InvalidKeyException; +import org.session.libsignal.libsignal.SessionBuilder; +import org.session.libsignal.libsignal.SignalProtocolAddress; +import org.session.libsignal.libsignal.logging.Log; +import org.session.libsignal.libsignal.loki.FallbackMessage; +import org.session.libsignal.libsignal.loki.FallbackSessionCipher; +import org.session.libsignal.libsignal.loki.SessionResetProtocol; +import org.session.libsignal.libsignal.state.PreKeyBundle; +import org.session.libsignal.libsignal.state.SignalProtocolStore; +import org.session.libsignal.libsignal.util.guava.Optional; +import org.session.libsignal.service.api.crypto.AttachmentCipherOutputStream; +import org.session.libsignal.service.api.crypto.SignalServiceCipher; +import org.session.libsignal.service.api.crypto.UnidentifiedAccess; +import org.session.libsignal.service.api.crypto.UnidentifiedAccessPair; +import org.session.libsignal.service.api.crypto.UntrustedIdentityException; +import org.session.libsignal.service.api.messages.SendMessageResult; +import org.session.libsignal.service.api.messages.SignalServiceAttachment; +import org.session.libsignal.service.api.messages.SignalServiceAttachmentPointer; +import org.session.libsignal.service.api.messages.SignalServiceAttachmentStream; +import org.session.libsignal.service.api.messages.SignalServiceDataMessage; +import org.session.libsignal.service.api.messages.SignalServiceGroup; +import org.session.libsignal.service.api.messages.SignalServiceReceiptMessage; +import org.session.libsignal.service.api.messages.SignalServiceTypingMessage; +import org.session.libsignal.service.api.messages.calls.AnswerMessage; +import org.session.libsignal.service.api.messages.calls.IceUpdateMessage; +import org.session.libsignal.service.api.messages.calls.OfferMessage; +import org.session.libsignal.service.api.messages.calls.SignalServiceCallMessage; +import org.session.libsignal.service.api.messages.multidevice.BlockedListMessage; +import org.session.libsignal.service.api.messages.multidevice.ConfigurationMessage; +import org.session.libsignal.service.api.messages.multidevice.ReadMessage; +import org.session.libsignal.service.api.messages.multidevice.SentTranscriptMessage; +import org.session.libsignal.service.api.messages.multidevice.SignalServiceSyncMessage; +import org.session.libsignal.service.api.messages.multidevice.StickerPackOperationMessage; +import org.session.libsignal.service.api.messages.multidevice.VerifiedMessage; +import org.session.libsignal.service.api.messages.shared.SharedContact; +import org.session.libsignal.service.api.push.SignalServiceAddress; +import org.session.libsignal.service.api.push.exceptions.PushNetworkException; +import org.session.libsignal.service.api.push.exceptions.UnregisteredUserException; +import org.session.libsignal.service.api.util.CredentialsProvider; +import org.session.libsignal.service.internal.configuration.SignalServiceConfiguration; +import org.session.libsignal.service.internal.crypto.PaddingInputStream; +import org.session.libsignal.service.internal.push.OutgoingPushMessage; +import org.session.libsignal.service.internal.push.OutgoingPushMessageList; +import org.session.libsignal.service.internal.push.PushAttachmentData; +import org.session.libsignal.service.internal.push.PushServiceSocket; +import org.session.libsignal.service.internal.push.PushTransportDetails; +import org.session.libsignal.service.internal.push.SignalServiceProtos; +import org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer; +import org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage; +import org.session.libsignal.service.internal.push.SignalServiceProtos.Content; +import org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage; +import org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext; +import org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile; +import org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage; +import org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage; +import org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage; +import org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage; +import org.session.libsignal.service.internal.push.http.AttachmentCipherOutputStreamFactory; +import org.session.libsignal.service.internal.push.http.OutputStreamFactory; +import org.session.libsignal.service.internal.util.Base64; +import org.session.libsignal.service.internal.util.StaticCredentialsProvider; +import org.session.libsignal.service.internal.util.Util; +import org.session.libsignal.service.internal.util.concurrent.SettableFuture; +import org.session.libsignal.service.loki.api.LokiDotNetAPI; +import org.session.libsignal.service.loki.api.PushNotificationAPI; +import org.session.libsignal.service.loki.api.SignalMessageInfo; +import org.session.libsignal.service.loki.api.SnodeAPI; +import org.session.libsignal.service.loki.api.fileserver.FileServerAPI; +import org.session.libsignal.service.loki.api.opengroups.PublicChat; +import org.session.libsignal.service.loki.api.opengroups.PublicChatAPI; +import org.session.libsignal.service.loki.api.opengroups.PublicChatMessage; +import org.session.libsignal.service.loki.database.LokiAPIDatabaseProtocol; +import org.session.libsignal.service.loki.database.LokiMessageDatabaseProtocol; +import org.session.libsignal.service.loki.database.LokiOpenGroupDatabaseProtocol; +import org.session.libsignal.service.loki.database.LokiPreKeyBundleDatabaseProtocol; +import org.session.libsignal.service.loki.database.LokiThreadDatabaseProtocol; +import org.session.libsignal.service.loki.database.LokiUserDatabaseProtocol; +import org.session.libsignal.service.loki.protocol.closedgroups.SharedSenderKeysDatabaseProtocol; +import org.session.libsignal.service.loki.protocol.meta.TTLUtilities; +import org.session.libsignal.service.loki.protocol.sessionmanagement.SessionManagementProtocol; +import org.session.libsignal.service.loki.protocol.shelved.multidevice.DeviceLink; +import org.session.libsignal.service.loki.protocol.shelved.multidevice.MultiDeviceProtocol; +import org.session.libsignal.service.loki.protocol.shelved.syncmessages.SyncMessagesProtocol; +import org.session.libsignal.service.loki.utilities.Broadcaster; +import org.session.libsignal.service.loki.utilities.PlaintextOutputStreamFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.security.SecureRandom; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; + +import kotlin.Unit; +import kotlin.jvm.functions.Function1; +import nl.komponents.kovenant.Promise; + +import static org.session.libsignal.libsignal.SessionCipher.SESSION_LOCK; + +/** + * The main interface for sending Signal Service messages. + * + * @author Moxie Marlinspike + */ +public class SignalServiceMessageSender { + + private static final String TAG = SignalServiceMessageSender.class.getSimpleName(); + + private final PushServiceSocket socket; + private final SignalProtocolStore store; + private final SignalServiceAddress localAddress; + private final Optional eventListener; + + private final AtomicReference> pipe; + private final AtomicReference> unidentifiedPipe; + private final AtomicBoolean isMultiDevice; + + // Loki + private final String userPublicKey; + private final LokiAPIDatabaseProtocol apiDatabase; + private final SharedSenderKeysDatabaseProtocol sskDatabase; + private final LokiThreadDatabaseProtocol threadDatabase; + private final LokiMessageDatabaseProtocol messageDatabase; + private final LokiPreKeyBundleDatabaseProtocol preKeyBundleDatabase; + private final SessionResetProtocol sessionResetImpl; + private final LokiUserDatabaseProtocol userDatabase; + private final LokiOpenGroupDatabaseProtocol openGroupDatabase; + private final Broadcaster broadcaster; + + /** + * Construct a SignalServiceMessageSender. + * + * @param urls The URL of the Signal Service. + * @param user The Signal Service username (eg phone number). + * @param password The Signal Service user password. + * @param store The SignalProtocolStore. + * @param eventListener An optional event listener, which fires whenever sessions are + * setup or torn down for a recipient. + */ + public SignalServiceMessageSender(SignalServiceConfiguration urls, + String user, String password, + SignalProtocolStore store, + String userAgent, + boolean isMultiDevice, + Optional pipe, + Optional unidentifiedPipe, + Optional eventListener, + String userPublicKey, + LokiAPIDatabaseProtocol apiDatabase, + SharedSenderKeysDatabaseProtocol sskDatabase, + LokiThreadDatabaseProtocol threadDatabase, + LokiMessageDatabaseProtocol messageDatabase, + LokiPreKeyBundleDatabaseProtocol preKeyBundleDatabase, + SessionResetProtocol sessionResetImpl, + LokiUserDatabaseProtocol userDatabase, + LokiOpenGroupDatabaseProtocol openGroupDatabase, + Broadcaster broadcaster) + { + this(urls, new StaticCredentialsProvider(user, password, null), store, userAgent, isMultiDevice, pipe, unidentifiedPipe, eventListener, userPublicKey, apiDatabase, sskDatabase, threadDatabase, messageDatabase, preKeyBundleDatabase, sessionResetImpl, userDatabase, openGroupDatabase, broadcaster); + } + + public SignalServiceMessageSender(SignalServiceConfiguration urls, + CredentialsProvider credentialsProvider, + SignalProtocolStore store, + String userAgent, + boolean isMultiDevice, + Optional pipe, + Optional unidentifiedPipe, + Optional eventListener, + String userPublicKey, + LokiAPIDatabaseProtocol apiDatabase, + SharedSenderKeysDatabaseProtocol sskDatabase, + LokiThreadDatabaseProtocol threadDatabase, + LokiMessageDatabaseProtocol messageDatabase, + LokiPreKeyBundleDatabaseProtocol preKeyBundleDatabase, + SessionResetProtocol sessionResetImpl, + LokiUserDatabaseProtocol userDatabase, + LokiOpenGroupDatabaseProtocol openGroupDatabase, + Broadcaster broadcaster) + { + this.socket = new PushServiceSocket(urls, credentialsProvider, userAgent); + this.store = store; + this.localAddress = new SignalServiceAddress(credentialsProvider.getUser()); + this.pipe = new AtomicReference<>(pipe); + this.unidentifiedPipe = new AtomicReference<>(unidentifiedPipe); + this.isMultiDevice = new AtomicBoolean(isMultiDevice); + this.eventListener = eventListener; + this.userPublicKey = userPublicKey; + this.apiDatabase = apiDatabase; + this.sskDatabase = sskDatabase; + this.threadDatabase = threadDatabase; + this.messageDatabase = messageDatabase; + this.preKeyBundleDatabase = preKeyBundleDatabase; + this.sessionResetImpl = sessionResetImpl; + this.userDatabase = userDatabase; + this.openGroupDatabase = openGroupDatabase; + this.broadcaster = broadcaster; + } + + /** + * Send a read receipt for a received message. + * + * @param recipient The sender of the received message you're acknowledging. + * @param message The read receipt to deliver. + * @throws IOException + * @throws UntrustedIdentityException + */ + public void sendReceipt(SignalServiceAddress recipient, + Optional unidentifiedAccess, + SignalServiceReceiptMessage message) + throws IOException, UntrustedIdentityException + { + byte[] content = createReceiptContent(message); + boolean useFallbackEncryption = SessionManagementProtocol.shared.shouldMessageUseFallbackEncryption(message, recipient.getNumber(), store); + sendMessage(recipient, getTargetUnidentifiedAccess(unidentifiedAccess), message.getWhen(), content, false, message.getTTL(), useFallbackEncryption, false); + } + + /** + * Send a typing indicator. + * + * @param recipient The destination + * @param message The typing indicator to deliver + * @throws IOException + * @throws UntrustedIdentityException + */ + public void sendTyping(SignalServiceAddress recipient, + Optional unidentifiedAccess, + SignalServiceTypingMessage message) + throws IOException, UntrustedIdentityException + { + byte[] content = createTypingContent(message); + boolean useFallbackEncryption = SessionManagementProtocol.shared.shouldMessageUseFallbackEncryption(message, recipient.getNumber(), store); + sendMessage(recipient, getTargetUnidentifiedAccess(unidentifiedAccess), message.getTimestamp(), content, true, message.getTTL(), useFallbackEncryption, false); + } + + public void sendTyping(List recipients, + List> unidentifiedAccess, + SignalServiceTypingMessage message) + throws IOException + { + byte[] content = createTypingContent(message); + sendMessage(0, recipients, getTargetUnidentifiedAccess(unidentifiedAccess), message.getTimestamp(), content, true, message.getTTL(), false, false); + } + + /** + * Send a call setup message to a single recipient. + * + * @param recipient The message's destination. + * @param message The call message. + * @throws IOException + */ + public void sendCallMessage(SignalServiceAddress recipient, + Optional unidentifiedAccess, + SignalServiceCallMessage message) + throws IOException, UntrustedIdentityException + { + byte[] content = createCallContent(message); + boolean useFallbackEncryption = SessionManagementProtocol.shared.shouldMessageUseFallbackEncryption(message, recipient.getNumber(), store); + sendMessage(recipient, getTargetUnidentifiedAccess(unidentifiedAccess), System.currentTimeMillis(), content, false, message.getTTL(), useFallbackEncryption, false); + } + + /** + * Send a message to a single recipient. + * + * @param recipient The message's destination. + * @param message The message. + * @throws UntrustedIdentityException + * @throws IOException + */ + public SendMessageResult sendMessage(long messageID, + SignalServiceAddress recipient, + Optional unidentifiedAccess, + SignalServiceDataMessage message) + throws UntrustedIdentityException, IOException + { + byte[] content = createMessageContent(message, recipient); + long timestamp = message.getTimestamp(); + boolean useFallbackEncryption = SessionManagementProtocol.shared.shouldMessageUseFallbackEncryption(message, recipient.getNumber(), store); + boolean isClosedGroup = message.group.isPresent() && message.group.get().getGroupType() == SignalServiceGroup.GroupType.SIGNAL; + SendMessageResult result = sendMessage(messageID, recipient, getTargetUnidentifiedAccess(unidentifiedAccess), timestamp, content, false, message.getTTL(), message.getDeviceLink().isPresent(), useFallbackEncryption, isClosedGroup, false, message.hasVisibleContent()); + + // Loki - This shouldn't get invoked for note to self + boolean wouldSignalSendSyncMessage = (result.getSuccess() != null && result.getSuccess().isNeedsSync()) || unidentifiedAccess.isPresent(); + if (wouldSignalSendSyncMessage && SyncMessagesProtocol.shared.shouldSyncMessage(message)) { + byte[] syncMessage = createMultiDeviceSentTranscriptContent(content, Optional.of(recipient), timestamp, Collections.singletonList(result)); + // Loki - Customize multi device logic + Set linkedDevices = MultiDeviceProtocol.shared.getAllLinkedDevices(userPublicKey); + for (String device : linkedDevices) { + SignalServiceAddress deviceAsAddress = new SignalServiceAddress(device); + boolean useFallbackEncryptionForSyncMessage = SessionManagementProtocol.shared.shouldMessageUseFallbackEncryption(syncMessage, device, store); + sendMessage(deviceAsAddress, Optional.absent(), timestamp, syncMessage, false, message.getTTL(), useFallbackEncryptionForSyncMessage, true); + } + } + + // Loki - Start a session reset if needed + if (message.isEndSession()) { + SessionManagementProtocol.shared.setSessionResetStatusToInProgressIfNeeded(recipient, eventListener); + } + + return result; + } + + /** + * Send a message to a group. + * + * @param recipients The group members. + * @param message The group message. + * @throws IOException + */ + public List sendMessage(long messageID, + List recipients, + List> unidentifiedAccess, + SignalServiceDataMessage message) + throws IOException, UntrustedIdentityException + { + // Loki - We only need the first recipient in the line below. This is because the recipient is only used to determine + // whether an attachment is being sent to an open group or not. + byte[] content = createMessageContent(message, recipients.get(0)); + long timestamp = message.getTimestamp(); + boolean isClosedGroup = message.group.isPresent() && message.group.get().getGroupType() == SignalServiceGroup.GroupType.SIGNAL; + List results = sendMessage(messageID, recipients, getTargetUnidentifiedAccess(unidentifiedAccess), timestamp, content, false, message.getTTL(), isClosedGroup, message.hasVisibleContent()); + boolean needsSyncInResults = false; + + for (SendMessageResult result : results) { + if (result.getSuccess() != null && result.getSuccess().isNeedsSync()) { + needsSyncInResults = true; + break; + } + } + + // Loki - This shouldn't get invoked for note to self + if (needsSyncInResults && SyncMessagesProtocol.shared.shouldSyncMessage(message)) { + byte[] syncMessage = createMultiDeviceSentTranscriptContent(content, Optional.absent(), timestamp, results); + // Loki - Customize multi device logic + Set linkedDevices = MultiDeviceProtocol.shared.getAllLinkedDevices(userPublicKey); + for (String device : linkedDevices) { + SignalServiceAddress deviceAsAddress = new SignalServiceAddress(device); + boolean useFallbackEncryption = SessionManagementProtocol.shared.shouldMessageUseFallbackEncryption(syncMessage, device, store); + sendMessage(deviceAsAddress, Optional.absent(), timestamp, syncMessage, false, message.getTTL(), useFallbackEncryption, true); + } + } + + return results; + } + + public void sendMessage(SignalServiceSyncMessage message, Optional unidentifiedAccess) + throws IOException, UntrustedIdentityException + { + byte[] content; + long timestamp = System.currentTimeMillis(); + + if (message.getContacts().isPresent()) { + content = createMultiDeviceContactsContent(message.getContacts().get().getContactsStream().asStream(), message.getContacts().get().isComplete()); + } else if (message.getGroups().isPresent()) { + content = createMultiDeviceGroupsContent(message.getGroups().get().asStream()); + } else if (message.getOpenGroups().isPresent()) { + content = createMultiDeviceOpenGroupsContent(message.getOpenGroups().get()); + } else if (message.getRead().isPresent()) { + content = createMultiDeviceReadContent(message.getRead().get()); + } else if (message.getBlockedList().isPresent()) { + content = createMultiDeviceBlockedContent(message.getBlockedList().get()); + } else if (message.getConfiguration().isPresent()) { + content = createMultiDeviceConfigurationContent(message.getConfiguration().get()); + } else if (message.getSent().isPresent()) { + content = createMultiDeviceSentTranscriptContent(message.getSent().get(), unidentifiedAccess); + timestamp = message.getSent().get().getTimestamp(); + } else if (message.getStickerPackOperations().isPresent()) { + content = createMultiDeviceStickerPackOperationContent(message.getStickerPackOperations().get()); + } else if (message.getVerified().isPresent()) { + sendMessage(message.getVerified().get(), unidentifiedAccess); + return; + } else { + throw new IOException("Unsupported sync message!"); + } + + // Loki - Customize multi device logic + Set linkedDevices = MultiDeviceProtocol.shared.getAllLinkedDevices(userPublicKey); + for (String device : linkedDevices) { + SignalServiceAddress deviceAsAddress = new SignalServiceAddress(device); + boolean useFallbackEncryption = SessionManagementProtocol.shared.shouldMessageUseFallbackEncryption(message, device, store); + sendMessageToPrivateChat(0, deviceAsAddress, Optional.absent(), timestamp, content, false, message.getTTL(), useFallbackEncryption, false, false); + } + } + + public void setSoTimeoutMillis(long soTimeoutMillis) { + socket.setSoTimeoutMillis(soTimeoutMillis); + } + + public void cancelInFlightRequests() { + socket.cancelInFlightRequests(); + } + + public void setMessagePipe(SignalServiceMessagePipe pipe, SignalServiceMessagePipe unidentifiedPipe) { + this.pipe.set(Optional.fromNullable(pipe)); + this.unidentifiedPipe.set(Optional.fromNullable(unidentifiedPipe)); + } + + public void setIsMultiDevice(boolean isMultiDevice) { + this.isMultiDevice.set(isMultiDevice); + } + + public SignalServiceAttachmentPointer uploadAttachment(SignalServiceAttachmentStream attachment, boolean usePadding, @Nullable SignalServiceAddress recipient) + throws IOException + { + boolean shouldEncrypt = true; + String server = FileServerAPI.shared.getServer(); + + // Loki - Check if we are sending to an open group + if (recipient != null) { + long threadID = threadDatabase.getThreadID(recipient.getNumber()); + PublicChat publicChat = threadDatabase.getPublicChat(threadID); + if (publicChat != null) { + shouldEncrypt = false; + server = publicChat.getServer(); + } + } + + byte[] attachmentKey = Util.getSecretBytes(64); + long paddedLength = usePadding ? PaddingInputStream.getPaddedSize(attachment.getLength()) : attachment.getLength(); + InputStream dataStream = usePadding ? new PaddingInputStream(attachment.getInputStream(), attachment.getLength()) : attachment.getInputStream(); + long ciphertextLength = shouldEncrypt ? AttachmentCipherOutputStream.getCiphertextLength(paddedLength) : attachment.getLength(); + + OutputStreamFactory outputStreamFactory = shouldEncrypt ? new AttachmentCipherOutputStreamFactory(attachmentKey) : new PlaintextOutputStreamFactory(); + PushAttachmentData attachmentData = new PushAttachmentData(attachment.getContentType(), dataStream, ciphertextLength, outputStreamFactory, attachment.getListener()); + + // Loki - Upload attachment + LokiDotNetAPI.UploadResult result = FileServerAPI.shared.uploadAttachment(server, attachmentData); + return new SignalServiceAttachmentPointer(result.getId(), + attachment.getContentType(), + attachmentKey, + Optional.of(Util.toIntExact(attachment.getLength())), + attachment.getPreview(), + attachment.getWidth(), attachment.getHeight(), + Optional.fromNullable(result.getDigest()), + attachment.getFileName(), + attachment.getVoiceNote(), + attachment.getCaption(), + result.getUrl()); + } + + private void sendMessage(VerifiedMessage message, Optional unidentifiedAccess) + throws IOException, UntrustedIdentityException + { + + } + + private byte[] createTypingContent(SignalServiceTypingMessage message) { + Content.Builder container = Content.newBuilder(); + TypingMessage.Builder builder = TypingMessage.newBuilder(); + + builder.setTimestamp(message.getTimestamp()); + + if (message.isTypingStarted()) builder.setAction(TypingMessage.Action.STARTED); + else if (message.isTypingStopped()) builder.setAction(TypingMessage.Action.STOPPED); + else throw new IllegalArgumentException("Unknown typing indicator"); + + if (message.getGroupId().isPresent()) { + builder.setGroupId(ByteString.copyFrom(message.getGroupId().get())); + } + + return container.setTypingMessage(builder).build().toByteArray(); + } + + private byte[] createReceiptContent(SignalServiceReceiptMessage message) { + Content.Builder container = Content.newBuilder(); + ReceiptMessage.Builder builder = ReceiptMessage.newBuilder(); + + for (long timestamp : message.getTimestamps()) { + builder.addTimestamp(timestamp); + } + + if (message.isDeliveryReceipt()) builder.setType(ReceiptMessage.Type.DELIVERY); + else if (message.isReadReceipt()) builder.setType(ReceiptMessage.Type.READ); + + return container.setReceiptMessage(builder).build().toByteArray(); + } + + private byte[] createMessageContent(SignalServiceDataMessage message, SignalServiceAddress recipient) + throws IOException + { + Content.Builder container = Content.newBuilder(); + + if (message.getPreKeyBundle().isPresent()) { + PreKeyBundle preKeyBundle = message.getPreKeyBundle().get(); + PreKeyBundleMessage.Builder preKeyBundleMessageBuilder = PreKeyBundleMessage.newBuilder() + .setDeviceId(preKeyBundle.getDeviceId()) + .setIdentityKey(ByteString.copyFrom(preKeyBundle.getIdentityKey().serialize())) + .setPreKeyId(preKeyBundle.getPreKeyId()) + .setPreKey(ByteString.copyFrom(preKeyBundle.getPreKey().serialize())) + .setSignedKeyId(preKeyBundle.getSignedPreKeyId()) + .setSignedKey(ByteString.copyFrom(preKeyBundle.getSignedPreKey().serialize())) + .setSignature(ByteString.copyFrom(preKeyBundle.getSignedPreKeySignature())) + .setIdentityKey(ByteString.copyFrom(preKeyBundle.getIdentityKey().serialize())); + container.setPreKeyBundleMessage(preKeyBundleMessageBuilder); + } + + if (message.getDeviceLink().isPresent()) { + DeviceLink deviceLink = message.getDeviceLink().get(); + SignalServiceProtos.DeviceLinkMessage.Builder deviceLinkMessageBuilder = SignalServiceProtos.DeviceLinkMessage.newBuilder() + .setPrimaryPublicKey(deviceLink.getMasterPublicKey()) + .setSecondaryPublicKey(deviceLink.getSlavePublicKey()) + .setRequestSignature(ByteString.copyFrom(Objects.requireNonNull(deviceLink.getRequestSignature()))); + if (deviceLink.getAuthorizationSignature() != null) { + deviceLinkMessageBuilder.setAuthorizationSignature(ByteString.copyFrom(deviceLink.getAuthorizationSignature())); + } + container.setDeviceLinkMessage(deviceLinkMessageBuilder.build()); + } + + DataMessage.Builder builder = DataMessage.newBuilder(); + List pointers = createAttachmentPointers(message.getAttachments(), recipient); + + if (!pointers.isEmpty()) { + builder.addAllAttachments(pointers); + } + + if (message.getBody().isPresent()) { + builder.setBody(message.getBody().get()); + } + + if (message.getGroupInfo().isPresent()) { + builder.setGroup(createGroupContent(message.getGroupInfo().get(), recipient)); + } + + if (message.isEndSession()) { + builder.setFlags(DataMessage.Flags.END_SESSION_VALUE); + } + + if (message.isExpirationUpdate()) { + builder.setFlags(DataMessage.Flags.EXPIRATION_TIMER_UPDATE_VALUE); + } + + if (message.isProfileKeyUpdate()) { + builder.setFlags(DataMessage.Flags.PROFILE_KEY_UPDATE_VALUE); + } + + if (message.isDeviceUnlinkingRequest()) { + builder.setFlags(DataMessage.Flags.DEVICE_UNLINKING_REQUEST_VALUE); + } + + if (message.getExpiresInSeconds() > 0) { + builder.setExpireTimer(message.getExpiresInSeconds()); + } + + if (message.getProfileKey().isPresent()) { + builder.setProfileKey(ByteString.copyFrom(message.getProfileKey().get())); + } + + if (message.getQuote().isPresent()) { + DataMessage.Quote.Builder quoteBuilder = DataMessage.Quote.newBuilder() + .setId(message.getQuote().get().getId()) + .setAuthor(message.getQuote().get().getAuthor().getNumber()) + .setText(message.getQuote().get().getText()); + + for (SignalServiceDataMessage.Quote.QuotedAttachment attachment : message.getQuote().get().getAttachments()) { + DataMessage.Quote.QuotedAttachment.Builder quotedAttachment = DataMessage.Quote.QuotedAttachment.newBuilder(); + + quotedAttachment.setContentType(attachment.getContentType()); + + if (attachment.getFileName() != null) { + quotedAttachment.setFileName(attachment.getFileName()); + } + + if (attachment.getThumbnail() != null) { + quotedAttachment.setThumbnail(createAttachmentPointer(attachment.getThumbnail().asStream(), recipient)); + } + + quoteBuilder.addAttachments(quotedAttachment); + } + + builder.setQuote(quoteBuilder); + } + + if (message.getSharedContacts().isPresent()) { + builder.addAllContact(createSharedContactContent(message.getSharedContacts().get(), recipient)); + } + + if (message.getPreviews().isPresent()) { + for (SignalServiceDataMessage.Preview preview : message.getPreviews().get()) { + DataMessage.Preview.Builder previewBuilder = DataMessage.Preview.newBuilder(); + previewBuilder.setTitle(preview.getTitle()); + previewBuilder.setUrl(preview.getUrl()); + + if (preview.getImage().isPresent()) { + if (preview.getImage().get().isStream()) { + previewBuilder.setImage(createAttachmentPointer(preview.getImage().get().asStream(), recipient)); + } else { + previewBuilder.setImage(createAttachmentPointer(preview.getImage().get().asPointer())); + } + } + + builder.addPreview(previewBuilder.build()); + } + } + + if (message.getSticker().isPresent()) { + DataMessage.Sticker.Builder stickerBuilder = DataMessage.Sticker.newBuilder(); + + stickerBuilder.setPackId(ByteString.copyFrom(message.getSticker().get().getPackId())); + stickerBuilder.setPackKey(ByteString.copyFrom(message.getSticker().get().getPackKey())); + stickerBuilder.setStickerId(message.getSticker().get().getStickerId()); + + if (message.getSticker().get().getAttachment().isStream()) { + stickerBuilder.setData(createAttachmentPointer(message.getSticker().get().getAttachment().asStream(), true, recipient)); + } else { + stickerBuilder.setData(createAttachmentPointer(message.getSticker().get().getAttachment().asPointer())); + } + + builder.setSticker(stickerBuilder.build()); + } + + LokiUserProfile.Builder lokiUserProfileBuilder = LokiUserProfile.newBuilder(); + String displayName = userDatabase.getDisplayName(userPublicKey); + if (displayName != null) { lokiUserProfileBuilder.setDisplayName(displayName); } + String profilePictureURL = userDatabase.getProfilePictureURL(userPublicKey); + if (profilePictureURL != null) { lokiUserProfileBuilder.setProfilePictureURL(profilePictureURL); } + builder.setProfile(lokiUserProfileBuilder.build()); + + builder.setTimestamp(message.getTimestamp()); + + container.setDataMessage(builder); + + return container.build().toByteArray(); + } + + private byte[] createCallContent(SignalServiceCallMessage callMessage) { + Content.Builder container = Content.newBuilder(); + CallMessage.Builder builder = CallMessage.newBuilder(); + + if (callMessage.getOfferMessage().isPresent()) { + OfferMessage offer = callMessage.getOfferMessage().get(); + builder.setOffer(CallMessage.Offer.newBuilder() + .setId(offer.getId()) + .setDescription(offer.getDescription())); + } else if (callMessage.getAnswerMessage().isPresent()) { + AnswerMessage answer = callMessage.getAnswerMessage().get(); + builder.setAnswer(CallMessage.Answer.newBuilder() + .setId(answer.getId()) + .setDescription(answer.getDescription())); + } else if (callMessage.getIceUpdateMessages().isPresent()) { + List updates = callMessage.getIceUpdateMessages().get(); + + for (IceUpdateMessage update : updates) { + builder.addIceUpdate(CallMessage.IceUpdate.newBuilder() + .setId(update.getId()) + .setSdp(update.getSdp()) + .setSdpMid(update.getSdpMid()) + .setSdpMLineIndex(update.getSdpMLineIndex())); + } + } else if (callMessage.getHangupMessage().isPresent()) { + builder.setHangup(CallMessage.Hangup.newBuilder().setId(callMessage.getHangupMessage().get().getId())); + } else if (callMessage.getBusyMessage().isPresent()) { + builder.setBusy(CallMessage.Busy.newBuilder().setId(callMessage.getBusyMessage().get().getId())); + } + + container.setCallMessage(builder); + return container.build().toByteArray(); + } + + private byte[] createMultiDeviceContactsContent(SignalServiceAttachmentStream contacts, boolean complete) + throws IOException + { + Content.Builder container = Content.newBuilder(); + SyncMessage.Builder builder = createSyncMessageBuilder(); + builder.setContacts(SyncMessage.Contacts.newBuilder() + .setData(ByteString.readFrom(contacts.getInputStream())) + .setComplete(complete)); + + return container.setSyncMessage(builder).build().toByteArray(); + } + + private byte[] createMultiDeviceGroupsContent(SignalServiceAttachmentStream groups) + throws IOException + { + Content.Builder container = Content.newBuilder(); + SyncMessage.Builder builder = createSyncMessageBuilder(); + builder.setGroups(SyncMessage.Groups.newBuilder() + .setData(ByteString.readFrom(groups.getInputStream()))); + + return container.setSyncMessage(builder).build().toByteArray(); + } + + private byte[] createMultiDeviceOpenGroupsContent(List openGroups) + throws IOException + { + Content.Builder container = Content.newBuilder(); + SyncMessage.Builder builder = createSyncMessageBuilder(); + for (PublicChat openGroup : openGroups) { + String url = openGroup.getServer(); + int channel = Long.valueOf(openGroup.getChannel()).intValue(); + SyncMessage.OpenGroupDetails details = SyncMessage.OpenGroupDetails.newBuilder() + .setUrl(url) + .setChannelID(channel) + .build(); + builder.addOpenGroups(details); + } + + return container.setSyncMessage(builder).build().toByteArray(); + } + + private byte[] createMultiDeviceSentTranscriptContent(SentTranscriptMessage transcript, Optional unidentifiedAccess) + throws IOException + { + SignalServiceAddress address = new SignalServiceAddress(transcript.getDestination().get()); + SendMessageResult result = SendMessageResult.success(address, unidentifiedAccess.isPresent(), true); + + return createMultiDeviceSentTranscriptContent(createMessageContent(transcript.getMessage(), address), + Optional.of(address), + transcript.getTimestamp(), + Collections.singletonList(result)); + } + + private byte[] createMultiDeviceSentTranscriptContent(byte[] content, Optional recipient, + long timestamp, List sendMessageResults) + { + try { + Content.Builder container = Content.newBuilder(); + SyncMessage.Builder syncMessage = createSyncMessageBuilder(); + SyncMessage.Sent.Builder sentMessage = SyncMessage.Sent.newBuilder(); + DataMessage dataMessage = Content.parseFrom(content).getDataMessage(); + + sentMessage.setTimestamp(timestamp); + sentMessage.setMessage(dataMessage); + + for (SendMessageResult result : sendMessageResults) { + if (result.getSuccess() != null) { + sentMessage.addUnidentifiedStatus(SyncMessage.Sent.UnidentifiedDeliveryStatus.newBuilder() + .setDestination(result.getAddress().getNumber()) + .setUnidentified(result.getSuccess().isUnidentified())); + } + } + + if (recipient.isPresent()) { + sentMessage.setDestination(recipient.get().getNumber()); + } + + if (dataMessage.getExpireTimer() > 0) { + sentMessage.setExpirationStartTimestamp(System.currentTimeMillis()); + } + + return container.setSyncMessage(syncMessage.setSent(sentMessage)).build().toByteArray(); + } catch (InvalidProtocolBufferException e) { + throw new AssertionError(e); + } + } + + private byte[] createMultiDeviceReadContent(List readMessages) { + Content.Builder container = Content.newBuilder(); + SyncMessage.Builder builder = createSyncMessageBuilder(); + + for (ReadMessage readMessage : readMessages) { + builder.addRead(SyncMessage.Read.newBuilder() + .setTimestamp(readMessage.getTimestamp()) + .setSender(readMessage.getSender())); + } + + return container.setSyncMessage(builder).build().toByteArray(); + } + + private byte[] createMultiDeviceBlockedContent(BlockedListMessage blocked) { + Content.Builder container = Content.newBuilder(); + SyncMessage.Builder syncMessage = createSyncMessageBuilder(); + SyncMessage.Blocked.Builder blockedMessage = SyncMessage.Blocked.newBuilder(); + + blockedMessage.addAllNumbers(blocked.getNumbers()); + + for (byte[] groupId : blocked.getGroupIds()) { + blockedMessage.addGroupIds(ByteString.copyFrom(groupId)); + } + + return container.setSyncMessage(syncMessage.setBlocked(blockedMessage)).build().toByteArray(); + } + + private byte[] createMultiDeviceConfigurationContent(ConfigurationMessage configuration) { + Content.Builder container = Content.newBuilder(); + SyncMessage.Builder syncMessage = createSyncMessageBuilder(); + SyncMessage.Configuration.Builder configurationMessage = SyncMessage.Configuration.newBuilder(); + + if (configuration.getReadReceipts().isPresent()) { + configurationMessage.setReadReceipts(configuration.getReadReceipts().get()); + } + + if (configuration.getUnidentifiedDeliveryIndicators().isPresent()) { + configurationMessage.setUnidentifiedDeliveryIndicators(configuration.getUnidentifiedDeliveryIndicators().get()); + } + + if (configuration.getTypingIndicators().isPresent()) { + configurationMessage.setTypingIndicators(configuration.getTypingIndicators().get()); + } + + if (configuration.getLinkPreviews().isPresent()) { + configurationMessage.setLinkPreviews(configuration.getLinkPreviews().get()); + } + + return container.setSyncMessage(syncMessage.setConfiguration(configurationMessage)).build().toByteArray(); + } + + private byte[] createMultiDeviceStickerPackOperationContent(List stickerPackOperations) { + Content.Builder container = Content.newBuilder(); + SyncMessage.Builder syncMessage = createSyncMessageBuilder(); + + for (StickerPackOperationMessage stickerPackOperation : stickerPackOperations) { + SyncMessage.StickerPackOperation.Builder builder = SyncMessage.StickerPackOperation.newBuilder(); + + if (stickerPackOperation.getPackId().isPresent()) { + builder.setPackId(ByteString.copyFrom(stickerPackOperation.getPackId().get())); + } + + if (stickerPackOperation.getPackKey().isPresent()) { + builder.setPackKey(ByteString.copyFrom(stickerPackOperation.getPackKey().get())); + } + + if (stickerPackOperation.getType().isPresent()) { + switch (stickerPackOperation.getType().get()) { + case INSTALL: builder.setType(SyncMessage.StickerPackOperation.Type.INSTALL); break; + case REMOVE: builder.setType(SyncMessage.StickerPackOperation.Type.REMOVE); break; + } + } + + syncMessage.addStickerPackOperation(builder); + } + + return container.setSyncMessage(syncMessage).build().toByteArray(); + } + + private SyncMessage.Builder createSyncMessageBuilder() { + SecureRandom random = new SecureRandom(); + byte[] padding = Util.getRandomLengthBytes(512); + random.nextBytes(padding); + + SyncMessage.Builder builder = SyncMessage.newBuilder(); + builder.setPadding(ByteString.copyFrom(padding)); + + return builder; + } + + private GroupContext createGroupContent(SignalServiceGroup group, SignalServiceAddress recipient) + throws IOException + { + GroupContext.Builder builder = GroupContext.newBuilder(); + builder.setId(ByteString.copyFrom(group.getGroupId())); + + if (group.getType() != SignalServiceGroup.Type.DELIVER) { + if (group.getType() == SignalServiceGroup.Type.UPDATE) builder.setType(GroupContext.Type.UPDATE); + else if (group.getType() == SignalServiceGroup.Type.QUIT) builder.setType(GroupContext.Type.QUIT); + else if (group.getType() == SignalServiceGroup.Type.REQUEST_INFO) builder.setType(GroupContext.Type.REQUEST_INFO); + else throw new AssertionError("Unknown type: " + group.getType()); + + if (group.getName().isPresent()) builder.setName(group.getName().get()); + if (group.getMembers().isPresent()) builder.addAllMembers(group.getMembers().get()); + if (group.getAdmins().isPresent()) builder.addAllAdmins(group.getAdmins().get()); + + if (group.getAvatar().isPresent()) { + if (group.getAvatar().get().isStream()) { + builder.setAvatar(createAttachmentPointer(group.getAvatar().get().asStream(), recipient)); + } else { + builder.setAvatar(createAttachmentPointer(group.getAvatar().get().asPointer())); + } + } + } else { + builder.setType(GroupContext.Type.DELIVER); + } + + return builder.build(); + } + + private List createSharedContactContent(List contacts, SignalServiceAddress recipient) + throws IOException + { + List results = new LinkedList<>(); + + for (SharedContact contact : contacts) { + DataMessage.Contact.Name.Builder nameBuilder = DataMessage.Contact.Name.newBuilder(); + + if (contact.getName().getFamily().isPresent()) nameBuilder.setFamilyName(contact.getName().getFamily().get()); + if (contact.getName().getGiven().isPresent()) nameBuilder.setGivenName(contact.getName().getGiven().get()); + if (contact.getName().getMiddle().isPresent()) nameBuilder.setMiddleName(contact.getName().getMiddle().get()); + if (contact.getName().getPrefix().isPresent()) nameBuilder.setPrefix(contact.getName().getPrefix().get()); + if (contact.getName().getSuffix().isPresent()) nameBuilder.setSuffix(contact.getName().getSuffix().get()); + if (contact.getName().getDisplay().isPresent()) nameBuilder.setDisplayName(contact.getName().getDisplay().get()); + + DataMessage.Contact.Builder contactBuilder = DataMessage.Contact.newBuilder() + .setName(nameBuilder); + + if (contact.getAddress().isPresent()) { + for (SharedContact.PostalAddress address : contact.getAddress().get()) { + DataMessage.Contact.PostalAddress.Builder addressBuilder = DataMessage.Contact.PostalAddress.newBuilder(); + + switch (address.getType()) { + case HOME: addressBuilder.setType(DataMessage.Contact.PostalAddress.Type.HOME); break; + case WORK: addressBuilder.setType(DataMessage.Contact.PostalAddress.Type.WORK); break; + case CUSTOM: addressBuilder.setType(DataMessage.Contact.PostalAddress.Type.CUSTOM); break; + default: throw new AssertionError("Unknown type: " + address.getType()); + } + + if (address.getCity().isPresent()) addressBuilder.setCity(address.getCity().get()); + if (address.getCountry().isPresent()) addressBuilder.setCountry(address.getCountry().get()); + if (address.getLabel().isPresent()) addressBuilder.setLabel(address.getLabel().get()); + if (address.getNeighborhood().isPresent()) addressBuilder.setNeighborhood(address.getNeighborhood().get()); + if (address.getPobox().isPresent()) addressBuilder.setPobox(address.getPobox().get()); + if (address.getPostcode().isPresent()) addressBuilder.setPostcode(address.getPostcode().get()); + if (address.getRegion().isPresent()) addressBuilder.setRegion(address.getRegion().get()); + if (address.getStreet().isPresent()) addressBuilder.setStreet(address.getStreet().get()); + + contactBuilder.addAddress(addressBuilder); + } + } + + if (contact.getEmail().isPresent()) { + for (SharedContact.Email email : contact.getEmail().get()) { + DataMessage.Contact.Email.Builder emailBuilder = DataMessage.Contact.Email.newBuilder() + .setValue(email.getValue()); + + switch (email.getType()) { + case HOME: emailBuilder.setType(DataMessage.Contact.Email.Type.HOME); break; + case WORK: emailBuilder.setType(DataMessage.Contact.Email.Type.WORK); break; + case MOBILE: emailBuilder.setType(DataMessage.Contact.Email.Type.MOBILE); break; + case CUSTOM: emailBuilder.setType(DataMessage.Contact.Email.Type.CUSTOM); break; + default: throw new AssertionError("Unknown type: " + email.getType()); + } + + if (email.getLabel().isPresent()) emailBuilder.setLabel(email.getLabel().get()); + + contactBuilder.addEmail(emailBuilder); + } + } + + if (contact.getPhone().isPresent()) { + for (SharedContact.Phone phone : contact.getPhone().get()) { + DataMessage.Contact.Phone.Builder phoneBuilder = DataMessage.Contact.Phone.newBuilder() + .setValue(phone.getValue()); + + switch (phone.getType()) { + case HOME: phoneBuilder.setType(DataMessage.Contact.Phone.Type.HOME); break; + case WORK: phoneBuilder.setType(DataMessage.Contact.Phone.Type.WORK); break; + case MOBILE: phoneBuilder.setType(DataMessage.Contact.Phone.Type.MOBILE); break; + case CUSTOM: phoneBuilder.setType(DataMessage.Contact.Phone.Type.CUSTOM); break; + default: throw new AssertionError("Unknown type: " + phone.getType()); + } + + if (phone.getLabel().isPresent()) phoneBuilder.setLabel(phone.getLabel().get()); + + contactBuilder.addNumber(phoneBuilder); + } + } + + if (contact.getAvatar().isPresent()) { + AttachmentPointer pointer = contact.getAvatar().get().getAttachment().isStream() ? createAttachmentPointer(contact.getAvatar().get().getAttachment().asStream(), recipient) + : createAttachmentPointer(contact.getAvatar().get().getAttachment().asPointer()); + contactBuilder.setAvatar(DataMessage.Contact.Avatar.newBuilder() + .setAvatar(pointer) + .setIsProfile(contact.getAvatar().get().isProfile())); + } + + if (contact.getOrganization().isPresent()) { + contactBuilder.setOrganization(contact.getOrganization().get()); + } + + results.add(contactBuilder.build()); + } + + return results; + } + + private List sendMessage(long messageID, + List recipients, + List> unidentifiedAccess, + long timestamp, + byte[] content, + boolean online, + int ttl, + boolean isClosedGroup, + boolean notifyPNServer) + throws IOException + { + List results = new LinkedList<>(); + Iterator recipientIterator = recipients.iterator(); + Iterator> unidentifiedAccessIterator = unidentifiedAccess.iterator(); + + while (recipientIterator.hasNext()) { + SignalServiceAddress recipient = recipientIterator.next(); + + try { + boolean useFallbackEncryption = SessionManagementProtocol.shared.shouldMessageUseFallbackEncryption(content, recipient.getNumber(), store); + SendMessageResult result = sendMessage(messageID, recipient, unidentifiedAccessIterator.next(), timestamp, content, online, ttl, false, useFallbackEncryption, isClosedGroup, false, notifyPNServer); + results.add(result); + } catch (UnregisteredUserException e) { + Log.w(TAG, e); + results.add(SendMessageResult.unregisteredFailure(recipient)); + } catch (PushNetworkException e) { + Log.w(TAG, e); + results.add(SendMessageResult.networkFailure(recipient)); + } + } + + return results; + } + + private SendMessageResult sendMessage(SignalServiceAddress recipient, + Optional unidentifiedAccess, + long timestamp, + byte[] content, + boolean online, + int ttl, + boolean useFallbackEncryption, + boolean isSyncMessage) + throws IOException + { + // Loki - This method is only invoked for various types of control messages + return sendMessage(0, recipient, unidentifiedAccess, timestamp, content, online, ttl, false, false, useFallbackEncryption, isSyncMessage, false); + } + + public SendMessageResult sendMessage(final long messageID, + final SignalServiceAddress recipient, + Optional unidentifiedAccess, + long timestamp, + byte[] content, + boolean online, + int ttl, + boolean isDeviceLinkMessage, + boolean useFallbackEncryption, + boolean isClosedGroup, + boolean isSyncMessage, + boolean notifyPNServer) + throws IOException + { + long threadID = threadDatabase.getThreadID(recipient.getNumber()); + PublicChat publicChat = threadDatabase.getPublicChat(threadID); + try { + if (publicChat != null) { + return sendMessageToPublicChat(messageID, recipient, timestamp, content, publicChat); + } else { + return sendMessageToPrivateChat(messageID, recipient, unidentifiedAccess, timestamp, content, online, ttl, useFallbackEncryption, isClosedGroup, notifyPNServer); + } + } catch (PushNetworkException e) { + return SendMessageResult.networkFailure(recipient); + } catch (UntrustedIdentityException e) { + return SendMessageResult.identityFailure(recipient, e.getIdentityKey()); + } + } + + private SendMessageResult sendMessageToPublicChat(final long messageID, + final SignalServiceAddress recipient, + long timestamp, + byte[] content, + PublicChat publicChat) { + if (messageID == 0) { + Log.d("Loki", "Missing message ID."); + } + final SettableFuture[] future = { new SettableFuture() }; + try { + DataMessage data = Content.parseFrom(content).getDataMessage(); + String body = (data.getBody() != null && data.getBody().length() > 0) ? data.getBody() : Long.toString(data.getTimestamp()); + PublicChatMessage.Quote quote = null; + if (data.hasQuote()) { + long quoteID = data.getQuote().getId(); + String quoteePublicKey = data.getQuote().getAuthor(); + long serverID = messageDatabase.getQuoteServerID(quoteID, quoteePublicKey); + quote = new PublicChatMessage.Quote(quoteID, quoteePublicKey, data.getQuote().getText(), serverID); + } + DataMessage.Preview linkPreview = (data.getPreviewList().size() > 0) ? data.getPreviewList().get(0) : null; + ArrayList attachments = new ArrayList<>(); + if (linkPreview != null && linkPreview.hasImage()) { + AttachmentPointer attachmentPointer = linkPreview.getImage(); + String caption = attachmentPointer.hasCaption() ? attachmentPointer.getCaption() : null; + attachments.add(new PublicChatMessage.Attachment( + PublicChatMessage.Attachment.Kind.LinkPreview, + publicChat.getServer(), + attachmentPointer.getId(), + attachmentPointer.getContentType(), + attachmentPointer.getSize(), + attachmentPointer.getFileName(), + attachmentPointer.getFlags(), + attachmentPointer.getWidth(), + attachmentPointer.getHeight(), + caption, + attachmentPointer.getUrl(), + linkPreview.getUrl(), + linkPreview.getTitle() + )); + } + for (AttachmentPointer attachmentPointer : data.getAttachmentsList()) { + String caption = attachmentPointer.hasCaption() ? attachmentPointer.getCaption() : null; + attachments.add(new PublicChatMessage.Attachment( + PublicChatMessage.Attachment.Kind.Attachment, + publicChat.getServer(), + attachmentPointer.getId(), + attachmentPointer.getContentType(), + attachmentPointer.getSize(), + attachmentPointer.getFileName(), + attachmentPointer.getFlags(), + attachmentPointer.getWidth(), + attachmentPointer.getHeight(), + caption, + attachmentPointer.getUrl(), + null, + null + )); + } + PublicChatMessage message = new PublicChatMessage(userPublicKey, "", body, timestamp, PublicChatAPI.getPublicChatMessageType(), quote, attachments); + byte[] privateKey = store.getIdentityKeyPair().getPrivateKey().serialize(); + new PublicChatAPI(userPublicKey, privateKey, apiDatabase, userDatabase, openGroupDatabase).sendMessage(message, publicChat.getChannel(), publicChat.getServer()).success(new Function1() { + + @Override + public Unit invoke(PublicChatMessage message) { + @SuppressWarnings("unchecked") SettableFuture f = (SettableFuture)future[0]; + messageDatabase.setServerID(messageID, message.getServerID()); + f.set(Unit.INSTANCE); + return Unit.INSTANCE; + } + }).fail(new Function1() { + + @Override + public Unit invoke(Exception exception) { + @SuppressWarnings("unchecked") SettableFuture f = (SettableFuture)future[0]; + f.setException(exception); + return Unit.INSTANCE; + } + }); + } catch (Exception exception) { + @SuppressWarnings("unchecked") SettableFuture f = (SettableFuture)future[0]; + f.setException(exception); + } + @SuppressWarnings("unchecked") SettableFuture f = (SettableFuture)future[0]; + try { + f.get(1, TimeUnit.MINUTES); + return SendMessageResult.success(recipient, false, false); + } catch (Exception exception) { + return SendMessageResult.networkFailure(recipient); + } + } + + private SendMessageResult sendMessageToPrivateChat(final long messageID, + final SignalServiceAddress recipient, + Optional unidentifiedAccess, + final long timestamp, + byte[] content, + boolean online, + int ttl, + boolean useFallbackEncryption, + boolean isClosedGroup, + final boolean notifyPNServer) + throws IOException, UntrustedIdentityException + { + if (recipient.getNumber().equals(userPublicKey)) { return SendMessageResult.success(recipient, false, false); } + final SettableFuture[] future = { new SettableFuture() }; + try { + OutgoingPushMessageList messages = getEncryptedMessages(socket, recipient, unidentifiedAccess, timestamp, content, online, useFallbackEncryption, isClosedGroup); + // Loki - Remove this when we have shared sender keys + // ======== + if (messages.getMessages().isEmpty()) { + return SendMessageResult.success(recipient, false, false); + } + // ======== + Set userLinkedDevices = MultiDeviceProtocol.shared.getAllLinkedDevices(userPublicKey); + if (sskDatabase.isSSKBasedClosedGroup(recipient.getNumber())) { + Log.d("Loki", "Sending message to closed group.") ; + } else if (recipient.getNumber().equals(userPublicKey)) { + Log.d("Loki", "Sending message to self."); + } else if (userLinkedDevices.contains(recipient.getNumber())) { + Log.d("Loki", "Sending message to linked device."); + } else { + Log.d("Loki", "Sending message to " + recipient.getNumber() + "."); + } + OutgoingPushMessage message = messages.getMessages().get(0); + final SignalServiceProtos.Envelope.Type type = SignalServiceProtos.Envelope.Type.valueOf(message.type); + final String senderID; + if (type == SignalServiceProtos.Envelope.Type.CLOSED_GROUP_CIPHERTEXT) { + senderID = recipient.getNumber(); + } else if (type == SignalServiceProtos.Envelope.Type.UNIDENTIFIED_SENDER) { + senderID = ""; + } else { + senderID = userPublicKey; + } + final int senderDeviceID = (type == SignalServiceProtos.Envelope.Type.UNIDENTIFIED_SENDER) ? 0 : SignalServiceAddress.DEFAULT_DEVICE_ID; + // Make sure we have a valid ttl; otherwise default to 2 days + if (ttl <= 0) { ttl = TTLUtilities.INSTANCE.getFallbackMessageTTL(); } + final int regularMessageTTL = TTLUtilities.getTTL(TTLUtilities.MessageType.Regular); + final int __ttl = ttl; + final SignalMessageInfo messageInfo = new SignalMessageInfo(type, timestamp, senderID, senderDeviceID, message.content, recipient.getNumber(), ttl, false); + SnodeAPI.shared.sendSignalMessage(messageInfo).success(new Function1, Exception>>, Unit>() { + + @Override + public Unit invoke(Set, Exception>> promises) { + final boolean[] isSuccess = { false }; + final int[] promiseCount = {promises.size()}; + final int[] errorCount = { 0 }; + for (Promise, Exception> promise : promises) { + promise.success(new Function1, Unit>() { + + @Override + public Unit invoke(Map map) { + if (isSuccess[0]) { return Unit.INSTANCE; } // Succeed as soon as the first promise succeeds + if (__ttl == regularMessageTTL) { + broadcaster.broadcast("messageSent", timestamp); + } + isSuccess[0] = true; + if (notifyPNServer) { + PushNotificationAPI.shared.notify(messageInfo); + } + @SuppressWarnings("unchecked") SettableFuture f = (SettableFuture)future[0]; + f.set(Unit.INSTANCE); + return Unit.INSTANCE; + } + }).fail(new Function1() { + + @Override + public Unit invoke(Exception exception) { + errorCount[0] += 1; + if (errorCount[0] != promiseCount[0]) { return Unit.INSTANCE; } // Only error out if all promises failed + if (__ttl == regularMessageTTL) { + broadcaster.broadcast("messageFailed", timestamp); + } + @SuppressWarnings("unchecked") SettableFuture f = (SettableFuture)future[0]; + f.setException(exception); + return Unit.INSTANCE; + } + }); + } + return Unit.INSTANCE; + } + }).fail(new Function1() { + + @Override + public Unit invoke(Exception exception) { + @SuppressWarnings("unchecked") SettableFuture f = (SettableFuture)future[0]; + f.setException(exception); + return Unit.INSTANCE; + } + }); + } catch (InvalidKeyException e) { + throw new IOException(e); + } + @SuppressWarnings("unchecked") SettableFuture f = (SettableFuture)future[0]; + try { + f.get(1, TimeUnit.MINUTES); + return SendMessageResult.success(recipient, false, true); + } catch (Exception exception) { + Throwable underlyingError = exception.getCause(); + if (underlyingError instanceof SnodeAPI.Error) { + return SendMessageResult.lokiAPIError(recipient, (SnodeAPI.Error)underlyingError); + } else { + return SendMessageResult.networkFailure(recipient); + } + } + } + + private List createAttachmentPointers(Optional> attachments, SignalServiceAddress recipient) + throws IOException + { + List pointers = new LinkedList<>(); + + if (!attachments.isPresent() || attachments.get().isEmpty()) { + Log.w(TAG, "No attachments present..."); + return pointers; + } + + for (SignalServiceAttachment attachment : attachments.get()) { + if (attachment.isStream()) { + Log.w(TAG, "Found attachment, creating pointer..."); + pointers.add(createAttachmentPointer(attachment.asStream(), recipient)); + } else if (attachment.isPointer()) { + Log.w(TAG, "Including existing attachment pointer..."); + pointers.add(createAttachmentPointer(attachment.asPointer())); + } + } + + return pointers; + } + + private AttachmentPointer createAttachmentPointer(SignalServiceAttachmentPointer attachment) { + AttachmentPointer.Builder builder = AttachmentPointer.newBuilder() + .setContentType(attachment.getContentType()) + .setId(attachment.getId()) + .setKey(ByteString.copyFrom(attachment.getKey())) + .setDigest(ByteString.copyFrom(attachment.getDigest().get())) + .setSize(attachment.getSize().get()) + .setUrl(attachment.getUrl()); + + if (attachment.getFileName().isPresent()) { + builder.setFileName(attachment.getFileName().get()); + } + + if (attachment.getPreview().isPresent()) { + builder.setThumbnail(ByteString.copyFrom(attachment.getPreview().get())); + } + + if (attachment.getWidth() > 0) { + builder.setWidth(attachment.getWidth()); + } + + if (attachment.getHeight() > 0) { + builder.setHeight(attachment.getHeight()); + } + + if (attachment.getVoiceNote()) { + builder.setFlags(AttachmentPointer.Flags.VOICE_MESSAGE_VALUE); + } + + if (attachment.getCaption().isPresent()) { + builder.setCaption(attachment.getCaption().get()); + } + + return builder.build(); + } + + private AttachmentPointer createAttachmentPointer(SignalServiceAttachmentStream attachment) + throws IOException + { + return createAttachmentPointer(attachment, false, null); + } + + private AttachmentPointer createAttachmentPointer(SignalServiceAttachmentStream attachment, SignalServiceAddress recipient) + throws IOException + { + return createAttachmentPointer(attachment, false, recipient); + } + + private AttachmentPointer createAttachmentPointer(SignalServiceAttachmentStream attachment, boolean usePadding, SignalServiceAddress recipient) + throws IOException + { + SignalServiceAttachmentPointer pointer = uploadAttachment(attachment, usePadding, recipient); + return createAttachmentPointer(pointer); + } + + private OutgoingPushMessageList getEncryptedMessages(PushServiceSocket socket, + SignalServiceAddress recipient, + Optional unidentifiedAccess, + long timestamp, + byte[] plaintext, + boolean online, + boolean useFallbackEncryption, + boolean isClosedGroup) + throws IOException, InvalidKeyException, UntrustedIdentityException + { + List messages = new LinkedList<>(); + + // Loki - The way this works is: + // • Alice sends a session request (i.e. a pre key bundle) to Bob using fallback encryption. + // • She may send any number of subsequent messages also encrypted using fallback encryption. + // • When Bob receives the session request, he sets up his Signal cipher session locally and sends back a null message, + // now encrypted using Signal encryption. + // • Alice receives this, sets up her Signal cipher session locally, and sends any subsequent messages + // using Signal encryption. + + if (!recipient.equals(localAddress) || unidentifiedAccess.isPresent()) { + if (sskDatabase.isSSKBasedClosedGroup(recipient.getNumber()) && unidentifiedAccess.isPresent()) { + messages.add(getSSKEncryptedMessage(recipient.getNumber(), unidentifiedAccess.get(), plaintext)); + } else if (useFallbackEncryption) { + messages.add(getFallbackCipherEncryptedMessage(recipient.getNumber(), plaintext, unidentifiedAccess)); + } else { + OutgoingPushMessage message = getEncryptedMessage(socket, recipient, unidentifiedAccess, plaintext, isClosedGroup); + if (message != null) { // May be null in a closed group context + messages.add(message); + } + } + } + + return new OutgoingPushMessageList(recipient.getNumber(), timestamp, messages, online); + } + + private OutgoingPushMessage getFallbackCipherEncryptedMessage(String publicKey, byte[] plaintext, Optional unidentifiedAccess) + throws InvalidKeyException + { + Log.d("Loki", "Using fallback cipher."); + int deviceID = SignalServiceAddress.DEFAULT_DEVICE_ID; + SignalProtocolAddress signalProtocolAddress = new SignalProtocolAddress(publicKey, deviceID); + byte[] userPrivateKey = store.getIdentityKeyPair().getPrivateKey().serialize(); + FallbackSessionCipher cipher = new FallbackSessionCipher(userPrivateKey, publicKey); + PushTransportDetails transportDetails = new PushTransportDetails(FallbackSessionCipher.getSessionVersion()); + byte[] bytes = cipher.encrypt(transportDetails.getPaddedMessageBody(plaintext)); + if (bytes == null) { bytes = new byte[0]; } + if (unidentifiedAccess.isPresent()) { + SealedSessionCipher sealedSessionCipher = new SealedSessionCipher(store, null, signalProtocolAddress); + FallbackMessage message = new FallbackMessage(bytes); + byte[] ciphertext = sealedSessionCipher.encrypt(signalProtocolAddress, unidentifiedAccess.get().getUnidentifiedCertificate(), message); + return new OutgoingPushMessage(SignalServiceProtos.Envelope.Type.UNIDENTIFIED_SENDER_VALUE, deviceID, 0, Base64.encodeBytes(ciphertext)); + } else { + return new OutgoingPushMessage(SignalServiceProtos.Envelope.Type.FALLBACK_MESSAGE_VALUE, deviceID, 0, Base64.encodeBytes(bytes)); + } + } + + private OutgoingPushMessage getSSKEncryptedMessage(String groupPublicKey, UnidentifiedAccess unidentifiedAccess, byte[] plaintext) + throws InvalidKeyException, UntrustedIdentityException, IOException + { + int deviceID = SignalServiceAddress.DEFAULT_DEVICE_ID; + SignalProtocolAddress signalProtocolAddress = new SignalProtocolAddress(groupPublicKey, deviceID); + SignalServiceCipher cipher = new SignalServiceCipher(localAddress, store, sskDatabase, sessionResetImpl, null); + try { + return cipher.encrypt(signalProtocolAddress, Optional.of(unidentifiedAccess), plaintext); + } catch (org.session.libsignal.libsignal.UntrustedIdentityException e) { + throw new UntrustedIdentityException("Untrusted identity", groupPublicKey, e.getUntrustedIdentity()); + } + } + + private OutgoingPushMessage getEncryptedMessage(PushServiceSocket socket, + SignalServiceAddress recipient, + Optional unidentifiedAccess, + byte[] plaintext, + boolean isClosedGroup) + throws IOException, InvalidKeyException, UntrustedIdentityException + { + Log.d("Loki", "Using Signal cipher."); + int deviceID = SignalServiceAddress.DEFAULT_DEVICE_ID; + SignalProtocolAddress signalProtocolAddress = new SignalProtocolAddress(recipient.getNumber(), deviceID); + SignalServiceCipher cipher = new SignalServiceCipher(localAddress, store, sskDatabase, sessionResetImpl, null); + + try { + String contactPublicKey = recipient.getNumber(); + PreKeyBundle preKeyBundle = preKeyBundleDatabase.getPreKeyBundle(contactPublicKey); + if (preKeyBundle == null) { + if (!store.containsSession(signalProtocolAddress)) { + SessionManagementProtocol.shared.repairSessionIfNeeded(recipient, isClosedGroup); + // Loki - Remove this when we have shared sender keys + // ======== + if (SessionManagementProtocol.shared.shouldIgnoreMissingPreKeyBundleException(isClosedGroup)) { + return null; + } + // ======== + throw new InvalidKeyException("Pre key bundle not found for: " + recipient.getNumber() + "."); + } + } else { + try { + SignalProtocolAddress address = new SignalProtocolAddress(contactPublicKey, preKeyBundle.getDeviceId()); + SessionBuilder sessionBuilder = new SessionBuilder(store, address); + sessionBuilder.process(preKeyBundle); + // Loki - Discard the pre key bundle once the session has been established + preKeyBundleDatabase.removePreKeyBundle(contactPublicKey); + } catch (org.session.libsignal.libsignal.UntrustedIdentityException e) { + throw new UntrustedIdentityException("Untrusted identity key", recipient.getNumber(), preKeyBundle.getIdentityKey()); + } + if (eventListener.isPresent()) { + eventListener.get().onSecurityEvent(recipient); + } + } + } catch (InvalidKeyException e) { + throw new IOException(e); + } + + // Loki - Ensure all session processing has finished + synchronized (SESSION_LOCK) { + try { + return cipher.encrypt(signalProtocolAddress, unidentifiedAccess, plaintext); + } catch (org.session.libsignal.libsignal.UntrustedIdentityException e) { + throw new UntrustedIdentityException("Untrusted on send", recipient.getNumber(), e.getUntrustedIdentity()); + } + } + } + + private Optional getTargetUnidentifiedAccess(Optional unidentifiedAccess) { + if (unidentifiedAccess.isPresent()) { + return unidentifiedAccess.get().getTargetUnidentifiedAccess(); + } + + return Optional.absent(); + } + + private List> getTargetUnidentifiedAccess(List> unidentifiedAccess) { + List> results = new LinkedList<>(); + + for (Optional item : unidentifiedAccess) { + if (item.isPresent()) results.add(item.get().getTargetUnidentifiedAccess()); + else results.add(Optional.absent()); + } + + return results; + } + + public static interface EventListener { + + public void onSecurityEvent(SignalServiceAddress address); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/crypto/AttachmentCipherInputStream.java b/libsignal/src/main/java/org/session/libsignal/service/api/crypto/AttachmentCipherInputStream.java new file mode 100644 index 000000000..ac6a8a63f --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/crypto/AttachmentCipherInputStream.java @@ -0,0 +1,285 @@ +/* + * Copyright (C) 2014-2017 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.crypto; + +import org.session.libsignal.libsignal.InvalidMacException; +import org.session.libsignal.libsignal.InvalidMessageException; +import org.session.libsignal.libsignal.kdf.HKDFv3; +import org.session.libsignal.service.internal.util.ContentLengthInputStream; +import org.session.libsignal.service.internal.util.Util; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FilterInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.security.InvalidAlgorithmParameterException; +import java.security.InvalidKeyException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Arrays; + +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.Mac; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.ShortBufferException; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +/** + * Class for streaming an encrypted push attachment off disk. + * + * @author Moxie Marlinspike + */ + +public class AttachmentCipherInputStream extends FilterInputStream { + + private static final int BLOCK_SIZE = 16; + private static final int CIPHER_KEY_SIZE = 32; + private static final int MAC_KEY_SIZE = 32; + + private Cipher cipher; + private boolean done; + private long totalDataSize; + private long totalRead; + private byte[] overflowBuffer; + + public static InputStream createForAttachment(File file, long plaintextLength, byte[] combinedKeyMaterial, byte[] digest) + throws InvalidMessageException, IOException + { + try { + byte[][] parts = Util.split(combinedKeyMaterial, CIPHER_KEY_SIZE, MAC_KEY_SIZE); + Mac mac = Mac.getInstance("HmacSHA256"); + mac.init(new SecretKeySpec(parts[1], "HmacSHA256")); + + if (file.length() <= BLOCK_SIZE + mac.getMacLength()) { + throw new InvalidMessageException("Message shorter than crypto overhead!"); + } + + if (digest == null) { + throw new InvalidMacException("Missing digest!"); + } + + FileInputStream fin = new FileInputStream(file); + verifyMac(fin, file.length(), mac, digest); + + InputStream inputStream = new AttachmentCipherInputStream(new FileInputStream(file), parts[0], file.length() - BLOCK_SIZE - mac.getMacLength()); + + if (plaintextLength != 0) { + inputStream = new ContentLengthInputStream(inputStream, plaintextLength); + } + + return inputStream; + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (InvalidKeyException e) { + throw new AssertionError(e); + } catch (InvalidMacException e) { + throw new InvalidMessageException(e); + } + } + + public static InputStream createForStickerData(byte[] data, byte[] packKey) + throws InvalidMessageException, IOException + { + try { + byte[] combinedKeyMaterial = new HKDFv3().deriveSecrets(packKey, "Sticker Pack".getBytes(), 64); + byte[][] parts = Util.split(combinedKeyMaterial, CIPHER_KEY_SIZE, MAC_KEY_SIZE); + Mac mac = Mac.getInstance("HmacSHA256"); + mac.init(new SecretKeySpec(parts[1], "HmacSHA256")); + + if (data.length <= BLOCK_SIZE + mac.getMacLength()) { + throw new InvalidMessageException("Message shorter than crypto overhead!"); + } + + InputStream inputStream = new ByteArrayInputStream(data); + verifyMac(inputStream, data.length, mac, null); + + return new AttachmentCipherInputStream(new ByteArrayInputStream(data), parts[0], data.length - BLOCK_SIZE - mac.getMacLength()); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (InvalidKeyException e) { + throw new AssertionError(e); + } catch (InvalidMacException e) { + throw new InvalidMessageException(e); + } + } + + private AttachmentCipherInputStream(InputStream inputStream, byte[] cipherKey, long totalDataSize) + throws IOException + { + super(inputStream); + + try { + byte[] iv = new byte[BLOCK_SIZE]; + readFully(iv); + + this.cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + this.cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(cipherKey, "AES"), new IvParameterSpec(iv)); + + this.done = false; + this.totalRead = 0; + this.totalDataSize = totalDataSize; + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (InvalidKeyException e) { + throw new AssertionError(e); + } catch (NoSuchPaddingException e) { + throw new AssertionError(e); + } catch (InvalidAlgorithmParameterException e) { + throw new AssertionError(e); + } + } + + @Override + public int read(byte[] buffer) throws IOException { + return read(buffer, 0, buffer.length); + } + + @Override + public int read(byte[] buffer, int offset, int length) throws IOException { + if (totalRead != totalDataSize) return readIncremental(buffer, offset, length); + else if (!done) return readFinal(buffer, offset, length); + else return -1; + } + + @Override + public boolean markSupported() { + return false; + } + + @Override + public long skip(long byteCount) throws IOException { + long skipped = 0L; + while (skipped < byteCount) { + byte[] buf = new byte[Math.min(4096, (int)(byteCount-skipped))]; + int read = read(buf); + + skipped += read; + } + + return skipped; + } + + private int readFinal(byte[] buffer, int offset, int length) throws IOException { + try { + int flourish = cipher.doFinal(buffer, offset); + + done = true; + return flourish; + } catch (IllegalBlockSizeException e) { + throw new IOException(e); + } catch (BadPaddingException e) { + throw new IOException(e); + } catch (ShortBufferException e) { + throw new IOException(e); + } + } + + private int readIncremental(byte[] buffer, int offset, int length) throws IOException { + int readLength = 0; + if (null != overflowBuffer) { + if (overflowBuffer.length > length) { + System.arraycopy(overflowBuffer, 0, buffer, offset, length); + overflowBuffer = Arrays.copyOfRange(overflowBuffer, length, overflowBuffer.length); + return length; + } else if (overflowBuffer.length == length) { + System.arraycopy(overflowBuffer, 0, buffer, offset, length); + overflowBuffer = null; + return length; + } else { + System.arraycopy(overflowBuffer, 0, buffer, offset, overflowBuffer.length); + readLength += overflowBuffer.length; + offset += readLength; + length -= readLength; + overflowBuffer = null; + } + } + + if (length + totalRead > totalDataSize) + length = (int)(totalDataSize - totalRead); + + byte[] internalBuffer = new byte[length]; + int read = super.read(internalBuffer, 0, internalBuffer.length <= cipher.getBlockSize() ? internalBuffer.length : internalBuffer.length - cipher.getBlockSize()); + totalRead += read; + + try { + int outputLen = cipher.getOutputSize(read); + + if (outputLen <= length) { + readLength += cipher.update(internalBuffer, 0, read, buffer, offset); + return readLength; + } + + byte[] transientBuffer = new byte[outputLen]; + outputLen = cipher.update(internalBuffer, 0, read, transientBuffer, 0); + if (outputLen <= length) { + System.arraycopy(transientBuffer, 0, buffer, offset, outputLen); + readLength += outputLen; + } else { + System.arraycopy(transientBuffer, 0, buffer, offset, length); + overflowBuffer = Arrays.copyOfRange(transientBuffer, length, outputLen); + readLength += length; + } + return readLength; + } catch (ShortBufferException e) { + throw new AssertionError(e); + } + } + + private static void verifyMac(InputStream inputStream, long length, Mac mac, byte[] theirDigest) + throws InvalidMacException + { + try { + MessageDigest digest = MessageDigest.getInstance("SHA256"); + int remainingData = Util.toIntExact(length) - mac.getMacLength(); + byte[] buffer = new byte[4096]; + + while (remainingData > 0) { + int read = inputStream.read(buffer, 0, Math.min(buffer.length, remainingData)); + mac.update(buffer, 0, read); + digest.update(buffer, 0, read); + remainingData -= read; + } + + byte[] ourMac = mac.doFinal(); + byte[] theirMac = new byte[mac.getMacLength()]; + Util.readFully(inputStream, theirMac); + + if (!MessageDigest.isEqual(ourMac, theirMac)) { + throw new InvalidMacException("MAC doesn't match!"); + } + + byte[] ourDigest = digest.digest(theirMac); + + if (theirDigest != null && !MessageDigest.isEqual(ourDigest, theirDigest)) { + throw new InvalidMacException("Digest doesn't match!"); + } + + } catch (IOException e) { + throw new InvalidMacException(e); + } catch (ArithmeticException e) { + throw new InvalidMacException(e); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } + } + + private void readFully(byte[] buffer) throws IOException { + int offset = 0; + + for (;;) { + int read = super.read(buffer, offset, buffer.length - offset); + + if (read + offset < buffer.length) offset += read; + else return; + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/crypto/AttachmentCipherOutputStream.java b/libsignal/src/main/java/org/session/libsignal/service/api/crypto/AttachmentCipherOutputStream.java new file mode 100644 index 000000000..e214f99e1 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/crypto/AttachmentCipherOutputStream.java @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2014-2017 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.crypto; + +import org.session.libsignal.service.internal.util.Util; + +import java.io.IOException; +import java.io.OutputStream; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; + +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.Mac; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.spec.SecretKeySpec; + +public class AttachmentCipherOutputStream extends DigestingOutputStream { + + private final Cipher cipher; + private final Mac mac; + + public AttachmentCipherOutputStream(byte[] combinedKeyMaterial, + OutputStream outputStream) + throws IOException + { + super(outputStream); + try { + this.cipher = initializeCipher(); + this.mac = initializeMac(); + byte[][] keyParts = Util.split(combinedKeyMaterial, 32, 32); + + this.cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(keyParts[0], "AES")); + this.mac.init(new SecretKeySpec(keyParts[1], "HmacSHA256")); + + mac.update(cipher.getIV()); + super.write(cipher.getIV()); + } catch (InvalidKeyException e) { + throw new AssertionError(e); + } + } + + @Override + public void write(byte[] buffer) throws IOException { + write(buffer, 0, buffer.length); + } + + @Override + public void write(byte[] buffer, int offset, int length) throws IOException { + byte[] ciphertext = cipher.update(buffer, offset, length); + + if (ciphertext != null) { + mac.update(ciphertext); + super.write(ciphertext); + } + } + + @Override + public void write(int b) { + throw new AssertionError("NYI"); + } + + @Override + public void flush() throws IOException { + try { + byte[] ciphertext = cipher.doFinal(); + byte[] auth = mac.doFinal(ciphertext); + + super.write(ciphertext); + super.write(auth); + + super.flush(); + } catch (IllegalBlockSizeException e) { + throw new AssertionError(e); + } catch (BadPaddingException e) { + throw new AssertionError(e); + } + } + + public static long getCiphertextLength(long plaintextLength) { + return 16 + (((plaintextLength / 16) +1) * 16) + 32; + } + + private Mac initializeMac() { + try { + return Mac.getInstance("HmacSHA256"); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } + } + + private Cipher initializeCipher() { + try { + return Cipher.getInstance("AES/CBC/PKCS5Padding"); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (NoSuchPaddingException e) { + throw new AssertionError(e); + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/crypto/DigestingOutputStream.java b/libsignal/src/main/java/org/session/libsignal/service/api/crypto/DigestingOutputStream.java new file mode 100644 index 000000000..77e45082d --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/crypto/DigestingOutputStream.java @@ -0,0 +1,55 @@ +package org.session.libsignal.service.api.crypto; + + +import java.io.FilterOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +public abstract class DigestingOutputStream extends FilterOutputStream { + + private final MessageDigest runningDigest; + + private byte[] digest; + + public DigestingOutputStream(OutputStream outputStream) { + super(outputStream); + + try { + this.runningDigest = MessageDigest.getInstance("SHA256"); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } + } + + @Override + public void write(byte[] buffer) throws IOException { + runningDigest.update(buffer, 0, buffer.length); + out.write(buffer, 0, buffer.length); + } + + public void write(byte[] buffer, int offset, int length) throws IOException { + runningDigest.update(buffer, offset, length); + out.write(buffer, offset, length); + } + + public void write(int b) throws IOException { + runningDigest.update((byte)b); + out.write(b); + } + + public void flush() throws IOException { + digest = runningDigest.digest(); + out.flush(); + } + + public void close() throws IOException { + out.close(); + } + + public byte[] getTransmittedDigest() { + return digest; + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/crypto/InvalidCiphertextException.java b/libsignal/src/main/java/org/session/libsignal/service/api/crypto/InvalidCiphertextException.java new file mode 100644 index 000000000..717c76cec --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/crypto/InvalidCiphertextException.java @@ -0,0 +1,11 @@ +package org.session.libsignal.service.api.crypto; + +public class InvalidCiphertextException extends Exception { + public InvalidCiphertextException(Exception nested) { + super(nested); + } + + public InvalidCiphertextException(String s) { + super(s); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/crypto/ProfileCipher.java b/libsignal/src/main/java/org/session/libsignal/service/api/crypto/ProfileCipher.java new file mode 100644 index 000000000..e779af2c7 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/crypto/ProfileCipher.java @@ -0,0 +1,123 @@ +package org.session.libsignal.service.api.crypto; + + +import org.session.libsignal.libsignal.util.ByteUtil; +import org.session.libsignal.service.api.crypto.InvalidCiphertextException; +import org.session.libsignal.service.api.crypto.UnidentifiedAccess; +import org.session.libsignal.service.internal.util.Util; + +import java.security.InvalidAlgorithmParameterException; +import java.security.InvalidKeyException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.Mac; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.spec.GCMParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +public class ProfileCipher { + + public static final int NAME_PADDED_LENGTH = 26; + + private final byte[] key; + + public ProfileCipher(byte[] key) { + this.key = key; + } + + public byte[] encryptName(byte[] input, int paddedLength) { + try { + byte[] inputPadded = new byte[paddedLength]; + + if (input.length > inputPadded.length) { + throw new IllegalArgumentException("Input is too long: " + new String(input)); + } + + System.arraycopy(input, 0, inputPadded, 0, input.length); + + byte[] nonce = Util.getSecretBytes(12); + + Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); + cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES"), new GCMParameterSpec(128, nonce)); + + return ByteUtil.combine(nonce, cipher.doFinal(inputPadded)); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (InvalidAlgorithmParameterException e) { + throw new AssertionError(e); + } catch (BadPaddingException e) { + throw new AssertionError(e); + } catch (NoSuchPaddingException e) { + throw new AssertionError(e); + } catch (IllegalBlockSizeException e) { + throw new AssertionError(e); + } catch (InvalidKeyException e) { + throw new AssertionError(e); + } + } + + public byte[] decryptName(byte[] input) throws InvalidCiphertextException { + try { + if (input.length < 12 + 16 + 1) { + throw new InvalidCiphertextException("Too short: " + input.length); + } + + byte[] nonce = new byte[12]; + System.arraycopy(input, 0, nonce, 0, nonce.length); + + Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); + cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"), new GCMParameterSpec(128, nonce)); + + byte[] paddedPlaintext = cipher.doFinal(input, nonce.length, input.length - nonce.length); + int plaintextLength = 0; + + for (int i=paddedPlaintext.length-1;i>=0;i--) { + if (paddedPlaintext[i] != (byte)0x00) { + plaintextLength = i + 1; + break; + } + } + + byte[] plaintext = new byte[plaintextLength]; + System.arraycopy(paddedPlaintext, 0, plaintext, 0, plaintextLength); + + return plaintext; + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (InvalidAlgorithmParameterException e) { + throw new AssertionError(e); + } catch (NoSuchPaddingException e) { + throw new AssertionError(e); + } catch (IllegalBlockSizeException e) { + throw new AssertionError(e); + } catch (InvalidKeyException e) { + throw new InvalidCiphertextException(e); + } catch (BadPaddingException e) { + throw new InvalidCiphertextException(e); + } + } + + public boolean verifyUnidentifiedAccess(byte[] theirUnidentifiedAccessVerifier) { + try { + if (theirUnidentifiedAccessVerifier == null || theirUnidentifiedAccessVerifier.length == 0) return false; + + byte[] unidentifiedAccessKey = UnidentifiedAccess.deriveAccessKeyFrom(key); + + Mac mac = Mac.getInstance("HmacSHA256"); + mac.init(new SecretKeySpec(unidentifiedAccessKey, "HmacSHA256")); + + byte[] ourUnidentifiedAccessVerifier = mac.doFinal(new byte[32]); + + return MessageDigest.isEqual(theirUnidentifiedAccessVerifier, ourUnidentifiedAccessVerifier); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (InvalidKeyException e) { + throw new AssertionError(e); + } + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/crypto/ProfileCipherInputStream.java b/libsignal/src/main/java/org/session/libsignal/service/api/crypto/ProfileCipherInputStream.java new file mode 100644 index 000000000..42ed1ac9f --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/crypto/ProfileCipherInputStream.java @@ -0,0 +1,89 @@ +package org.session.libsignal.service.api.crypto; + + +import org.session.libsignal.service.internal.util.Util; + +import java.io.FilterInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.security.InvalidAlgorithmParameterException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; + +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.ShortBufferException; +import javax.crypto.spec.GCMParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +public class ProfileCipherInputStream extends FilterInputStream { + + private final Cipher cipher; + + private boolean finished = false; + + public ProfileCipherInputStream(InputStream in, byte[] key) throws IOException { + super(in); + + try { + this.cipher = Cipher.getInstance("AES/GCM/NoPadding"); + + byte[] nonce = new byte[12]; + Util.readFully(in, nonce); + + this.cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"), new GCMParameterSpec(128, nonce)); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (NoSuchPaddingException e) { + throw new AssertionError(e); + } catch (InvalidAlgorithmParameterException e) { + throw new AssertionError(e); + } catch (InvalidKeyException e) { + throw new IOException(e); + } + } + + @Override + public int read() { + throw new AssertionError("Not supported!"); + } + + @Override + public int read(byte[] input) throws IOException { + return read(input, 0, input.length); + } + + @Override + public int read(byte[] output, int outputOffset, int outputLength) throws IOException { + if (finished) return -1; + + try { + byte[] ciphertext = new byte[outputLength / 2]; + int read = in.read(ciphertext, 0, ciphertext.length); + + if (read == -1) { + if (cipher.getOutputSize(0) > outputLength) { + throw new AssertionError("Need: " + cipher.getOutputSize(0) + " but only have: " + outputLength); + } + + finished = true; + return cipher.doFinal(output, outputOffset); + } else { + if (cipher.getOutputSize(read) > outputLength) { + throw new AssertionError("Need: " + cipher.getOutputSize(read) + " but only have: " + outputLength); + } + + return cipher.update(ciphertext, 0, read, output, outputOffset); + } + } catch (IllegalBlockSizeException e) { + throw new AssertionError(e); + } catch(ShortBufferException e) { + throw new AssertionError(e); + } catch (BadPaddingException e) { + throw new IOException(e); + } + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/crypto/ProfileCipherOutputStream.java b/libsignal/src/main/java/org/session/libsignal/service/api/crypto/ProfileCipherOutputStream.java new file mode 100644 index 000000000..e663ba0e8 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/crypto/ProfileCipherOutputStream.java @@ -0,0 +1,84 @@ +package org.session.libsignal.service.api.crypto; + +import java.io.IOException; +import java.io.OutputStream; +import java.security.InvalidAlgorithmParameterException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; + +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.spec.GCMParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +public class ProfileCipherOutputStream extends DigestingOutputStream { + + private final Cipher cipher; + + public ProfileCipherOutputStream(OutputStream out, byte[] key) throws IOException { + super(out); + try { + this.cipher = Cipher.getInstance("AES/GCM/NoPadding"); + + byte[] nonce = generateNonce(); + this.cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES"), new GCMParameterSpec(128, nonce)); + + super.write(nonce, 0, nonce.length); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (NoSuchPaddingException e) { + throw new AssertionError(e); + } catch (InvalidAlgorithmParameterException e) { + throw new AssertionError(e); + } catch (InvalidKeyException e) { + throw new IOException(e); + } + } + + @Override + public void write(byte[] buffer) throws IOException { + write(buffer, 0, buffer.length); + } + + @Override + public void write(byte[] buffer, int offset, int length) throws IOException { + byte[] output = cipher.update(buffer, offset, length); + super.write(output); + } + + @Override + public void write(int b) throws IOException { + byte[] input = new byte[1]; + input[0] = (byte)b; + + byte[] output = cipher.update(input); + super.write(output); + } + + @Override + public void flush() throws IOException { + try { + byte[] output = cipher.doFinal(); + + super.write(output); + super.flush(); + } catch (BadPaddingException e) { + throw new AssertionError(e); + } catch (IllegalBlockSizeException e) { + throw new AssertionError(e); + } + } + + private byte[] generateNonce() { + byte[] nonce = new byte[12]; + new SecureRandom().nextBytes(nonce); + return nonce; + } + + public static long getCiphertextLength(long plaintextLength) { + return 12 + 16 + plaintextLength; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/crypto/SignalServiceCipher.java b/libsignal/src/main/java/org/session/libsignal/service/api/crypto/SignalServiceCipher.java new file mode 100644 index 000000000..06da05fd3 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/crypto/SignalServiceCipher.java @@ -0,0 +1,850 @@ +/* + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.crypto; + +import com.google.protobuf.ByteString; +import com.google.protobuf.InvalidProtocolBufferException; + +import org.session.libsignal.metadata.InvalidMetadataMessageException; +import org.session.libsignal.metadata.InvalidMetadataVersionException; +import org.session.libsignal.metadata.ProtocolDuplicateMessageException; +import org.session.libsignal.metadata.ProtocolInvalidKeyException; +import org.session.libsignal.metadata.ProtocolInvalidKeyIdException; +import org.session.libsignal.metadata.ProtocolInvalidMessageException; +import org.session.libsignal.metadata.ProtocolInvalidVersionException; +import org.session.libsignal.metadata.ProtocolLegacyMessageException; +import org.session.libsignal.metadata.ProtocolNoSessionException; +import org.session.libsignal.metadata.ProtocolUntrustedIdentityException; +import org.session.libsignal.metadata.SealedSessionCipher; +import org.session.libsignal.metadata.SelfSendException; +import org.session.libsignal.metadata.certificate.CertificateValidator; +import org.session.libsignal.libsignal.DuplicateMessageException; +import org.session.libsignal.libsignal.IdentityKey; +import org.session.libsignal.libsignal.InvalidKeyException; +import org.session.libsignal.libsignal.InvalidKeyIdException; +import org.session.libsignal.libsignal.InvalidMessageException; +import org.session.libsignal.libsignal.InvalidVersionException; +import org.session.libsignal.libsignal.LegacyMessageException; +import org.session.libsignal.libsignal.NoSessionException; +import org.session.libsignal.libsignal.SessionCipher; +import org.session.libsignal.libsignal.SignalProtocolAddress; +import org.session.libsignal.libsignal.UntrustedIdentityException; +import org.session.libsignal.libsignal.loki.LokiSessionCipher; +import org.session.libsignal.libsignal.loki.SessionResetProtocol; +import org.session.libsignal.libsignal.protocol.CiphertextMessage; +import org.session.libsignal.libsignal.protocol.PreKeySignalMessage; +import org.session.libsignal.libsignal.protocol.SignalMessage; +import org.session.libsignal.libsignal.state.SignalProtocolStore; +import org.session.libsignal.libsignal.util.Pair; +import org.session.libsignal.libsignal.util.guava.Optional; +import org.session.libsignal.service.api.messages.SignalServiceAttachment; +import org.session.libsignal.service.api.messages.SignalServiceAttachmentPointer; +import org.session.libsignal.service.api.messages.SignalServiceAttachmentStream; +import org.session.libsignal.service.api.messages.SignalServiceContent; +import org.session.libsignal.service.api.messages.SignalServiceDataMessage; +import org.session.libsignal.service.api.messages.SignalServiceDataMessage.Preview; +import org.session.libsignal.service.api.messages.SignalServiceDataMessage.Sticker; +import org.session.libsignal.service.api.messages.SignalServiceEnvelope; +import org.session.libsignal.service.api.messages.SignalServiceGroup; +import org.session.libsignal.service.api.messages.SignalServiceNullMessage; +import org.session.libsignal.service.api.messages.SignalServiceReceiptMessage; +import org.session.libsignal.service.api.messages.SignalServiceTypingMessage; +import org.session.libsignal.service.api.messages.calls.AnswerMessage; +import org.session.libsignal.service.api.messages.calls.BusyMessage; +import org.session.libsignal.service.api.messages.calls.HangupMessage; +import org.session.libsignal.service.api.messages.calls.IceUpdateMessage; +import org.session.libsignal.service.api.messages.calls.OfferMessage; +import org.session.libsignal.service.api.messages.calls.SignalServiceCallMessage; +import org.session.libsignal.service.api.messages.multidevice.BlockedListMessage; +import org.session.libsignal.service.api.messages.multidevice.ContactsMessage; +import org.session.libsignal.service.api.messages.multidevice.ReadMessage; +import org.session.libsignal.service.api.messages.multidevice.RequestMessage; +import org.session.libsignal.service.api.messages.multidevice.SentTranscriptMessage; +import org.session.libsignal.service.api.messages.multidevice.SignalServiceSyncMessage; +import org.session.libsignal.service.api.messages.multidevice.StickerPackOperationMessage; +import org.session.libsignal.service.api.messages.multidevice.VerifiedMessage; +import org.session.libsignal.service.api.messages.multidevice.VerifiedMessage.VerifiedState; +import org.session.libsignal.service.api.messages.shared.SharedContact; +import org.session.libsignal.service.api.push.SignalServiceAddress; +import org.session.libsignal.service.internal.push.OutgoingPushMessage; +import org.session.libsignal.service.internal.push.PushTransportDetails; +import org.session.libsignal.service.internal.push.SignalServiceProtos; +import org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer; +import org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate; +import org.session.libsignal.service.internal.push.SignalServiceProtos.Content; +import org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage; +import org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope.Type; +import org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage; +import org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage; +import org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage; +import org.session.libsignal.service.internal.push.SignalServiceProtos.Verified; +import org.session.libsignal.service.internal.util.Base64; +import org.session.libsignal.service.loki.api.opengroups.PublicChat; +import org.session.libsignal.service.loki.protocol.closedgroups.ClosedGroupUtilities; +import org.session.libsignal.service.loki.protocol.closedgroups.SharedSenderKeysDatabaseProtocol; +import org.session.libsignal.service.loki.protocol.sessionmanagement.PreKeyBundleMessage; +import org.session.libsignal.service.loki.protocol.shelved.multidevice.DeviceLink; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage; +import static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.Type.DELIVER; + +/** + * This is used to decrypt received {@link SignalServiceEnvelope}s. + * + * @author Moxie Marlinspike + */ +public class SignalServiceCipher { + + @SuppressWarnings("unused") + private static final String TAG = SignalServiceCipher.class.getSimpleName(); + + private final SignalProtocolStore signalProtocolStore; + private final SessionResetProtocol sessionResetProtocol; + private final SharedSenderKeysDatabaseProtocol sskDatabase; + private final SignalServiceAddress localAddress; + private final CertificateValidator certificateValidator; + + public SignalServiceCipher(SignalServiceAddress localAddress, + SignalProtocolStore signalProtocolStore, + SharedSenderKeysDatabaseProtocol sskDatabase, + SessionResetProtocol sessionResetProtocol, + CertificateValidator certificateValidator) + { + this.signalProtocolStore = signalProtocolStore; + this.sessionResetProtocol = sessionResetProtocol; + this.sskDatabase = sskDatabase; + this.localAddress = localAddress; + this.certificateValidator = certificateValidator; + } + + public OutgoingPushMessage encrypt(SignalProtocolAddress destination, + Optional unidentifiedAccess, + byte[] unpaddedMessage) + throws UntrustedIdentityException, InvalidKeyException, IOException + { + if (unidentifiedAccess.isPresent() && sskDatabase.isSSKBasedClosedGroup(destination.getName())) { + String userPublicKey = localAddress.getNumber(); + SignalProtocolAddress signalProtocolAddress = new SignalProtocolAddress(userPublicKey, 1); + SealedSessionCipher sessionCipher = new SealedSessionCipher(signalProtocolStore, sessionResetProtocol, signalProtocolAddress); + PushTransportDetails transportDetails = new PushTransportDetails(sessionCipher.getSessionVersion(destination)); + byte[] plaintext = transportDetails.getPaddedMessageBody(unpaddedMessage); + byte[] ciphertext = ClosedGroupUtilities.encrypt(plaintext, destination.getName(), userPublicKey); + String body = Base64.encodeBytes(ciphertext); + int remoteRegistrationId = sessionCipher.getRemoteRegistrationId(destination); + return new OutgoingPushMessage(Type.CLOSED_GROUP_CIPHERTEXT_VALUE, destination.getDeviceId(), remoteRegistrationId, body); + } else if (unidentifiedAccess.isPresent()) { + SealedSessionCipher sessionCipher = new SealedSessionCipher(signalProtocolStore, sessionResetProtocol, new SignalProtocolAddress(localAddress.getNumber(), 1)); + PushTransportDetails transportDetails = new PushTransportDetails(sessionCipher.getSessionVersion(destination)); + byte[] ciphertext = sessionCipher.encrypt(destination, unidentifiedAccess.get().getUnidentifiedCertificate(), transportDetails.getPaddedMessageBody(unpaddedMessage)); + String body = Base64.encodeBytes(ciphertext); + int remoteRegistrationId = sessionCipher.getRemoteRegistrationId(destination); + + return new OutgoingPushMessage(Type.UNIDENTIFIED_SENDER_VALUE, destination.getDeviceId(), remoteRegistrationId, body); + } else { + SessionCipher sessionCipher = new SessionCipher(signalProtocolStore, destination); + PushTransportDetails transportDetails = new PushTransportDetails(sessionCipher.getSessionVersion()); + CiphertextMessage message = sessionCipher.encrypt(transportDetails.getPaddedMessageBody(unpaddedMessage)); + int remoteRegistrationId = sessionCipher.getRemoteRegistrationId(); + String body = Base64.encodeBytes(message.serialize()); + + int type; + + switch (message.getType()) { + case CiphertextMessage.PREKEY_TYPE: type = Type.PREKEY_BUNDLE_VALUE; break; + case CiphertextMessage.WHISPER_TYPE: type = Type.CIPHERTEXT_VALUE; break; + case CiphertextMessage.FALLBACK_MESSAGE_TYPE: type = Type.FALLBACK_MESSAGE_VALUE; break; + case CiphertextMessage.CLOSED_GROUP_CIPHERTEXT: type = Type.CLOSED_GROUP_CIPHERTEXT_VALUE; break; + default: throw new AssertionError("Bad type: " + message.getType()); + } + + return new OutgoingPushMessage(type, destination.getDeviceId(), remoteRegistrationId, body); + } + } + + /** + * Decrypt a received {@link SignalServiceEnvelope} + * + * @param envelope The received SignalServiceEnvelope + * + * @return a decrypted SignalServiceContent + */ + public SignalServiceContent decrypt(SignalServiceEnvelope envelope) + throws InvalidMetadataMessageException, InvalidMetadataVersionException, + ProtocolInvalidKeyIdException, ProtocolLegacyMessageException, + ProtocolUntrustedIdentityException, ProtocolNoSessionException, + ProtocolInvalidVersionException, ProtocolInvalidMessageException, + ProtocolInvalidKeyException, ProtocolDuplicateMessageException, + SelfSendException, IOException + + { + try { + Plaintext plaintext = decrypt(envelope, envelope.getContent()); + Content message = Content.parseFrom(plaintext.getData()); + + PreKeyBundleMessage preKeyBundleMessage = null; + if (message.hasPreKeyBundleMessage()) { + SignalServiceProtos.PreKeyBundleMessage protoPreKeyBundleMessage = message.getPreKeyBundleMessage(); + preKeyBundleMessage = new PreKeyBundleMessage(protoPreKeyBundleMessage.getIdentityKey().toByteArray(), + protoPreKeyBundleMessage.getDeviceId(), + protoPreKeyBundleMessage.getPreKeyId(), + protoPreKeyBundleMessage.getSignedKeyId(), + protoPreKeyBundleMessage.getPreKey().toByteArray(), + protoPreKeyBundleMessage.getSignedKey().toByteArray(), + protoPreKeyBundleMessage.getSignature().toByteArray() + ); + } + + if (message.hasDeviceLinkMessage()) { + SignalServiceProtos.DeviceLinkMessage protoDeviceLinkMessage = message.getDeviceLinkMessage(); + String masterPublicKey = protoDeviceLinkMessage.getPrimaryPublicKey(); + String slavePublicKey = protoDeviceLinkMessage.getSecondaryPublicKey(); + byte[] requestSignature = protoDeviceLinkMessage.hasRequestSignature() ? protoDeviceLinkMessage.getRequestSignature().toByteArray() : null; + byte[] authorizationSignature = protoDeviceLinkMessage.hasAuthorizationSignature() ? protoDeviceLinkMessage.getAuthorizationSignature().toByteArray() : null; + DeviceLink deviceLink = new DeviceLink(masterPublicKey, slavePublicKey, requestSignature, authorizationSignature); + Metadata metadata = plaintext.getMetadata(); + SignalServiceContent content = new SignalServiceContent(deviceLink, metadata.getSender(), metadata.getSenderDevice(), metadata.getTimestamp()); + + content.setPreKeyBundleMessage(preKeyBundleMessage); + + if (message.hasSyncMessage() && message.getSyncMessage().hasContacts()) { + SignalServiceSyncMessage syncMessage = createSynchronizeMessage(metadata, message.getSyncMessage()); + content.setSyncMessage(syncMessage); + } + + if (message.hasDataMessage()) { + setProfile(message.getDataMessage(), content); + SignalServiceDataMessage signalServiceDataMessage = createSignalServiceMessage(metadata, message.getDataMessage()); + content.setDataMessage(signalServiceDataMessage); + } + + return content; + } else if (message.hasDataMessage()) { + DataMessage dataMessage = message.getDataMessage(); + + SignalServiceDataMessage signalServiceDataMessage = createSignalServiceMessage(plaintext.getMetadata(), dataMessage); + SignalServiceContent content = new SignalServiceContent(signalServiceDataMessage, + plaintext.getMetadata().getSender(), + plaintext.getMetadata().getSenderDevice(), + plaintext.getMetadata().getTimestamp(), + plaintext.getMetadata().isNeedsReceipt(), + signalServiceDataMessage.isDeviceUnlinkingRequest()); + + content.setPreKeyBundleMessage(preKeyBundleMessage); + + setProfile(dataMessage, content); + + return content; + } else if (message.hasSyncMessage()) { + SignalServiceContent content = new SignalServiceContent(createSynchronizeMessage( + plaintext.getMetadata(), + message.getSyncMessage()), + plaintext.getMetadata().getSender(), + plaintext.getMetadata().getSenderDevice(), + plaintext.getMetadata().getTimestamp()); + + if (message.getSyncMessage().hasSent() && message.getSyncMessage().getSent().hasMessage()) { + DataMessage dataMessage = message.getSyncMessage().getSent().getMessage(); + setProfile(dataMessage, content); + } + + return content; + } else if (message.hasCallMessage()) { + return new SignalServiceContent(createCallMessage(message.getCallMessage()), + plaintext.getMetadata().getSender(), + plaintext.getMetadata().getSenderDevice(), + plaintext.getMetadata().getTimestamp()); + } else if (message.hasReceiptMessage()) { + return new SignalServiceContent(createReceiptMessage(plaintext.getMetadata(), message.getReceiptMessage()), + plaintext.getMetadata().getSender(), + plaintext.getMetadata().getSenderDevice(), + plaintext.getMetadata().getTimestamp()); + } else if (message.hasTypingMessage()) { + return new SignalServiceContent(createTypingMessage(plaintext.getMetadata(), message.getTypingMessage()), + plaintext.getMetadata().getSender(), + plaintext.getMetadata().getSenderDevice(), + plaintext.getMetadata().getTimestamp()); + } else if (message.hasNullMessage()) { + SignalServiceContent content = new SignalServiceContent(new SignalServiceNullMessage(), + plaintext.getMetadata().getSender(), + plaintext.getMetadata().getSenderDevice(), + plaintext.getMetadata().getTimestamp()); + + content.setPreKeyBundleMessage(preKeyBundleMessage); + + return content; + } + + return null; + } catch (InvalidProtocolBufferException e) { + throw new InvalidMetadataMessageException(e); + } + } + + private void setProfile(DataMessage message, SignalServiceContent content) { + if (!message.hasProfile()) { return; } + SignalServiceProtos.LokiUserProfile profile = message.getProfile(); + if (profile.hasDisplayName()) { content.setSenderDisplayName(profile.getDisplayName()); } + if (profile.hasProfilePictureURL()) { content.setSenderProfilePictureURL(profile.getProfilePictureURL()); } + } + + protected Plaintext decrypt(SignalServiceEnvelope envelope, byte[] ciphertext) + throws InvalidMetadataMessageException, InvalidMetadataVersionException, + ProtocolDuplicateMessageException, ProtocolUntrustedIdentityException, + ProtocolLegacyMessageException, ProtocolInvalidKeyException, + ProtocolInvalidVersionException, ProtocolInvalidMessageException, + ProtocolInvalidKeyIdException, ProtocolNoSessionException, + SelfSendException, IOException + { + try { + SignalProtocolAddress sourceAddress = new SignalProtocolAddress(envelope.getSource(), envelope.getSourceDevice()); + SessionCipher sessionCipher = new LokiSessionCipher(signalProtocolStore, sessionResetProtocol, sourceAddress); + SealedSessionCipher sealedSessionCipher = new SealedSessionCipher(signalProtocolStore, sessionResetProtocol, new SignalProtocolAddress(localAddress.getNumber(), 1)); + + byte[] paddedMessage; + Metadata metadata; + int sessionVersion; + + if (envelope.isClosedGroupCiphertext()) { + Pair plaintextAndSenderPublicKey = ClosedGroupUtilities.decrypt(envelope); + String senderPublicKey = plaintextAndSenderPublicKey.second(); + if (senderPublicKey.equals(localAddress.getNumber())) { throw new SelfSendException(); } // Will be caught and ignored in PushDecryptJob + paddedMessage = plaintextAndSenderPublicKey.first(); + metadata = new Metadata(senderPublicKey, envelope.getSourceDevice(), envelope.getTimestamp(), false); + sessionVersion = sessionCipher.getSessionVersion(); + } else if (envelope.isPreKeySignalMessage()) { + paddedMessage = sessionCipher.decrypt(new PreKeySignalMessage(ciphertext)); + metadata = new Metadata(envelope.getSource(), envelope.getSourceDevice(), envelope.getTimestamp(), false); + sessionVersion = sessionCipher.getSessionVersion(); + } else if (envelope.isSignalMessage()) { + paddedMessage = sessionCipher.decrypt(new SignalMessage(ciphertext)); + metadata = new Metadata(envelope.getSource(), envelope.getSourceDevice(), envelope.getTimestamp(), false); + sessionVersion = sessionCipher.getSessionVersion(); + } else if (envelope.isUnidentifiedSender()) { + Pair> results = sealedSessionCipher.decrypt(certificateValidator, ciphertext, envelope.getServerTimestamp(), envelope.getSource()); + Pair data = results.second(); + paddedMessage = data.second(); + metadata = new Metadata(results.first().getName(), results.first().getDeviceId(), envelope.getTimestamp(), false); + sessionVersion = sealedSessionCipher.getSessionVersion(new SignalProtocolAddress(metadata.getSender(), metadata.getSenderDevice())); + } else { + throw new InvalidMetadataMessageException("Unknown type: " + envelope.getType()); + } + + PushTransportDetails transportDetails = new PushTransportDetails(sessionVersion); + byte[] data = transportDetails.getStrippedPaddingMessageBody(paddedMessage); + + return new Plaintext(metadata, data); + } catch (DuplicateMessageException e) { + throw new ProtocolDuplicateMessageException(e, envelope.getSource(), envelope.getSourceDevice()); + } catch (LegacyMessageException e) { + throw new ProtocolLegacyMessageException(e, envelope.getSource(), envelope.getSourceDevice()); + } catch (InvalidMessageException e) { + throw new ProtocolInvalidMessageException(e, envelope.getSource(), envelope.getSourceDevice()); + } catch (InvalidKeyIdException e) { + throw new ProtocolInvalidKeyIdException(e, envelope.getSource(), envelope.getSourceDevice()); + } catch (InvalidKeyException e) { + throw new ProtocolInvalidKeyException(e, envelope.getSource(), envelope.getSourceDevice()); + } catch (UntrustedIdentityException e) { + throw new ProtocolUntrustedIdentityException(e, envelope.getSource(), envelope.getSourceDevice()); + } catch (InvalidVersionException e) { + throw new ProtocolInvalidVersionException(e, envelope.getSource(), envelope.getSourceDevice()); + } catch (NoSessionException e) { + throw new ProtocolNoSessionException(e, envelope.getSource(), envelope.getSourceDevice()); + } + } + + private SignalServiceDataMessage createSignalServiceMessage(Metadata metadata, DataMessage content) throws ProtocolInvalidMessageException { + SignalServiceGroup groupInfo = createGroupInfo(content); + List attachments = new LinkedList(); + boolean endSession = ((content.getFlags() & DataMessage.Flags.END_SESSION_VALUE ) != 0); + boolean expirationUpdate = ((content.getFlags() & DataMessage.Flags.EXPIRATION_TIMER_UPDATE_VALUE) != 0); + boolean profileKeyUpdate = ((content.getFlags() & DataMessage.Flags.PROFILE_KEY_UPDATE_VALUE ) != 0); + SignalServiceDataMessage.Quote quote = createQuote(content); + List sharedContacts = createSharedContacts(content); + List previews = createPreviews(content); + Sticker sticker = createSticker(content); + ClosedGroupUpdate closedGroupUpdate = content.getClosedGroupUpdate(); + boolean isDeviceUnlinkingRequest = ((content.getFlags() & DataMessage.Flags.DEVICE_UNLINKING_REQUEST_VALUE) != 0); + + for (AttachmentPointer pointer : content.getAttachmentsList()) { + attachments.add(createAttachmentPointer(pointer)); + } + + if (content.hasTimestamp() && content.getTimestamp() != metadata.getTimestamp()) { + throw new ProtocolInvalidMessageException(new InvalidMessageException("Timestamps don't match: " + content.getTimestamp() + " vs " + metadata.getTimestamp()), + metadata.getSender(), + metadata.getSenderDevice()); + } + + return new SignalServiceDataMessage(metadata.getTimestamp(), + groupInfo, + attachments, + content.getBody(), + endSession, + content.getExpireTimer(), + expirationUpdate, + content.hasProfileKey() ? content.getProfileKey().toByteArray() : null, + profileKeyUpdate, + quote, + sharedContacts, + previews, + sticker, + null, + null, + closedGroupUpdate, + isDeviceUnlinkingRequest); + } + + private SignalServiceSyncMessage createSynchronizeMessage(Metadata metadata, SyncMessage content) + throws ProtocolInvalidMessageException, ProtocolInvalidKeyException + { + if (content.hasSent()) { + SyncMessage.Sent sentContent = content.getSent(); + Map unidentifiedStatuses = new HashMap(); + + for (SyncMessage.Sent.UnidentifiedDeliveryStatus status : sentContent.getUnidentifiedStatusList()) { + unidentifiedStatuses.put(status.getDestination(), status.getUnidentified()); + } + + return SignalServiceSyncMessage.forSentTranscript(new SentTranscriptMessage(sentContent.getDestination(), + sentContent.getTimestamp(), + createSignalServiceMessage(metadata, sentContent.getMessage()), + sentContent.getExpirationStartTimestamp(), + unidentifiedStatuses)); + } + + if (content.hasRequest()) { + return SignalServiceSyncMessage.forRequest(new RequestMessage(content.getRequest())); + } + + if (content.getReadList().size() > 0) { + List readMessages = new LinkedList(); + + for (SyncMessage.Read read : content.getReadList()) { + readMessages.add(new ReadMessage(read.getSender(), read.getTimestamp())); + } + + return SignalServiceSyncMessage.forRead(readMessages); + } + + if (content.hasContacts()) { + SyncMessage.Contacts contacts = content.getContacts(); + ByteString data = contacts.getData(); + if (data != null && !data.isEmpty()) { + byte[] bytes = data.toByteArray(); + SignalServiceAttachmentStream attachmentStream = SignalServiceAttachment.newStreamBuilder() + .withStream(new ByteArrayInputStream(data.toByteArray())) + .withContentType("application/octet-stream") + .withLength(bytes.length) + .build(); + return SignalServiceSyncMessage.forContacts(new ContactsMessage(attachmentStream, contacts.getComplete())); + } + } + + if (content.hasGroups()) { + SyncMessage.Groups groups = content.getGroups(); + ByteString data = groups.getData(); + if (data != null && !data.isEmpty()) { + byte[] bytes = data.toByteArray(); + SignalServiceAttachmentStream attachmentStream = SignalServiceAttachment.newStreamBuilder() + .withStream(new ByteArrayInputStream(data.toByteArray())) + .withContentType("application/octet-stream") + .withLength(bytes.length) + .build(); + return SignalServiceSyncMessage.forGroups(attachmentStream); + } + } + + if (content.hasVerified()) { + try { + Verified verified = content.getVerified(); + String destination = verified.getDestination(); + IdentityKey identityKey = new IdentityKey(verified.getIdentityKey().toByteArray(), 0); + + VerifiedState verifiedState; + + if (verified.getState() == Verified.State.DEFAULT) { + verifiedState = VerifiedState.DEFAULT; + } else if (verified.getState() == Verified.State.VERIFIED) { + verifiedState = VerifiedState.VERIFIED; + } else if (verified.getState() == Verified.State.UNVERIFIED) { + verifiedState = VerifiedState.UNVERIFIED; + } else { + throw new ProtocolInvalidMessageException(new InvalidMessageException("Unknown state: " + verified.getState().getNumber()), + metadata.getSender(), metadata.getSenderDevice()); + } + + return SignalServiceSyncMessage.forVerified(new VerifiedMessage(destination, identityKey, verifiedState, System.currentTimeMillis())); + } catch (InvalidKeyException e) { + throw new ProtocolInvalidKeyException(e, metadata.getSender(), metadata.getSenderDevice()); + } + } + + if (content.getStickerPackOperationList().size() > 0) { + List operations = new LinkedList(); + + for (SyncMessage.StickerPackOperation operation : content.getStickerPackOperationList()) { + byte[] packId = operation.hasPackId() ? operation.getPackId().toByteArray() : null; + byte[] packKey = operation.hasPackKey() ? operation.getPackKey().toByteArray() : null; + StickerPackOperationMessage.Type type = null; + + if (operation.hasType()) { + switch (operation.getType()) { + case INSTALL: type = StickerPackOperationMessage.Type.INSTALL; break; + case REMOVE: type = StickerPackOperationMessage.Type.REMOVE; break; + } + } + operations.add(new StickerPackOperationMessage(packId, packKey, type)); + } + + return SignalServiceSyncMessage.forStickerPackOperations(operations); + } + + List openGroupDetails = content.getOpenGroupsList(); + if (openGroupDetails.size() > 0) { + List openGroups = new LinkedList<>(); + for (SyncMessage.OpenGroupDetails details : content.getOpenGroupsList()) { + openGroups.add(new PublicChat(details.getChannelID(), details.getUrl(), "", true)); + } + return SignalServiceSyncMessage.forOpenGroups(openGroups); + } + + if (content.hasBlocked()) { + SyncMessage.Blocked blocked = content.getBlocked(); + List publicKeys = blocked.getNumbersList(); + return SignalServiceSyncMessage.forBlocked(new BlockedListMessage(publicKeys, new ArrayList())); + } + + return SignalServiceSyncMessage.empty(); + } + + private SignalServiceCallMessage createCallMessage(CallMessage content) { + if (content.hasOffer()) { + CallMessage.Offer offerContent = content.getOffer(); + return SignalServiceCallMessage.forOffer(new OfferMessage(offerContent.getId(), offerContent.getDescription())); + } else if (content.hasAnswer()) { + CallMessage.Answer answerContent = content.getAnswer(); + return SignalServiceCallMessage.forAnswer(new AnswerMessage(answerContent.getId(), answerContent.getDescription())); + } else if (content.getIceUpdateCount() > 0) { + List iceUpdates = new LinkedList(); + + for (CallMessage.IceUpdate iceUpdate : content.getIceUpdateList()) { + iceUpdates.add(new IceUpdateMessage(iceUpdate.getId(), iceUpdate.getSdpMid(), iceUpdate.getSdpMLineIndex(), iceUpdate.getSdp())); + } + + return SignalServiceCallMessage.forIceUpdates(iceUpdates); + } else if (content.hasHangup()) { + CallMessage.Hangup hangup = content.getHangup(); + return SignalServiceCallMessage.forHangup(new HangupMessage(hangup.getId())); + } else if (content.hasBusy()) { + CallMessage.Busy busy = content.getBusy(); + return SignalServiceCallMessage.forBusy(new BusyMessage(busy.getId())); + } + + return SignalServiceCallMessage.empty(); + } + + private SignalServiceReceiptMessage createReceiptMessage(Metadata metadata, ReceiptMessage content) { + SignalServiceReceiptMessage.Type type; + + if (content.getType() == ReceiptMessage.Type.DELIVERY) type = SignalServiceReceiptMessage.Type.DELIVERY; + else if (content.getType() == ReceiptMessage.Type.READ) type = SignalServiceReceiptMessage.Type.READ; + else type = SignalServiceReceiptMessage.Type.UNKNOWN; + + return new SignalServiceReceiptMessage(type, content.getTimestampList(), metadata.getTimestamp()); + } + + private SignalServiceTypingMessage createTypingMessage(Metadata metadata, TypingMessage content) throws ProtocolInvalidMessageException { + SignalServiceTypingMessage.Action action; + + if (content.getAction() == TypingMessage.Action.STARTED) action = SignalServiceTypingMessage.Action.STARTED; + else if (content.getAction() == TypingMessage.Action.STOPPED) action = SignalServiceTypingMessage.Action.STOPPED; + else action = SignalServiceTypingMessage.Action.UNKNOWN; + + if (content.hasTimestamp() && content.getTimestamp() != metadata.getTimestamp()) { + throw new ProtocolInvalidMessageException(new InvalidMessageException("Timestamps don't match: " + content.getTimestamp() + " vs " + metadata.getTimestamp()), + metadata.getSender(), + metadata.getSenderDevice()); + } + + return new SignalServiceTypingMessage(action, content.getTimestamp(), + content.hasGroupId() ? Optional.of(content.getGroupId().toByteArray()) : + Optional.absent()); + } + + private SignalServiceDataMessage.Quote createQuote(DataMessage content) { + if (!content.hasQuote()) return null; + + List attachments = new LinkedList(); + + for (DataMessage.Quote.QuotedAttachment attachment : content.getQuote().getAttachmentsList()) { + attachments.add(new SignalServiceDataMessage.Quote.QuotedAttachment(attachment.getContentType(), + attachment.getFileName(), + attachment.hasThumbnail() ? createAttachmentPointer(attachment.getThumbnail()) : null)); + } + + return new SignalServiceDataMessage.Quote(content.getQuote().getId(), + new SignalServiceAddress(content.getQuote().getAuthor()), + content.getQuote().getText(), + attachments); + } + + private List createPreviews(DataMessage content) { + if (content.getPreviewCount() <= 0) return null; + + List results = new LinkedList(); + + for (DataMessage.Preview preview : content.getPreviewList()) { + SignalServiceAttachment attachment = null; + + if (preview.hasImage()) { + attachment = createAttachmentPointer(preview.getImage()); + } + + results.add(new Preview(preview.getUrl(), + preview.getTitle(), + Optional.fromNullable(attachment))); + } + + return results; + } + + private Sticker createSticker(DataMessage content) { + if (!content.hasSticker() || + !content.getSticker().hasPackId() || + !content.getSticker().hasPackKey() || + !content.getSticker().hasStickerId() || + !content.getSticker().hasData()) + { + return null; + } + + DataMessage.Sticker sticker = content.getSticker(); + + return new Sticker(sticker.getPackId().toByteArray(), + sticker.getPackKey().toByteArray(), + sticker.getStickerId(), + createAttachmentPointer(sticker.getData())); + } + + private List createSharedContacts(DataMessage content) { + if (content.getContactCount() <= 0) return null; + + List results = new LinkedList(); + + for (DataMessage.Contact contact : content.getContactList()) { + SharedContact.Builder builder = SharedContact.newBuilder() + .setName(SharedContact.Name.newBuilder() + .setDisplay(contact.getName().getDisplayName()) + .setFamily(contact.getName().getFamilyName()) + .setGiven(contact.getName().getGivenName()) + .setMiddle(contact.getName().getMiddleName()) + .setPrefix(contact.getName().getPrefix()) + .setSuffix(contact.getName().getSuffix()) + .build()); + + if (contact.getAddressCount() > 0) { + for (DataMessage.Contact.PostalAddress address : contact.getAddressList()) { + SharedContact.PostalAddress.Type type = SharedContact.PostalAddress.Type.HOME; + + switch (address.getType()) { + case WORK: type = SharedContact.PostalAddress.Type.WORK; break; + case HOME: type = SharedContact.PostalAddress.Type.HOME; break; + case CUSTOM: type = SharedContact.PostalAddress.Type.CUSTOM; break; + } + + builder.withAddress(SharedContact.PostalAddress.newBuilder() + .setCity(address.getCity()) + .setCountry(address.getCountry()) + .setLabel(address.getLabel()) + .setNeighborhood(address.getNeighborhood()) + .setPobox(address.getPobox()) + .setPostcode(address.getPostcode()) + .setRegion(address.getRegion()) + .setStreet(address.getStreet()) + .setType(type) + .build()); + } + } + + if (contact.getNumberCount() > 0) { + for (DataMessage.Contact.Phone phone : contact.getNumberList()) { + SharedContact.Phone.Type type = SharedContact.Phone.Type.HOME; + + switch (phone.getType()) { + case HOME: type = SharedContact.Phone.Type.HOME; break; + case WORK: type = SharedContact.Phone.Type.WORK; break; + case MOBILE: type = SharedContact.Phone.Type.MOBILE; break; + case CUSTOM: type = SharedContact.Phone.Type.CUSTOM; break; + } + + builder.withPhone(SharedContact.Phone.newBuilder() + .setLabel(phone.getLabel()) + .setType(type) + .setValue(phone.getValue()) + .build()); + } + } + + if (contact.getEmailCount() > 0) { + for (DataMessage.Contact.Email email : contact.getEmailList()) { + SharedContact.Email.Type type = SharedContact.Email.Type.HOME; + + switch (email.getType()) { + case HOME: type = SharedContact.Email.Type.HOME; break; + case WORK: type = SharedContact.Email.Type.WORK; break; + case MOBILE: type = SharedContact.Email.Type.MOBILE; break; + case CUSTOM: type = SharedContact.Email.Type.CUSTOM; break; + } + + builder.withEmail(SharedContact.Email.newBuilder() + .setLabel(email.getLabel()) + .setType(type) + .setValue(email.getValue()) + .build()); + } + } + + if (contact.hasAvatar()) { + builder.setAvatar(SharedContact.Avatar.newBuilder() + .withAttachment(createAttachmentPointer(contact.getAvatar().getAvatar())) + .withProfileFlag(contact.getAvatar().getIsProfile()) + .build()); + } + + if (contact.hasOrganization()) { + builder.withOrganization(contact.getOrganization()); + } + + results.add(builder.build()); + } + + return results; + } + + private SignalServiceAttachmentPointer createAttachmentPointer(AttachmentPointer pointer) { + return new SignalServiceAttachmentPointer(pointer.getId(), + pointer.getContentType(), + pointer.getKey().toByteArray(), + pointer.hasSize() ? Optional.of(pointer.getSize()) : Optional.absent(), + pointer.hasThumbnail() ? Optional.of(pointer.getThumbnail().toByteArray()): Optional.absent(), + pointer.getWidth(), pointer.getHeight(), + pointer.hasDigest() ? Optional.of(pointer.getDigest().toByteArray()) : Optional.absent(), + pointer.hasFileName() ? Optional.of(pointer.getFileName()) : Optional.absent(), + (pointer.getFlags() & AttachmentPointer.Flags.VOICE_MESSAGE_VALUE) != 0, + pointer.hasCaption() ? Optional.of(pointer.getCaption()) : Optional.absent(), + pointer.getUrl()); + + } + + private SignalServiceGroup createGroupInfo(DataMessage content) { + if (!content.hasGroup()) return null; + + SignalServiceGroup.Type type; + + switch (content.getGroup().getType()) { + case DELIVER: type = SignalServiceGroup.Type.DELIVER; break; + case UPDATE: type = SignalServiceGroup.Type.UPDATE; break; + case QUIT: type = SignalServiceGroup.Type.QUIT; break; + case REQUEST_INFO: type = SignalServiceGroup.Type.REQUEST_INFO; break; + default: type = SignalServiceGroup.Type.UNKNOWN; break; + } + + if (content.getGroup().getType() != DELIVER) { + String name = null; + List members = null; + SignalServiceAttachmentPointer avatar = null; + List admins = null; + + if (content.getGroup().hasName()) { + name = content.getGroup().getName(); + } + + if (content.getGroup().getMembersCount() > 0) { + members = content.getGroup().getMembersList(); + } + + if (content.getGroup().hasAvatar()) { + AttachmentPointer pointer = content.getGroup().getAvatar(); + + avatar = new SignalServiceAttachmentPointer(pointer.getId(), + pointer.getContentType(), + pointer.getKey().toByteArray(), + Optional.of(pointer.getSize()), + Optional.absent(), 0, 0, + Optional.fromNullable(pointer.hasDigest() ? pointer.getDigest().toByteArray() : null), + Optional.absent(), + false, + Optional.absent(), + pointer.getUrl()); + } + + if (content.getGroup().getAdminsCount() > 0) { + admins = content.getGroup().getAdminsList(); + } + + return new SignalServiceGroup(type, content.getGroup().getId().toByteArray(), SignalServiceGroup.GroupType.SIGNAL, name, members, avatar, admins); + } + + return new SignalServiceGroup(content.getGroup().getId().toByteArray(), SignalServiceGroup.GroupType.SIGNAL); + } + + protected static class Metadata { + private final String sender; + private final int senderDevice; + private final long timestamp; + private final boolean needsReceipt; + + public Metadata(String sender, int senderDevice, long timestamp, boolean needsReceipt) { + this.sender = sender; + this.senderDevice = senderDevice; + this.timestamp = timestamp; + this.needsReceipt = needsReceipt; + } + + public String getSender() { + return sender; + } + + public int getSenderDevice() { + return senderDevice; + } + + public long getTimestamp() { + return timestamp; + } + + public boolean isNeedsReceipt() { + return needsReceipt; + } + } + + protected static class Plaintext { + private final Metadata metadata; + private final byte[] data; + + public Plaintext(Metadata metadata, byte[] data) { + this.metadata = metadata; + this.data = data; + } + + public Metadata getMetadata() { + return metadata; + } + + public byte[] getData() { + return data; + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/crypto/UnidentifiedAccess.java b/libsignal/src/main/java/org/session/libsignal/service/api/crypto/UnidentifiedAccess.java new file mode 100644 index 000000000..518896ce0 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/crypto/UnidentifiedAccess.java @@ -0,0 +1,64 @@ +package org.session.libsignal.service.api.crypto; + + +import org.session.libsignal.metadata.certificate.InvalidCertificateException; +import org.session.libsignal.metadata.certificate.SenderCertificate; +import org.session.libsignal.libsignal.util.ByteUtil; + +import java.security.InvalidAlgorithmParameterException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; + +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.spec.GCMParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +public class UnidentifiedAccess { + + private final byte[] unidentifiedAccessKey; + private final SenderCertificate unidentifiedCertificate; + + public UnidentifiedAccess(byte[] unidentifiedAccessKey, byte[] unidentifiedCertificate) + throws InvalidCertificateException + { + this.unidentifiedAccessKey = unidentifiedAccessKey; + this.unidentifiedCertificate = new SenderCertificate(unidentifiedCertificate); + } + + public byte[] getUnidentifiedAccessKey() { + return unidentifiedAccessKey; + } + + public SenderCertificate getUnidentifiedCertificate() { + return unidentifiedCertificate; + } + + public static byte[] deriveAccessKeyFrom(byte[] profileKey) { + try { + byte[] nonce = new byte[12]; + byte[] input = new byte[16]; + + Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); + cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(profileKey, "AES"), new GCMParameterSpec(128, nonce)); + + byte[] ciphertext = cipher.doFinal(input); + + return ByteUtil.trim(ciphertext, 16); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (InvalidKeyException e) { + throw new AssertionError(e); + } catch (NoSuchPaddingException e) { + throw new AssertionError(e); + } catch (InvalidAlgorithmParameterException e) { + throw new AssertionError(e); + } catch (BadPaddingException e) { + throw new AssertionError(e); + } catch (IllegalBlockSizeException e) { + throw new AssertionError(e); + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/crypto/UnidentifiedAccessPair.java b/libsignal/src/main/java/org/session/libsignal/service/api/crypto/UnidentifiedAccessPair.java new file mode 100644 index 000000000..4fb6e8629 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/crypto/UnidentifiedAccessPair.java @@ -0,0 +1,23 @@ +package org.session.libsignal.service.api.crypto; + + +import org.session.libsignal.libsignal.util.guava.Optional; + +public class UnidentifiedAccessPair { + + private final Optional targetUnidentifiedAccess; + private final Optional selfUnidentifiedAccess; + + public UnidentifiedAccessPair(UnidentifiedAccess targetUnidentifiedAccess, UnidentifiedAccess selfUnidentifiedAccess) { + this.targetUnidentifiedAccess = Optional.of(targetUnidentifiedAccess); + this.selfUnidentifiedAccess = Optional.of(selfUnidentifiedAccess); + } + + public Optional getTargetUnidentifiedAccess() { + return targetUnidentifiedAccess; + } + + public Optional getSelfUnidentifiedAccess() { + return selfUnidentifiedAccess; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/crypto/UntrustedIdentityException.java b/libsignal/src/main/java/org/session/libsignal/service/api/crypto/UntrustedIdentityException.java new file mode 100644 index 000000000..8dc556b0a --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/crypto/UntrustedIdentityException.java @@ -0,0 +1,34 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.crypto; + +import org.session.libsignal.libsignal.IdentityKey; + +public class UntrustedIdentityException extends Exception { + + private final IdentityKey identityKey; + private final String e164number; + + public UntrustedIdentityException(String s, String e164number, IdentityKey identityKey) { + super(s); + this.e164number = e164number; + this.identityKey = identityKey; + } + + public UntrustedIdentityException(UntrustedIdentityException e) { + this(e.getMessage(), e.getE164Number(), e.getIdentityKey()); + } + + public IdentityKey getIdentityKey() { + return identityKey; + } + + public String getE164Number() { + return e164number; + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/SendMessageResult.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/SendMessageResult.java new file mode 100644 index 000000000..5c3da7404 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/SendMessageResult.java @@ -0,0 +1,100 @@ +package org.session.libsignal.service.api.messages; + + +import org.session.libsignal.libsignal.IdentityKey; +import org.session.libsignal.service.api.push.SignalServiceAddress; +import org.session.libsignal.service.loki.api.SnodeAPI; + +public class SendMessageResult { + + private final SignalServiceAddress address; + private final Success success; + private final boolean networkFailure; + private final boolean unregisteredFailure; + private final IdentityFailure identityFailure; + private final SnodeAPI.Error lokiAPIError; + + public static SendMessageResult success(SignalServiceAddress address, boolean unidentified, boolean needsSync) { + return new SendMessageResult(address, new Success(unidentified, needsSync), false, false, null, null); + } + + public static SendMessageResult lokiAPIError(SignalServiceAddress address, SnodeAPI.Error lokiAPIError) { + return new SendMessageResult(address, null, false, false, null, lokiAPIError); + } + + public static SendMessageResult networkFailure(SignalServiceAddress address) { + return new SendMessageResult(address, null, true, false, null, null); + } + + public static SendMessageResult unregisteredFailure(SignalServiceAddress address) { + return new SendMessageResult(address, null, false, true, null, null); + } + + public static SendMessageResult identityFailure(SignalServiceAddress address, IdentityKey identityKey) { + return new SendMessageResult(address, null, false, false, new IdentityFailure(identityKey), null); + } + + public SignalServiceAddress getAddress() { + return address; + } + + public Success getSuccess() { + return success; + } + + public boolean isNetworkFailure() { + return networkFailure; + } + + public boolean isUnregisteredFailure() { + return unregisteredFailure; + } + + public IdentityFailure getIdentityFailure() { + return identityFailure; + } + + public SnodeAPI.Error getLokiAPIError() { return lokiAPIError; } + + private SendMessageResult(SignalServiceAddress address, Success success, boolean networkFailure, boolean unregisteredFailure, IdentityFailure identityFailure, SnodeAPI.Error lokiAPIError) { + this.address = address; + this.success = success; + this.networkFailure = networkFailure; + this.unregisteredFailure = unregisteredFailure; + this.identityFailure = identityFailure; + this.lokiAPIError = lokiAPIError; + } + + public static class Success { + private final boolean unidentified; + private final boolean needsSync; + + private Success(boolean unidentified, boolean needsSync) { + this.unidentified = unidentified; + this.needsSync = needsSync; + } + + public boolean isUnidentified() { + return unidentified; + } + + public boolean isNeedsSync() { + return needsSync; + } + } + + public static class IdentityFailure { + private final IdentityKey identityKey; + + private IdentityFailure(IdentityKey identityKey) { + this.identityKey = identityKey; + } + + public IdentityKey getIdentityKey() { + return identityKey; + } + } + + + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceAttachment.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceAttachment.java new file mode 100644 index 000000000..04217da2e --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceAttachment.java @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.messages; + +import org.session.libsignal.libsignal.util.guava.Optional; +import org.session.libsignal.service.api.messages.SignalServiceAttachmentPointer; +import org.session.libsignal.service.api.messages.SignalServiceAttachmentStream; + +import java.io.InputStream; + +public abstract class SignalServiceAttachment { + + private final String contentType; + + protected SignalServiceAttachment(String contentType) { + this.contentType = contentType; + } + + public String getContentType() { + return contentType; + } + + public abstract boolean isStream(); + public abstract boolean isPointer(); + + public SignalServiceAttachmentStream asStream() { + return (SignalServiceAttachmentStream)this; + } + + public SignalServiceAttachmentPointer asPointer() { + return (SignalServiceAttachmentPointer)this; + } + + public static Builder newStreamBuilder() { + return new Builder(); + } + + public static class Builder { + + private InputStream inputStream; + private String contentType; + private String fileName; + private long length; + private ProgressListener listener; + private boolean voiceNote; + private int width; + private int height; + private String caption; + + private Builder() {} + + public Builder withStream(InputStream inputStream) { + this.inputStream = inputStream; + return this; + } + + public Builder withContentType(String contentType) { + this.contentType = contentType; + return this; + } + + public Builder withLength(long length) { + this.length = length; + return this; + } + + public Builder withFileName(String fileName) { + this.fileName = fileName; + return this; + } + + public Builder withListener(ProgressListener listener) { + this.listener = listener; + return this; + } + + public Builder withVoiceNote(boolean voiceNote) { + this.voiceNote = voiceNote; + return this; + } + + public Builder withWidth(int width) { + this.width = width; + return this; + } + + public Builder withHeight(int height) { + this.height = height; + return this; + } + + public Builder withCaption(String caption) { + this.caption = caption; + return this; + } + + public SignalServiceAttachmentStream build() { + if (inputStream == null) throw new IllegalArgumentException("Must specify stream!"); + if (contentType == null) throw new IllegalArgumentException("No content type specified!"); + if (length == 0) throw new IllegalArgumentException("No length specified!"); + + return new SignalServiceAttachmentStream(inputStream, contentType, length, Optional.fromNullable(fileName), voiceNote, Optional.absent(), width, height, Optional.fromNullable(caption), listener); + } + } + + /** + * An interface to receive progress information on upload/download of + * an attachment. + */ + public interface ProgressListener { + /** + * Called on a progress change event. + * + * @param total The total amount to transmit/receive in bytes. + * @param progress The amount that has been transmitted/received in bytes thus far + */ + public void onAttachmentProgress(long total, long progress); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceAttachmentPointer.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceAttachmentPointer.java new file mode 100644 index 000000000..f8a859b3b --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceAttachmentPointer.java @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2014-2017 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.messages; + +import org.session.libsignal.libsignal.util.guava.Optional; +import org.session.libsignal.service.api.SignalServiceMessageReceiver; + +/** + * Represents a received SignalServiceAttachment "handle." This + * is a pointer to the actual attachment content, which needs to be + * retrieved using {@link SignalServiceMessageReceiver#retrieveAttachment(SignalServiceAttachmentPointer, java.io.File, int)} + * + * @author Moxie Marlinspike + */ +public class SignalServiceAttachmentPointer extends SignalServiceAttachment { + + private final long id; + private final byte[] key; + private final Optional size; + private final Optional preview; + private final Optional digest; + private final Optional fileName; + private final boolean voiceNote; + private final int width; + private final int height; + private final Optional caption; + private final String url; + + public SignalServiceAttachmentPointer(long id, String contentType, byte[] key, + Optional size, Optional preview, + int width, int height, + Optional digest, Optional fileName, + boolean voiceNote, Optional caption, String url) + { + super(contentType); + this.id = id; + this.key = key; + this.size = size; + this.preview = preview; + this.width = width; + this.height = height; + this.digest = digest; + this.fileName = fileName; + this.voiceNote = voiceNote; + this.caption = caption; + this.url = url; + } + + public long getId() { + return id; + } + + public byte[] getKey() { + return key; + } + + @Override + public boolean isStream() { + return false; + } + + @Override + public boolean isPointer() { + return true; + } + + public Optional getSize() { + return size; + } + + public Optional getFileName() { + return fileName; + } + + public Optional getPreview() { + return preview; + } + + public Optional getDigest() { + return digest; + } + + public boolean getVoiceNote() { + return voiceNote; + } + + public int getWidth() { + return width; + } + + public int getHeight() { + return height; + } + + public Optional getCaption() { + return caption; + } + + public String getUrl() { return url; } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceAttachmentStream.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceAttachmentStream.java new file mode 100644 index 000000000..10848781a --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceAttachmentStream.java @@ -0,0 +1,90 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.messages; + +import org.session.libsignal.libsignal.util.guava.Optional; + +import java.io.InputStream; + +/** + * Represents a local SignalServiceAttachment to be sent. + */ +public class SignalServiceAttachmentStream extends SignalServiceAttachment { + + private final InputStream inputStream; + private final long length; + private final Optional fileName; + private final ProgressListener listener; + private final Optional preview; + private final boolean voiceNote; + private final int width; + private final int height; + private final Optional caption; + + public SignalServiceAttachmentStream(InputStream inputStream, String contentType, long length, Optional fileName, boolean voiceNote, ProgressListener listener) { + this(inputStream, contentType, length, fileName, voiceNote, Optional.absent(), 0, 0, Optional.absent(), listener); + } + + public SignalServiceAttachmentStream(InputStream inputStream, String contentType, long length, Optional fileName, boolean voiceNote, Optional preview, int width, int height, Optional caption, ProgressListener listener) { + super(contentType); + this.inputStream = inputStream; + this.length = length; + this.fileName = fileName; + this.listener = listener; + this.voiceNote = voiceNote; + this.preview = preview; + this.width = width; + this.height = height; + this.caption = caption; + } + + @Override + public boolean isStream() { + return true; + } + + @Override + public boolean isPointer() { + return false; + } + + public InputStream getInputStream() { + return inputStream; + } + + public long getLength() { + return length; + } + + public Optional getFileName() { + return fileName; + } + + public ProgressListener getListener() { + return listener; + } + + public Optional getPreview() { + return preview; + } + + public boolean getVoiceNote() { + return voiceNote; + } + + public int getWidth() { + return width; + } + + public int getHeight() { + return height; + } + + public Optional getCaption() { + return caption; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceContent.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceContent.java new file mode 100644 index 000000000..5d5e02a9f --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceContent.java @@ -0,0 +1,196 @@ +/* + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.messages; + +import org.session.libsignal.libsignal.util.guava.Optional; +import org.session.libsignal.service.api.messages.SignalServiceDataMessage; +import org.session.libsignal.service.api.messages.SignalServiceNullMessage; +import org.session.libsignal.service.api.messages.SignalServiceReceiptMessage; +import org.session.libsignal.service.api.messages.SignalServiceTypingMessage; +import org.session.libsignal.service.api.messages.calls.SignalServiceCallMessage; +import org.session.libsignal.service.api.messages.multidevice.SignalServiceSyncMessage; +import org.session.libsignal.service.loki.protocol.shelved.multidevice.DeviceLink; +import org.session.libsignal.service.loki.protocol.sessionmanagement.PreKeyBundleMessage; + +public class SignalServiceContent { + private final String sender; + private final int senderDevice; + private final long timestamp; + private final boolean needsReceipt; + + // Loki + private final boolean isDeviceUnlinkingRequest; + + private Optional message; + private Optional synchronizeMessage; + private final Optional callMessage; + private final Optional nullMessage; + private final Optional readMessage; + private final Optional typingMessage; + + // Loki + private final Optional deviceLink; + public Optional preKeyBundleMessage = Optional.absent(); + public Optional senderDisplayName = Optional.absent(); + public Optional senderProfilePictureURL = Optional.absent(); + + public SignalServiceContent(SignalServiceDataMessage message, String sender, int senderDevice, long timestamp, boolean needsReceipt, boolean isDeviceUnlinkingRequest) { + this.sender = sender; + this.senderDevice = senderDevice; + this.timestamp = timestamp; + this.needsReceipt = needsReceipt; + this.message = Optional.fromNullable(message); + this.synchronizeMessage = Optional.absent(); + this.callMessage = Optional.absent(); + this.nullMessage = Optional.absent(); + this.readMessage = Optional.absent(); + this.typingMessage = Optional.absent(); + this.deviceLink = Optional.absent(); + this.isDeviceUnlinkingRequest = isDeviceUnlinkingRequest; + } + + public SignalServiceContent(SignalServiceSyncMessage synchronizeMessage, String sender, int senderDevice, long timestamp) { + this.sender = sender; + this.senderDevice = senderDevice; + this.timestamp = timestamp; + this.needsReceipt = false; + this.message = Optional.absent(); + this.synchronizeMessage = Optional.fromNullable(synchronizeMessage); + this.callMessage = Optional.absent(); + this.nullMessage = Optional.absent(); + this.readMessage = Optional.absent(); + this.typingMessage = Optional.absent(); + this.deviceLink = Optional.absent(); + this.isDeviceUnlinkingRequest = false; + } + + public SignalServiceContent(SignalServiceCallMessage callMessage, String sender, int senderDevice, long timestamp) { + this.sender = sender; + this.senderDevice = senderDevice; + this.timestamp = timestamp; + this.needsReceipt = false; + this.message = Optional.absent(); + this.synchronizeMessage = Optional.absent(); + this.callMessage = Optional.of(callMessage); + this.nullMessage = Optional.absent(); + this.readMessage = Optional.absent(); + this.typingMessage = Optional.absent(); + this.deviceLink = Optional.absent(); + this.isDeviceUnlinkingRequest = false; + } + + public SignalServiceContent(SignalServiceReceiptMessage receiptMessage, String sender, int senderDevice, long timestamp) { + this.sender = sender; + this.senderDevice = senderDevice; + this.timestamp = timestamp; + this.needsReceipt = false; + this.message = Optional.absent(); + this.synchronizeMessage = Optional.absent(); + this.callMessage = Optional.absent(); + this.nullMessage = Optional.absent(); + this.readMessage = Optional.of(receiptMessage); + this.typingMessage = Optional.absent(); + this.deviceLink = Optional.absent(); + this.isDeviceUnlinkingRequest = false; + } + + public SignalServiceContent(SignalServiceTypingMessage typingMessage, String sender, int senderDevice, long timestamp) { + this.sender = sender; + this.senderDevice = senderDevice; + this.timestamp = timestamp; + this.needsReceipt = false; + this.message = Optional.absent(); + this.synchronizeMessage = Optional.absent(); + this.callMessage = Optional.absent(); + this.nullMessage = Optional.absent(); + this.readMessage = Optional.absent(); + this.typingMessage = Optional.of(typingMessage); + this.deviceLink = Optional.absent(); + this.isDeviceUnlinkingRequest = false; + } + + public SignalServiceContent(DeviceLink deviceLink, String sender, int senderDevice, long timestamp) { + this.sender = sender; + this.senderDevice = senderDevice; + this.timestamp = timestamp; + this.needsReceipt = false; + this.message = Optional.absent(); + this.synchronizeMessage = Optional.absent(); + this.callMessage = Optional.absent(); + this.nullMessage = Optional.absent(); + this.readMessage = Optional.absent(); + this.typingMessage = Optional.absent(); + this.deviceLink = Optional.fromNullable(deviceLink); + this.isDeviceUnlinkingRequest = false; + } + + public SignalServiceContent(SignalServiceNullMessage nullMessage, String sender, int senderDevice, long timestamp) { + this.sender = sender; + this.senderDevice = senderDevice; + this.timestamp = timestamp; + this.needsReceipt = false; + this.message = Optional.absent(); + this.synchronizeMessage = Optional.absent(); + this.callMessage = Optional.absent(); + this.nullMessage = Optional.of(nullMessage); + this.readMessage = Optional.absent(); + this.typingMessage = Optional.absent(); + this.deviceLink = Optional.absent(); + this.isDeviceUnlinkingRequest = false; + } + + public Optional getDataMessage() { + return message; + } + + public void setDataMessage(SignalServiceDataMessage message) { this.message = Optional.fromNullable(message); } + + public Optional getSyncMessage() { return synchronizeMessage; } + + public void setSyncMessage(SignalServiceSyncMessage message) { this.synchronizeMessage = Optional.fromNullable(message); } + + public Optional getCallMessage() { + return callMessage; + } + + public Optional getReceiptMessage() { + return readMessage; + } + + public Optional getTypingMessage() { + return typingMessage; + } + + public String getSender() { + return sender; + } + + public int getSenderDevice() { + return senderDevice; + } + + public long getTimestamp() { + return timestamp; + } + + public boolean isNeedsReceipt() { + return needsReceipt; + } + + public Optional getNullMessage() { return nullMessage; } + + // Loki + public boolean isDeviceUnlinkingRequest() { return isDeviceUnlinkingRequest; } + + public Optional getDeviceLink() { return deviceLink; } + + public void setPreKeyBundleMessage(PreKeyBundleMessage preKeyBundleMessage) { this.preKeyBundleMessage = Optional.fromNullable(preKeyBundleMessage); } + + public void setSenderDisplayName(String displayName) { senderDisplayName = Optional.fromNullable(displayName); } + + public void setSenderProfilePictureURL(String url) { senderProfilePictureURL = Optional.fromNullable(url); } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceDataMessage.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceDataMessage.java new file mode 100644 index 000000000..8eda2084a --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceDataMessage.java @@ -0,0 +1,524 @@ +/* + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.messages; + +import org.session.libsignal.libsignal.state.PreKeyBundle; +import org.session.libsignal.libsignal.util.guava.Optional; +import org.session.libsignal.service.api.messages.shared.SharedContact; +import org.session.libsignal.service.api.push.SignalServiceAddress; +import org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate; +import org.session.libsignal.service.loki.protocol.meta.TTLUtilities; +import org.session.libsignal.service.loki.protocol.shelved.multidevice.DeviceLink; + +import java.util.LinkedList; +import java.util.List; + +/** + * Represents a decrypted Signal Service data message. + */ +public class SignalServiceDataMessage { + private final long timestamp; + private final Optional> attachments; + private final Optional body; + public final Optional group; + private final Optional profileKey; + private final boolean endSession; + private final boolean expirationUpdate; + private final int expiresInSeconds; + private final boolean profileKeyUpdate; + private final Optional quote; + public final Optional> contacts; + private final Optional> previews; + private final Optional sticker; + // Loki + private final Optional preKeyBundle; + private final Optional deviceLink; + private final Optional closedGroupUpdate; + private final boolean isDeviceUnlinkingRequest; + + /** + * Construct a SignalServiceDataMessage with a body and no attachments. + * + * @param timestamp The sent timestamp. + * @param body The message contents. + */ + public SignalServiceDataMessage(long timestamp, String body) { + this(timestamp, body, 0); + } + + /** + * Construct an expiring SignalServiceDataMessage with a body and no attachments. + * + * @param timestamp The sent timestamp. + * @param body The message contents. + * @param expiresInSeconds The number of seconds in which the message should expire after having been seen. + */ + public SignalServiceDataMessage(long timestamp, String body, int expiresInSeconds) { + this(timestamp, (List)null, body, expiresInSeconds); + } + + + public SignalServiceDataMessage(final long timestamp, final SignalServiceAttachment attachment, final String body) { + this(timestamp, new LinkedList() {{add(attachment);}}, body); + } + + /** + * Construct a SignalServiceDataMessage with a body and list of attachments. + * + * @param timestamp The sent timestamp. + * @param attachments The attachments. + * @param body The message contents. + */ + public SignalServiceDataMessage(long timestamp, List attachments, String body) { + this(timestamp, attachments, body, 0); + } + + /** + * Construct an expiring SignalServiceDataMessage with a body and list of attachments. + * + * @param timestamp The sent timestamp. + * @param attachments The attachments. + * @param body The message contents. + * @param expiresInSeconds The number of seconds in which the message should expire after having been seen. + */ + public SignalServiceDataMessage(long timestamp, List attachments, String body, int expiresInSeconds) { + this(timestamp, null, attachments, body, expiresInSeconds); + } + + /** + * Construct a SignalServiceDataMessage group message with attachments and body. + * + * @param timestamp The sent timestamp. + * @param group The group information. + * @param attachments The attachments. + * @param body The message contents. + */ + public SignalServiceDataMessage(long timestamp, SignalServiceGroup group, List attachments, String body) { + this(timestamp, group, attachments, body, 0); + } + + + /** + * Construct an expiring SignalServiceDataMessage group message with attachments and body. + * + * @param timestamp The sent timestamp. + * @param group The group information. + * @param attachments The attachments. + * @param body The message contents. + * @param expiresInSeconds The number of seconds in which a message should disappear after having been seen. + */ + public SignalServiceDataMessage(long timestamp, SignalServiceGroup group, List attachments, String body, int expiresInSeconds) { + this(timestamp, group, attachments, body, false, expiresInSeconds, false, null, false, null, null, null, null); + } + + /** + * Construct a SignalServiceDataMessage. + * + * @param timestamp The sent timestamp. + * @param group The group information (or null if none). + * @param attachments The attachments (or null if none). + * @param body The message contents. + * @param endSession Flag indicating whether this message should close a session. + * @param expiresInSeconds Number of seconds in which the message should disappear after being seen. + */ + public SignalServiceDataMessage(long timestamp, SignalServiceGroup group, + List attachments, + String body, boolean endSession, int expiresInSeconds, + boolean expirationUpdate, byte[] profileKey, boolean profileKeyUpdate, + Quote quote, List sharedContacts, List previews, + Sticker sticker) + { + this(timestamp, group, attachments, body, endSession, expiresInSeconds, expirationUpdate, profileKey, profileKeyUpdate, quote, sharedContacts, previews, sticker, null, null, null, false); + } + + /** + * Construct a SignalServiceDataMessage. + * + * @param timestamp The sent timestamp. + * @param group The group information (or null if none). + * @param attachments The attachments (or null if none). + * @param body The message contents. + * @param endSession Flag indicating whether this message should close a session. + * @param expiresInSeconds Number of seconds in which the message should disappear after being seen. + * @param preKeyBundle The pre key bundle to attach to this message (or null if none). + */ + public SignalServiceDataMessage(long timestamp, SignalServiceGroup group, + List attachments, + String body, boolean endSession, int expiresInSeconds, + boolean expirationUpdate, byte[] profileKey, boolean profileKeyUpdate, + Quote quote, List sharedContacts, List previews, + Sticker sticker, PreKeyBundle preKeyBundle, DeviceLink deviceLink, + ClosedGroupUpdate closedGroupUpdate, boolean isDeviceUnlinkingRequest) + { + this.timestamp = timestamp; + this.body = Optional.fromNullable(body); + this.group = Optional.fromNullable(group); + this.endSession = endSession; + this.expiresInSeconds = expiresInSeconds; + this.expirationUpdate = expirationUpdate; + this.profileKey = Optional.fromNullable(profileKey); + this.profileKeyUpdate = profileKeyUpdate; + this.quote = Optional.fromNullable(quote); + this.sticker = Optional.fromNullable(sticker); + this.preKeyBundle = Optional.fromNullable(preKeyBundle); + this.deviceLink = Optional.fromNullable(deviceLink); + this.closedGroupUpdate = Optional.fromNullable(closedGroupUpdate); + this.isDeviceUnlinkingRequest = isDeviceUnlinkingRequest; + + if (attachments != null && !attachments.isEmpty()) { + this.attachments = Optional.of(attachments); + } else { + this.attachments = Optional.absent(); + } + + if (sharedContacts != null && !sharedContacts.isEmpty()) { + this.contacts = Optional.of(sharedContacts); + } else { + this.contacts = Optional.absent(); + } + + if (previews != null && !previews.isEmpty()) { + this.previews = Optional.of(previews); + } else { + this.previews = Optional.absent(); + } + } + + public static Builder newBuilder() { + return new Builder(); + } + + /** + * @return The message timestamp. + */ + public long getTimestamp() { + return timestamp; + } + + /** + * @return The message attachments (if any). + */ + public Optional> getAttachments() { + return attachments; + } + + /** + * @return The message body (if any). + */ + public Optional getBody() { + return body; + } + + /** + * @return The message group info (if any). + */ + public Optional getGroupInfo() { + return group; + } + + public boolean isEndSession() { + return endSession; + } + + public boolean isExpirationUpdate() { + return expirationUpdate; + } + + public boolean isProfileKeyUpdate() { + return profileKeyUpdate; + } + + public boolean isGroupMessage() { + return group.isPresent(); + } + + public boolean isGroupUpdate() { + return group.isPresent() && group.get().getType() != SignalServiceGroup.Type.DELIVER; + } + + public int getExpiresInSeconds() { return expiresInSeconds; } + + public Optional getProfileKey() { + return profileKey; + } + + public Optional getQuote() { + return quote; + } + + public Optional> getSharedContacts() { + return contacts; + } + + public Optional> getPreviews() { + return previews; + } + + public Optional getSticker() { + return sticker; + } + + // Loki + public boolean isDeviceUnlinkingRequest() { + return isDeviceUnlinkingRequest; + } + + public Optional getClosedGroupUpdate() { return closedGroupUpdate; } + + public Optional getPreKeyBundle() { return preKeyBundle; } + + public Optional getDeviceLink() { return deviceLink; } + + public boolean hasVisibleContent() { + return (body.isPresent() && !body.get().isEmpty()) + || (attachments.isPresent() && !attachments.get().isEmpty()); + } + + public int getTTL() { + if (deviceLink.isPresent()) { return TTLUtilities.getTTL(TTLUtilities.MessageType.DeviceLink); } + else if (isDeviceUnlinkingRequest) { return TTLUtilities.getTTL(TTLUtilities.MessageType.DeviceUnlinkingRequest); } + return TTLUtilities.getTTL(TTLUtilities.MessageType.Regular); + } + + public static class Builder { + private List attachments = new LinkedList(); + private List sharedContacts = new LinkedList(); + private List previews = new LinkedList(); + + private long timestamp; + private SignalServiceGroup group; + private String body; + private boolean endSession; + private int expiresInSeconds; + private boolean expirationUpdate; + private byte[] profileKey; + private boolean profileKeyUpdate; + private Quote quote; + private Sticker sticker; + private PreKeyBundle preKeyBundle; + private DeviceLink deviceLink; + private boolean isDeviceUnlinkingRequest; + + private Builder() {} + + public Builder withTimestamp(long timestamp) { + this.timestamp = timestamp; + return this; + } + + public Builder asGroupMessage(SignalServiceGroup group) { + this.group = group; + return this; + } + + public Builder withAttachment(SignalServiceAttachment attachment) { + this.attachments.add(attachment); + return this; + } + + public Builder withAttachments(List attachments) { + this.attachments.addAll(attachments); + return this; + } + + public Builder withBody(String body) { + this.body = body; + return this; + } + + public Builder asEndSessionMessage() { + return asEndSessionMessage(true); + } + + public Builder asEndSessionMessage(boolean endSession) { + this.endSession = endSession; + return this; + } + + public Builder asExpirationUpdate() { + return asExpirationUpdate(true); + } + + public Builder asExpirationUpdate(boolean expirationUpdate) { + this.expirationUpdate = expirationUpdate; + return this; + } + + public Builder withExpiration(int expiresInSeconds) { + this.expiresInSeconds = expiresInSeconds; + return this; + } + + public Builder withProfileKey(byte[] profileKey) { + this.profileKey = profileKey; + return this; + } + + public Builder asProfileKeyUpdate(boolean profileKeyUpdate) { + this.profileKeyUpdate = profileKeyUpdate; + return this; + } + + public Builder withQuote(Quote quote) { + this.quote = quote; + return this; + } + + public Builder withSharedContact(SharedContact contact) { + this.sharedContacts.add(contact); + return this; + } + + public Builder withSharedContacts(List contacts) { + this.sharedContacts.addAll(contacts); + return this; + } + + public Builder withPreviews(List previews) { + this.previews.addAll(previews); + return this; + } + + public Builder withSticker(Sticker sticker) { + this.sticker = sticker; + return this; + } + + public Builder withPreKeyBundle(PreKeyBundle preKeyBundle) { + this.preKeyBundle = preKeyBundle; + return this; + } + + public Builder withDeviceLink(DeviceLink deviceLink) { + this.deviceLink = deviceLink; + return this; + } + + public Builder asDeviceUnlinkingRequest(boolean isDeviceUnlinkingRequest) { + this.isDeviceUnlinkingRequest = isDeviceUnlinkingRequest; + return this; + } + + public SignalServiceDataMessage build() { + if (timestamp == 0) timestamp = System.currentTimeMillis(); + // closedGroupUpdate is always null because we don't use SignalServiceDataMessage to send them (we use ClosedGroupUpdateMessageSendJob) + return new SignalServiceDataMessage(timestamp, group, attachments, body, endSession, + expiresInSeconds, expirationUpdate, profileKey, + profileKeyUpdate, quote, sharedContacts, previews, + sticker, preKeyBundle, deviceLink, + null, isDeviceUnlinkingRequest); + } + } + + public static class Quote { + private final long id; + private final SignalServiceAddress author; + private final String text; + private final List attachments; + + public Quote(long id, SignalServiceAddress author, String text, List attachments) { + this.id = id; + this.author = author; + this.text = text; + this.attachments = attachments; + } + + public long getId() { + return id; + } + + public SignalServiceAddress getAuthor() { + return author; + } + + public String getText() { + return text; + } + + public List getAttachments() { + return attachments; + } + + public static class QuotedAttachment { + private final String contentType; + private final String fileName; + private final SignalServiceAttachment thumbnail; + + public QuotedAttachment(String contentType, String fileName, SignalServiceAttachment thumbnail) { + this.contentType = contentType; + this.fileName = fileName; + this.thumbnail = thumbnail; + } + + public String getContentType() { + return contentType; + } + + public String getFileName() { + return fileName; + } + + public SignalServiceAttachment getThumbnail() { + return thumbnail; + } + } + } + + public static class Preview { + private final String url; + private final String title; + private final Optional image; + + public Preview(String url, String title, Optional image) { + this.url = url; + this.title = title; + this.image = image; + } + + public String getUrl() { + return url; + } + + public String getTitle() { + return title; + } + + public Optional getImage() { + return image; + } + } + + public static class Sticker { + private final byte[] packId; + private final byte[] packKey; + private final int stickerId; + private final SignalServiceAttachment attachment; + + public Sticker(byte[] packId, byte[] packKey, int stickerId, SignalServiceAttachment attachment) { + this.packId = packId; + this.packKey = packKey; + this.stickerId = stickerId; + this.attachment = attachment; + } + + public byte[] getPackId() { + return packId; + } + + public byte[] getPackKey() { + return packKey; + } + + public int getStickerId() { + return stickerId; + } + + public SignalServiceAttachment getAttachment() { + return attachment; + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceEnvelope.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceEnvelope.java new file mode 100644 index 000000000..8a50f3adc --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceEnvelope.java @@ -0,0 +1,348 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.messages; + +import com.google.protobuf.ByteString; + +import org.session.libsignal.libsignal.InvalidVersionException; +import org.session.libsignal.libsignal.logging.Log; +import org.session.libsignal.service.api.push.SignalServiceAddress; +import org.session.libsignal.service.internal.push.SignalServiceProtos; +import org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope; +import org.session.libsignal.service.internal.util.Base64; +import org.session.libsignal.service.internal.util.Hex; + +import java.io.IOException; +import java.security.InvalidAlgorithmParameterException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.util.Arrays; + +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.Mac; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +/** + * This class represents an encrypted Signal Service envelope. + * + * The envelope contains the wrapping information, such as the sender, the + * message timestamp, the encrypted message type, etc. + * + * @author Moxie Marlinspike + */ +public class SignalServiceEnvelope { + + private static final String TAG = SignalServiceEnvelope.class.getSimpleName(); + + private static final int SUPPORTED_VERSION = 1; + private static final int CIPHER_KEY_SIZE = 32; + private static final int MAC_KEY_SIZE = 20; + private static final int MAC_SIZE = 10; + + private static final int VERSION_OFFSET = 0; + private static final int VERSION_LENGTH = 1; + private static final int IV_OFFSET = VERSION_OFFSET + VERSION_LENGTH; + private static final int IV_LENGTH = 16; + private static final int CIPHERTEXT_OFFSET = IV_OFFSET + IV_LENGTH; + + private final Envelope envelope; + + /** + * Construct an envelope from a serialized, Base64 encoded SignalServiceEnvelope, encrypted + * with a signaling key. + * + * @param message The serialized SignalServiceEnvelope, base64 encoded and encrypted. + * @param signalingKey The signaling key. + * @throws IOException + * @throws InvalidVersionException + */ + public SignalServiceEnvelope(String message, String signalingKey, boolean isSignalingKeyEncrypted) + throws IOException, InvalidVersionException + { + this(Base64.decode(message), signalingKey, isSignalingKeyEncrypted); + } + + /** + * Construct an envelope from a serialized SignalServiceEnvelope, encrypted with a signaling key. + * + * @param input The serialized and (optionally) encrypted SignalServiceEnvelope. + * @param signalingKey The signaling key. + * @throws InvalidVersionException + * @throws IOException + */ + public SignalServiceEnvelope(byte[] input, String signalingKey, boolean isSignalingKeyEncrypted) + throws InvalidVersionException, IOException + { + if (!isSignalingKeyEncrypted) { + this.envelope = Envelope.parseFrom(input); + } else { + if (input.length < VERSION_LENGTH || input[VERSION_OFFSET] != SUPPORTED_VERSION) { + throw new InvalidVersionException("Unsupported version!"); + } + + SecretKeySpec cipherKey = getCipherKey(signalingKey); + SecretKeySpec macKey = getMacKey(signalingKey); + + verifyMac(input, macKey); + + this.envelope = Envelope.parseFrom(getPlaintext(input, cipherKey)); + } + } + + public SignalServiceEnvelope(Envelope proto) { + Envelope.Builder builder = Envelope.newBuilder(); + builder.setType(Envelope.Type.valueOf(proto.getType().getNumber())); + if (proto.getSource() != null) { + builder.setSource(proto.getSource()); + } + if (proto.getSourceDevice() > 0) { + builder.setSourceDevice(proto.getSourceDevice()); + } + builder.setTimestamp(proto.getTimestamp()); + builder.setServerTimestamp(proto.getServerTimestamp()); + if (proto.getServerGuid() != null) { + builder.setServerGuid(proto.getServerGuid()); + } + if (proto.getLegacyMessage() != null) { + builder.setLegacyMessage(ByteString.copyFrom(proto.getLegacyMessage().toByteArray())); + } + if (proto.getContent() != null) { + builder.setContent(ByteString.copyFrom(proto.getContent().toByteArray())); + } + this.envelope = builder.build(); + } + + public SignalServiceEnvelope(int type, String sender, int senderDevice, long timestamp, byte[] legacyMessage, byte[] content, long serverTimestamp, String uuid) { + Envelope.Builder builder = Envelope.newBuilder() + .setType(Envelope.Type.valueOf(type)) + .setSource(sender) + .setSourceDevice(senderDevice) + .setTimestamp(timestamp) + .setServerTimestamp(serverTimestamp); + + if (uuid != null) { + builder.setServerGuid(uuid); + } + + if (legacyMessage != null) builder.setLegacyMessage(ByteString.copyFrom(legacyMessage)); + if (content != null) builder.setContent(ByteString.copyFrom(content)); + + this.envelope = builder.build(); + } + + public SignalServiceEnvelope(int type, long timestamp, byte[] legacyMessage, byte[] content, long serverTimestamp, String uuid) { + Envelope.Builder builder = Envelope.newBuilder() + .setType(Envelope.Type.valueOf(type)) + .setTimestamp(timestamp) + .setServerTimestamp(serverTimestamp); + + if (uuid != null) { + builder.setServerGuid(uuid); + } + + if (legacyMessage != null) builder.setLegacyMessage(ByteString.copyFrom(legacyMessage)); + if (content != null) builder.setContent(ByteString.copyFrom(content)); + + this.envelope = builder.build(); + } + + public String getUuid() { + return envelope.getServerGuid(); + } + + public boolean hasUuid() { + return envelope.hasServerGuid(); + } + + public boolean hasSource() { + return envelope.hasSource() && envelope.getSource().length() > 0; + } + + /** + * @return The envelope's sender. + */ + public String getSource() { + return envelope.getSource(); + } + + public boolean hasSourceDevice() { + return envelope.hasSourceDevice(); + } + + /** + * @return The envelope's sender device ID. + */ + public int getSourceDevice() { + return envelope.getSourceDevice(); + } + + /** + * @return The envelope's sender as a SignalServiceAddress. + */ + public SignalServiceAddress getSourceAddress() { + return new SignalServiceAddress(envelope.getSource()); + } + + /** + * @return The envelope content type. + */ + public int getType() { + return envelope.getType().getNumber(); + } + + /** + * @return The timestamp this envelope was sent. + */ + public long getTimestamp() { + return envelope.getTimestamp(); + } + + public long getServerTimestamp() { + return envelope.getServerTimestamp(); + } + + /** + * @return Whether the envelope contains a SignalServiceDataMessage + */ + public boolean hasLegacyMessage() { + return envelope.hasLegacyMessage(); + } + + /** + * @return The envelope's containing SignalService message. + */ + public byte[] getLegacyMessage() { + return envelope.getLegacyMessage().toByteArray(); + } + + /** + * @return Whether the envelope contains an encrypted SignalServiceContent + */ + public boolean hasContent() { + return envelope.hasContent(); + } + + /** + * @return The envelope's encrypted SignalServiceContent. + */ + public byte[] getContent() { + return envelope.getContent().toByteArray(); + } + + /** + * @return true if the containing message is a {@link org.session.libsignal.libsignal.protocol.SignalMessage} + */ + public boolean isSignalMessage() { + return envelope.getType().getNumber() == Envelope.Type.CIPHERTEXT_VALUE; + } + + /** + * @return true if the containing message is a {@link org.session.libsignal.libsignal.protocol.PreKeySignalMessage} + */ + public boolean isPreKeySignalMessage() { + return envelope.getType().getNumber() == Envelope.Type.PREKEY_BUNDLE_VALUE; + } + + /** + * @return true if the containing message is a delivery receipt. + */ + public boolean isReceipt() { + return envelope.getType().getNumber() == Envelope.Type.RECEIPT_VALUE; + } + + public boolean isUnidentifiedSender() { + return envelope.getType().getNumber() == Envelope.Type.UNIDENTIFIED_SENDER_VALUE; + } + + public boolean isFallbackMessage() { + return envelope.getType().getNumber() == Envelope.Type.FALLBACK_MESSAGE_VALUE; + } + + public boolean isClosedGroupCiphertext() { + return envelope.getType().getNumber() == Envelope.Type.CLOSED_GROUP_CIPHERTEXT_VALUE; + } + + private byte[] getPlaintext(byte[] ciphertext, SecretKeySpec cipherKey) throws IOException { + try { + byte[] ivBytes = new byte[IV_LENGTH]; + System.arraycopy(ciphertext, IV_OFFSET, ivBytes, 0, ivBytes.length); + IvParameterSpec iv = new IvParameterSpec(ivBytes); + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(Cipher.DECRYPT_MODE, cipherKey, iv); + + return cipher.doFinal(ciphertext, CIPHERTEXT_OFFSET, + ciphertext.length - VERSION_LENGTH - IV_LENGTH - MAC_SIZE); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (NoSuchPaddingException e) { + throw new AssertionError(e); + } catch (InvalidKeyException e) { + throw new AssertionError(e); + } catch (InvalidAlgorithmParameterException e) { + throw new AssertionError(e); + } catch (IllegalBlockSizeException e) { + throw new AssertionError(e); + } catch (BadPaddingException e) { + Log.w(TAG, e); + throw new IOException("Bad padding?"); + } + } + + private void verifyMac(byte[] ciphertext, SecretKeySpec macKey) throws IOException { + try { + Mac mac = Mac.getInstance("HmacSHA256"); + mac.init(macKey); + + if (ciphertext.length < MAC_SIZE + 1) + throw new IOException("Invalid MAC!"); + + mac.update(ciphertext, 0, ciphertext.length - MAC_SIZE); + + byte[] ourMacFull = mac.doFinal(); + byte[] ourMacBytes = new byte[MAC_SIZE]; + System.arraycopy(ourMacFull, 0, ourMacBytes, 0, ourMacBytes.length); + + byte[] theirMacBytes = new byte[MAC_SIZE]; + System.arraycopy(ciphertext, ciphertext.length-MAC_SIZE, theirMacBytes, 0, theirMacBytes.length); + + Log.w(TAG, "Our MAC: " + Hex.toString(ourMacBytes)); + Log.w(TAG, "Thr MAC: " + Hex.toString(theirMacBytes)); + + if (!Arrays.equals(ourMacBytes, theirMacBytes)) { + throw new IOException("Invalid MAC compare!"); + } + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (InvalidKeyException e) { + throw new AssertionError(e); + } + } + + + private SecretKeySpec getCipherKey(String signalingKey) throws IOException { + byte[] signalingKeyBytes = Base64.decode(signalingKey); + byte[] cipherKey = new byte[CIPHER_KEY_SIZE]; + System.arraycopy(signalingKeyBytes, 0, cipherKey, 0, cipherKey.length); + + return new SecretKeySpec(cipherKey, "AES"); + } + + + private SecretKeySpec getMacKey(String signalingKey) throws IOException { + byte[] signalingKeyBytes = Base64.decode(signalingKey); + byte[] macKey = new byte[MAC_KEY_SIZE]; + System.arraycopy(signalingKeyBytes, CIPHER_KEY_SIZE, macKey, 0, macKey.length); + + return new SecretKeySpec(macKey, "HmacSHA256"); + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceGroup.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceGroup.java new file mode 100644 index 000000000..b64c80a0f --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceGroup.java @@ -0,0 +1,168 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.messages; + +import org.session.libsignal.libsignal.util.guava.Optional; +import org.session.libsignal.service.api.messages.SignalServiceAttachment; + +import java.util.List; + +/** + * Group information to include in SignalServiceMessages destined to groups. + * + * This class represents a "context" that is included with Signal Service messages + * to make them group messages. There are three types of context: + * + * 1) Update -- Sent when either creating a group, or updating the properties + * of a group (such as the avatar icon, membership list, or title). + * 2) Deliver -- Sent when a message is to be delivered to an existing group. + * 3) Quit -- Sent when the sender wishes to leave an existing group. + * + * @author Moxie Marlinspike + */ +public class SignalServiceGroup { + + public enum GroupType { + SIGNAL, + PUBLIC_CHAT, + RSS_FEED + } + + public enum Type { + UNKNOWN, + UPDATE, + DELIVER, + QUIT, + REQUEST_INFO + } + + private final byte[] groupId; + private final GroupType groupType; + private final Type type; + private final Optional name; + private final Optional> members; + private final Optional avatar; + private final Optional> admins; + + + /** + * Construct a DELIVER group context. + * @param groupId + */ + public SignalServiceGroup(byte[] groupId, GroupType groupType) { + this(Type.DELIVER, groupId, groupType, null, null, null, null); + } + + /** + * Construct a group context. + * @param type The group message type (update, deliver, quit). + * @param groupId The group ID. + * @param name The group title. + * @param members The group membership list. + * @param avatar The group avatar icon. + */ + public SignalServiceGroup(Type type, byte[] groupId, GroupType groupType, String name, + List members, + SignalServiceAttachment avatar, + List admins) + { + this.type = type; + this.groupId = groupId; + this.groupType = groupType; + this.name = Optional.fromNullable(name); + this.members = Optional.fromNullable(members); + this.avatar = Optional.fromNullable(avatar); + this.admins = Optional.fromNullable(admins); + } + + public byte[] getGroupId() { + return groupId; + } + + public GroupType getGroupType() { return groupType; } + + public Type getType() { + return type; + } + + public Optional getName() { + return name; + } + + public Optional> getMembers() { + return members; + } + + public Optional getAvatar() { + return avatar; + } + + public Optional> getAdmins() { + return admins; + } + + public static Builder newUpdateBuilder() { + return new Builder(Type.UPDATE); + } + + public static Builder newBuilder(Type type) { + return new Builder(type); + } + + public static class Builder { + + private GroupType groupType; + private Type type; + private byte[] id; + private String name; + private List members; + private SignalServiceAttachment avatar; + private List admins; + + private Builder(Type type) { + this.type = type; + } + + public Builder withId(byte[] id, GroupType type) { + this.id = id; + this.groupType = type; + return this; + } + + public Builder withName(String name) { + this.name = name; + return this; + } + + public Builder withMembers(List members) { + this.members = members; + return this; + } + + public Builder withAvatar(SignalServiceAttachment avatar) { + this.avatar = avatar; + return this; + } + + public Builder withAdmins(List admins) { + this.admins = admins; + return this; + } + + public SignalServiceGroup build() { + if (id == null) throw new IllegalArgumentException("No group ID specified!"); + + if (type == Type.UPDATE && name == null && members == null && avatar == null && admins == null) { + throw new IllegalArgumentException("Group update with no updates!"); + } + + return new SignalServiceGroup(type, id, groupType, name, members, avatar, admins); + } + + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceNullMessage.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceNullMessage.java new file mode 100644 index 000000000..5baf134e8 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceNullMessage.java @@ -0,0 +1,8 @@ +package org.session.libsignal.service.api.messages; + +import org.session.libsignal.service.loki.protocol.meta.TTLUtilities; + +public class SignalServiceNullMessage { + + public int getTTL() { return TTLUtilities.getTTL(TTLUtilities.MessageType.Ephemeral); } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceReceiptMessage.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceReceiptMessage.java new file mode 100644 index 000000000..50836573c --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceReceiptMessage.java @@ -0,0 +1,45 @@ +package org.session.libsignal.service.api.messages; + + +import org.session.libsignal.service.loki.protocol.meta.TTLUtilities; + +import java.util.List; + +public class SignalServiceReceiptMessage { + + public enum Type { + UNKNOWN, DELIVERY, READ + } + + private final Type type; + private final List timestamps; + private final long when; + + public SignalServiceReceiptMessage(Type type, List timestamps, long when) { + this.type = type; + this.timestamps = timestamps; + this.when = when; + } + + public Type getType() { + return type; + } + + public List getTimestamps() { + return timestamps; + } + + public long getWhen() { + return when; + } + + public boolean isDeliveryReceipt() { + return type == Type.DELIVERY; + } + + public boolean isReadReceipt() { + return type == Type.READ; + } + + public int getTTL() { return TTLUtilities.getTTL(TTLUtilities.MessageType.Receipt); } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceStickerManifest.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceStickerManifest.java new file mode 100644 index 000000000..d9fe5d315 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceStickerManifest.java @@ -0,0 +1,56 @@ +package org.session.libsignal.service.api.messages; + +import org.session.libsignal.libsignal.util.guava.Optional; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class SignalServiceStickerManifest { + + private final Optional title; + private final Optional author; + private final Optional cover; + private final List stickers; + + public SignalServiceStickerManifest(String title, String author, StickerInfo cover, List stickers) { + this.title = Optional.of(title); + this.author = Optional.of(author); + this.cover = Optional.of(cover); + this.stickers = (stickers == null) ? Collections.emptyList() : new ArrayList(stickers); + } + + public Optional getTitle() { + return title; + } + + public Optional getAuthor() { + return author; + } + + public Optional getCover() { + return cover; + } + + public List getStickers() { + return stickers; + } + + public static final class StickerInfo { + private final int id; + private final String emoji; + + public StickerInfo(int id, String emoji) { + this.id = id; + this.emoji = emoji; + } + + public int getId() { + return id; + } + + public String getEmoji() { + return emoji; + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceTypingMessage.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceTypingMessage.java new file mode 100644 index 000000000..5763d40d7 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/SignalServiceTypingMessage.java @@ -0,0 +1,43 @@ +package org.session.libsignal.service.api.messages; + +import org.session.libsignal.libsignal.util.guava.Optional; +import org.session.libsignal.service.loki.protocol.meta.TTLUtilities; + +public class SignalServiceTypingMessage { + + public enum Action { + UNKNOWN, STARTED, STOPPED + } + + private final Action action; + private final long timestamp; + private final Optional groupId; + + public SignalServiceTypingMessage(Action action, long timestamp, Optional groupId) { + this.action = action; + this.timestamp = timestamp; + this.groupId = groupId; + } + + public Action getAction() { + return action; + } + + public long getTimestamp() { + return timestamp; + } + + public Optional getGroupId() { + return groupId; + } + + public boolean isTypingStarted() { + return action == Action.STARTED; + } + + public boolean isTypingStopped() { + return action == Action.STOPPED; + } + + public int getTTL() { return TTLUtilities.getTTL(TTLUtilities.MessageType.TypingIndicator); } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/calls/AnswerMessage.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/calls/AnswerMessage.java new file mode 100644 index 000000000..693f9cd96 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/calls/AnswerMessage.java @@ -0,0 +1,21 @@ +package org.session.libsignal.service.api.messages.calls; + + +public class AnswerMessage { + + private final long id; + private final String description; + + public AnswerMessage(long id, String description) { + this.id = id; + this.description = description; + } + + public String getDescription() { + return description; + } + + public long getId() { + return id; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/calls/BusyMessage.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/calls/BusyMessage.java new file mode 100644 index 000000000..c46aad066 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/calls/BusyMessage.java @@ -0,0 +1,15 @@ +package org.session.libsignal.service.api.messages.calls; + + +public class BusyMessage { + + private final long id; + + public BusyMessage(long id) { + this.id = id; + } + + public long getId() { + return id; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/calls/HangupMessage.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/calls/HangupMessage.java new file mode 100644 index 000000000..d790116ba --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/calls/HangupMessage.java @@ -0,0 +1,15 @@ +package org.session.libsignal.service.api.messages.calls; + + +public class HangupMessage { + + private final long id; + + public HangupMessage(long id) { + this.id = id; + } + + public long getId() { + return id; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/calls/IceUpdateMessage.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/calls/IceUpdateMessage.java new file mode 100644 index 000000000..626840c72 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/calls/IceUpdateMessage.java @@ -0,0 +1,33 @@ +package org.session.libsignal.service.api.messages.calls; + + +public class IceUpdateMessage { + + private final long id; + private final String sdpMid; + private final int sdpMLineIndex; + private final String sdp; + + public IceUpdateMessage(long id, String sdpMid, int sdpMLineIndex, String sdp) { + this.id = id; + this.sdpMid = sdpMid; + this.sdpMLineIndex = sdpMLineIndex; + this.sdp = sdp; + } + + public String getSdpMid() { + return sdpMid; + } + + public int getSdpMLineIndex() { + return sdpMLineIndex; + } + + public String getSdp() { + return sdp; + } + + public long getId() { + return id; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/calls/OfferMessage.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/calls/OfferMessage.java new file mode 100644 index 000000000..50ea445c8 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/calls/OfferMessage.java @@ -0,0 +1,21 @@ +package org.session.libsignal.service.api.messages.calls; + + +public class OfferMessage { + + private final long id; + private final String description; + + public OfferMessage(long id, String description) { + this.id = id; + this.description = description; + } + + public String getDescription() { + return description; + } + + public long getId() { + return id; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/calls/SignalServiceCallMessage.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/calls/SignalServiceCallMessage.java new file mode 100644 index 000000000..ddb321675 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/calls/SignalServiceCallMessage.java @@ -0,0 +1,111 @@ +package org.session.libsignal.service.api.messages.calls; + +import org.session.libsignal.libsignal.util.guava.Optional; +import org.session.libsignal.service.loki.protocol.meta.TTLUtilities; + +import java.util.LinkedList; +import java.util.List; + +public class SignalServiceCallMessage { + + private final Optional offerMessage; + private final Optional answerMessage; + private final Optional hangupMessage; + private final Optional busyMessage; + private final Optional> iceUpdateMessages; + + private SignalServiceCallMessage(Optional offerMessage, + Optional answerMessage, + Optional> iceUpdateMessages, + Optional hangupMessage, + Optional busyMessage) + { + this.offerMessage = offerMessage; + this.answerMessage = answerMessage; + this.iceUpdateMessages = iceUpdateMessages; + this.hangupMessage = hangupMessage; + this.busyMessage = busyMessage; + } + + public static SignalServiceCallMessage forOffer(OfferMessage offerMessage) { + return new SignalServiceCallMessage(Optional.of(offerMessage), + Optional.absent(), + Optional.>absent(), + Optional.absent(), + Optional.absent()); + } + + public static SignalServiceCallMessage forAnswer(AnswerMessage answerMessage) { + return new SignalServiceCallMessage(Optional.absent(), + Optional.of(answerMessage), + Optional.>absent(), + Optional.absent(), + Optional.absent()); + } + + public static SignalServiceCallMessage forIceUpdates(List iceUpdateMessages) { + return new SignalServiceCallMessage(Optional.absent(), + Optional.absent(), + Optional.of(iceUpdateMessages), + Optional.absent(), + Optional.absent()); + } + + public static SignalServiceCallMessage forIceUpdate(final IceUpdateMessage iceUpdateMessage) { + List iceUpdateMessages = new LinkedList(); + iceUpdateMessages.add(iceUpdateMessage); + + return new SignalServiceCallMessage(Optional.absent(), + Optional.absent(), + Optional.of(iceUpdateMessages), + Optional.absent(), + Optional.absent()); + } + + public static SignalServiceCallMessage forHangup(HangupMessage hangupMessage) { + return new SignalServiceCallMessage(Optional.absent(), + Optional.absent(), + Optional.>absent(), + Optional.of(hangupMessage), + Optional.absent()); + } + + public static SignalServiceCallMessage forBusy(BusyMessage busyMessage) { + return new SignalServiceCallMessage(Optional.absent(), + Optional.absent(), + Optional.>absent(), + Optional.absent(), + Optional.of(busyMessage)); + } + + + public static SignalServiceCallMessage empty() { + return new SignalServiceCallMessage(Optional.absent(), + Optional.absent(), + Optional.>absent(), + Optional.absent(), + Optional.absent()); + } + + public Optional> getIceUpdateMessages() { + return iceUpdateMessages; + } + + public Optional getAnswerMessage() { + return answerMessage; + } + + public Optional getOfferMessage() { + return offerMessage; + } + + public Optional getHangupMessage() { + return hangupMessage; + } + + public Optional getBusyMessage() { + return busyMessage; + } + + public int getTTL() { return TTLUtilities.getTTL(TTLUtilities.MessageType.Call); } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/calls/TurnServerInfo.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/calls/TurnServerInfo.java new file mode 100644 index 000000000..33f1ec316 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/calls/TurnServerInfo.java @@ -0,0 +1,30 @@ +package org.session.libsignal.service.api.messages.calls; + + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; + +public class TurnServerInfo { + + @JsonProperty + private String username; + + @JsonProperty + private String password; + + @JsonProperty + private List urls; + + public String getUsername() { + return username; + } + + public String getPassword() { + return password; + } + + public List getUrls() { + return urls; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/BlockedListMessage.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/BlockedListMessage.java new file mode 100644 index 000000000..1b9ed301c --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/BlockedListMessage.java @@ -0,0 +1,22 @@ +package org.session.libsignal.service.api.messages.multidevice; + +import java.util.List; + +public class BlockedListMessage { + + private final List numbers; + private final List groupIds; + + public BlockedListMessage(List numbers, List groupIds) { + this.numbers = numbers; + this.groupIds = groupIds; + } + + public List getNumbers() { + return numbers; + } + + public List getGroupIds() { + return groupIds; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/ChunkedInputStream.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/ChunkedInputStream.java new file mode 100644 index 000000000..45d3c2bf5 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/ChunkedInputStream.java @@ -0,0 +1,128 @@ +package org.session.libsignal.service.api.messages.multidevice; + +import org.session.libsignal.service.internal.util.Util; + +import java.io.FilterInputStream; +import java.io.IOException; +import java.io.InputStream; + +public class ChunkedInputStream { + + protected final InputStream in; + + public ChunkedInputStream(InputStream in) { + this.in = in; + } + + protected int readInt32() throws IOException { + try { + byte[] bytes = new byte[4]; + Util.readFully(in, bytes); + return bytes[0] << 24 | (bytes[1] & 0xFF) << 16 | (bytes[2] & 0xFF) << 8 | (bytes[3] & 0xFF); + } catch (IndexOutOfBoundsException e) { + throw new IOException(e); + } + } + + protected int readRawVarint32() throws IOException { + byte tmp = (byte)in.read(); + if (tmp >= 0) { + return tmp; + } + int result = tmp & 0x7f; + if ((tmp = (byte)in.read()) >= 0) { + result |= tmp << 7; + } else { + result |= (tmp & 0x7f) << 7; + if ((tmp = (byte)in.read()) >= 0) { + result |= tmp << 14; + } else { + result |= (tmp & 0x7f) << 14; + if ((tmp = (byte)in.read()) >= 0) { + result |= tmp << 21; + } else { + result |= (tmp & 0x7f) << 21; + result |= (tmp = (byte)in.read()) << 28; + if (tmp < 0) { + // Discard upper 32 bits. + for (int i = 0; i < 5; i++) { + if ((byte)in.read() >= 0) { + return result; + } + } + + throw new IOException("Malformed varint!"); + } + } + } + } + + return result; + } + + protected static final class LimitedInputStream extends FilterInputStream { + + private long left; + private long mark = -1; + + LimitedInputStream(InputStream in, long limit) { + super(in); + left = limit; + } + + @Override public int available() throws IOException { + return (int) Math.min(in.available(), left); + } + + // it's okay to mark even if mark isn't supported, as reset won't work + @Override public synchronized void mark(int readLimit) { + in.mark(readLimit); + mark = left; + } + + @Override public int read() throws IOException { + if (left == 0) { + return -1; + } + + int result = in.read(); + if (result != -1) { + --left; + } + return result; + } + + @Override public int read(byte[] b, int off, int len) throws IOException { + if (left == 0) { + return -1; + } + + len = (int) Math.min(len, left); + int result = in.read(b, off, len); + if (result != -1) { + left -= result; + } + return result; + } + + @Override public synchronized void reset() throws IOException { + if (!in.markSupported()) { + throw new IOException("Mark not supported"); + } + if (mark == -1) { + throw new IOException("Mark not set"); + } + + in.reset(); + left = mark; + } + + @Override public long skip(long n) throws IOException { + n = Math.min(n, left); + long skipped = in.skip(n); + left -= skipped; + return skipped; + } + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/ChunkedOutputStream.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/ChunkedOutputStream.java new file mode 100644 index 000000000..d5c77f6eb --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/ChunkedOutputStream.java @@ -0,0 +1,41 @@ +package org.session.libsignal.service.api.messages.multidevice; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +public class ChunkedOutputStream { + + protected final OutputStream out; + + public ChunkedOutputStream(OutputStream out) { + this.out = out; + } + + protected void writeVarint32(int value) throws IOException { + while (true) { + if ((value & ~0x7F) == 0) { + out.write(value); + return; + } else { + out.write((value & 0x7F) | 0x80); + value >>>= 7; + } + } + } + + protected void writeStream(InputStream in) throws IOException { + byte[] buffer = new byte[4096]; + int read; + + while ((read = in.read(buffer)) != -1) { + out.write(buffer, 0, read); + } + + in.close(); + } + + protected byte[] toByteArray(int value) { + return new byte[] { (byte)(value >> 24), (byte)(value >> 16), (byte)(value >> 8), (byte)value }; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/ConfigurationMessage.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/ConfigurationMessage.java new file mode 100644 index 000000000..8873e5429 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/ConfigurationMessage.java @@ -0,0 +1,39 @@ +package org.session.libsignal.service.api.messages.multidevice; + + +import org.session.libsignal.libsignal.util.guava.Optional; + +public class ConfigurationMessage { + + private final Optional readReceipts; + private final Optional unidentifiedDeliveryIndicators; + private final Optional typingIndicators; + private final Optional linkPreviews; + + public ConfigurationMessage(Optional readReceipts, + Optional unidentifiedDeliveryIndicators, + Optional typingIndicators, + Optional linkPreviews) + { + this.readReceipts = readReceipts; + this.unidentifiedDeliveryIndicators = unidentifiedDeliveryIndicators; + this.typingIndicators = typingIndicators; + this.linkPreviews = linkPreviews; + } + + public Optional getReadReceipts() { + return readReceipts; + } + + public Optional getUnidentifiedDeliveryIndicators() { + return unidentifiedDeliveryIndicators; + } + + public Optional getTypingIndicators() { + return typingIndicators; + } + + public Optional getLinkPreviews() { + return linkPreviews; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/ContactsMessage.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/ContactsMessage.java new file mode 100644 index 000000000..2cbb9871d --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/ContactsMessage.java @@ -0,0 +1,23 @@ +package org.session.libsignal.service.api.messages.multidevice; + + +import org.session.libsignal.service.api.messages.SignalServiceAttachment; + +public class ContactsMessage { + + private final SignalServiceAttachment contacts; + private final boolean complete; + + public ContactsMessage(SignalServiceAttachment contacts, boolean complete) { + this.contacts = contacts; + this.complete = complete; + } + + public SignalServiceAttachment getContactsStream() { + return contacts; + } + + public boolean isComplete() { + return complete; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/DeviceContact.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/DeviceContact.java new file mode 100644 index 000000000..df35a24c3 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/DeviceContact.java @@ -0,0 +1,73 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.messages.multidevice; + +import org.session.libsignal.libsignal.util.guava.Optional; +import org.session.libsignal.service.api.messages.SignalServiceAttachmentStream; +import org.session.libsignal.service.api.messages.multidevice.VerifiedMessage; + +public class DeviceContact { + + private final String number; + private final Optional name; + private final Optional avatar; + private final Optional color; + private final Optional verified; + private final Optional profileKey; + private final boolean blocked; + private final Optional expirationTimer; + + public DeviceContact(String number, Optional name, + Optional avatar, + Optional color, + Optional verified, + Optional profileKey, + boolean blocked, + Optional expirationTimer) + { + this.number = number; + this.name = name; + this.avatar = avatar; + this.color = color; + this.verified = verified; + this.profileKey = profileKey; + this.blocked = blocked; + this.expirationTimer = expirationTimer; + } + + public Optional getAvatar() { + return avatar; + } + + public Optional getName() { + return name; + } + + public String getNumber() { + return number; + } + + public Optional getColor() { + return color; + } + + public Optional getVerified() { + return verified; + } + + public Optional getProfileKey() { + return profileKey; + } + + public boolean isBlocked() { + return blocked; + } + + public Optional getExpirationTimer() { + return expirationTimer; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/DeviceContactsInputStream.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/DeviceContactsInputStream.java new file mode 100644 index 000000000..bec528536 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/DeviceContactsInputStream.java @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2014-2018 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.messages.multidevice; + +import org.session.libsignal.libsignal.IdentityKey; +import org.session.libsignal.libsignal.InvalidKeyException; +import org.session.libsignal.libsignal.InvalidMessageException; +import org.session.libsignal.libsignal.logging.Log; +import org.session.libsignal.libsignal.util.guava.Optional; +import org.session.libsignal.service.api.messages.SignalServiceAttachmentStream; +import org.session.libsignal.service.internal.push.SignalServiceProtos; +import org.session.libsignal.service.internal.util.Util; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +public class DeviceContactsInputStream extends ChunkedInputStream { + + private static final String TAG = DeviceContactsInputStream.class.getSimpleName(); + + public DeviceContactsInputStream(InputStream in) { + super(in); + } + + public DeviceContact read() throws Exception { + try { + long detailsLength = readInt32(); + byte[] detailsSerialized = new byte[(int) detailsLength]; + Util.readFully(in, detailsSerialized); + + SignalServiceProtos.ContactDetails details = SignalServiceProtos.ContactDetails.parseFrom(detailsSerialized); + String number = details.getNumber(); + Optional name = Optional.fromNullable(details.getName()); + Optional avatar = Optional.absent(); + Optional color = details.hasColor() ? Optional.of(details.getColor()) : Optional.absent(); + Optional verified = Optional.absent(); + Optional profileKey = Optional.absent(); + boolean blocked = false; + Optional expireTimer = Optional.absent(); + + if (details.hasAvatar()) { + long avatarLength = details.getAvatar().getLength(); + InputStream avatarStream = new LimitedInputStream(in, avatarLength); + String avatarContentType = details.getAvatar().getContentType(); + + avatar = Optional.of(new SignalServiceAttachmentStream(avatarStream, avatarContentType, avatarLength, Optional.absent(), false, null)); + } + + if (details.hasVerified()) { + try { + String destination = details.getVerified().getDestination(); + IdentityKey identityKey = new IdentityKey(details.getVerified().getIdentityKey().toByteArray(), 0); + + VerifiedMessage.VerifiedState state; + + switch (details.getVerified().getState()) { + case VERIFIED: + state = VerifiedMessage.VerifiedState.VERIFIED; + break; + case UNVERIFIED: + state = VerifiedMessage.VerifiedState.UNVERIFIED; + break; + case DEFAULT: + state = VerifiedMessage.VerifiedState.DEFAULT; + break; + default: + throw new InvalidMessageException("Unknown state: " + details.getVerified().getState()); + } + + verified = Optional.of(new VerifiedMessage(destination, identityKey, state, System.currentTimeMillis())); + } catch (InvalidKeyException e) { + Log.w(TAG, e); + verified = Optional.absent(); + } catch (InvalidMessageException e) { + Log.w(TAG, e); + verified = Optional.absent(); + } + } + + if (details.hasProfileKey()) { + profileKey = Optional.fromNullable(details.getProfileKey().toByteArray()); + } + + if (details.hasExpireTimer() && details.getExpireTimer() > 0) { + expireTimer = Optional.of(details.getExpireTimer()); + } + + blocked = details.getBlocked(); + + return new DeviceContact(number, name, avatar, color, verified, profileKey, blocked, expireTimer); + } catch (IOException e) { + return null; + } + } + + /** + * Read all device contacts. + * + * This will also close the input stream upon reading. + */ + public List readAll() throws Exception { + ArrayList devices = new ArrayList(); + try { + DeviceContact deviceContact = read(); + while (deviceContact != null) { + devices.add(deviceContact); + // Read the next contact + deviceContact = read(); + } + return devices; + } finally { + in.close(); + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/DeviceContactsOutputStream.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/DeviceContactsOutputStream.java new file mode 100644 index 000000000..c6bad2825 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/DeviceContactsOutputStream.java @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2014-2018 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.messages.multidevice; + +import com.google.protobuf.ByteString; + +import org.session.libsignal.service.internal.push.SignalServiceProtos; + +import java.io.IOException; +import java.io.OutputStream; + +public class DeviceContactsOutputStream extends ChunkedOutputStream { + + public DeviceContactsOutputStream(OutputStream out) { + super(out); + } + + public void write(DeviceContact contact) throws IOException { + writeContactDetails(contact); + writeAvatarImage(contact); + } + + public void close() throws IOException { + out.close(); + } + + private void writeAvatarImage(DeviceContact contact) throws IOException { + if (contact.getAvatar().isPresent()) { + writeStream(contact.getAvatar().get().getInputStream()); + } + } + + private void writeContactDetails(DeviceContact contact) throws IOException { + SignalServiceProtos.ContactDetails.Builder contactDetails = SignalServiceProtos.ContactDetails.newBuilder(); + contactDetails.setNumber(contact.getNumber()); + + if (contact.getName().isPresent()) { + contactDetails.setName(contact.getName().get()); + } + + if (contact.getAvatar().isPresent()) { + SignalServiceProtos.ContactDetails.Avatar.Builder avatarBuilder = SignalServiceProtos.ContactDetails.Avatar.newBuilder(); + avatarBuilder.setContentType(contact.getAvatar().get().getContentType()); + avatarBuilder.setLength((int)contact.getAvatar().get().getLength()); + contactDetails.setAvatar(avatarBuilder); + } + + if (contact.getColor().isPresent()) { + contactDetails.setColor(contact.getColor().get()); + } + + if (contact.getVerified().isPresent()) { + SignalServiceProtos.Verified.State state; + + switch (contact.getVerified().get().getVerified()) { + case VERIFIED: state = SignalServiceProtos.Verified.State.VERIFIED; break; + case UNVERIFIED: state = SignalServiceProtos.Verified.State.UNVERIFIED; break; + default: state = SignalServiceProtos.Verified.State.DEFAULT; break; + } + + contactDetails.setVerified(SignalServiceProtos.Verified.newBuilder() + .setDestination(contact.getVerified().get().getDestination()) + .setIdentityKey(ByteString.copyFrom(contact.getVerified().get().getIdentityKey().serialize())) + .setState(state)); + } + + if (contact.getProfileKey().isPresent()) { + contactDetails.setProfileKey(ByteString.copyFrom(contact.getProfileKey().get())); + } + + if (contact.getExpirationTimer().isPresent()) { + contactDetails.setExpireTimer(contact.getExpirationTimer().get()); + } + + contactDetails.setBlocked(contact.isBlocked()); + + byte[] serializedContactDetails = contactDetails.build().toByteArray(); + + // Loki - Since iOS has trouble parsing variable length integers, just write a fixed length one + out.write(toByteArray(serializedContactDetails.length)); + out.write(serializedContactDetails); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/DeviceGroup.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/DeviceGroup.java new file mode 100644 index 000000000..fcf62f1af --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/DeviceGroup.java @@ -0,0 +1,76 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.messages.multidevice; + +import org.session.libsignal.libsignal.util.guava.Optional; +import org.session.libsignal.service.api.messages.SignalServiceAttachmentStream; + +import java.util.List; + +public class DeviceGroup { + + private final byte[] id; + private final Optional name; + private final List members; + private final List admins; + private final Optional avatar; + private final boolean active; + private final Optional expirationTimer; + private final Optional color; + private final boolean blocked; + + public DeviceGroup(byte[] id, Optional name, List members, + List admins, + Optional avatar, + boolean active, Optional expirationTimer, + Optional color, boolean blocked) + { + this.id = id; + this.name = name; + this.members = members; + this.admins = admins; + this.avatar = avatar; + this.active = active; + this.expirationTimer = expirationTimer; + this.color = color; + this.blocked = blocked; + } + + public Optional getAvatar() { + return avatar; + } + + public Optional getName() { + return name; + } + + public byte[] getId() { + return id; + } + + public List getMembers() { + return members; + } + + public List getAdmins() { return admins; } + + public boolean isActive() { + return active; + } + + public Optional getExpirationTimer() { + return expirationTimer; + } + + public Optional getColor() { + return color; + } + + public boolean isBlocked() { + return blocked; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/DeviceGroupsInputStream.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/DeviceGroupsInputStream.java new file mode 100644 index 000000000..2c6f0cfa2 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/DeviceGroupsInputStream.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2014-2018 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.messages.multidevice; + +import org.session.libsignal.libsignal.util.guava.Optional; +import org.session.libsignal.service.api.messages.SignalServiceAttachmentStream; +import org.session.libsignal.service.internal.push.SignalServiceProtos; +import org.session.libsignal.service.internal.util.Util; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +public class DeviceGroupsInputStream extends ChunkedInputStream{ + + public DeviceGroupsInputStream(InputStream in) { + super(in); + } + + public DeviceGroup read() throws IOException { + try { + long detailsLength = readInt32(); + byte[] detailsSerialized = new byte[(int) detailsLength]; + Util.readFully(in, detailsSerialized); + + SignalServiceProtos.GroupDetails details = SignalServiceProtos.GroupDetails.parseFrom(detailsSerialized); + + if (!details.hasId()) { + throw new IOException("ID missing on group record!"); + } + + byte[] id = details.getId().toByteArray(); + Optional name = Optional.fromNullable(details.getName()); + List members = details.getMembersList(); + List admins = details.getAdminsList(); + Optional avatar = Optional.absent(); + boolean active = details.getActive(); + Optional expirationTimer = Optional.absent(); + Optional color = Optional.fromNullable(details.getColor()); + boolean blocked = details.getBlocked(); + + if (details.hasAvatar()) { + long avatarLength = details.getAvatar().getLength(); + InputStream avatarStream = new ChunkedInputStream.LimitedInputStream(in, avatarLength); + String avatarContentType = details.getAvatar().getContentType(); + + avatar = Optional.of(new SignalServiceAttachmentStream(avatarStream, avatarContentType, avatarLength, Optional.absent(), false, null)); + } + + if (details.hasExpireTimer() && details.getExpireTimer() > 0) { + expirationTimer = Optional.of(details.getExpireTimer()); + } + + return new DeviceGroup(id, name, members, admins, avatar, active, expirationTimer, color, blocked); + } catch (IOException e) { + return null; + } + } + + /** + * Read all device contacts. + * + * This will also close the input stream upon reading. + */ + public List readAll() throws Exception { + ArrayList devices = new ArrayList<>(); + try { + DeviceGroup deviceGroup = read(); + while (deviceGroup != null) { + devices.add(deviceGroup); + // Read the next contact + deviceGroup = read(); + } + return devices; + } finally { + in.close(); + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/DeviceGroupsOutputStream.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/DeviceGroupsOutputStream.java new file mode 100644 index 000000000..33c61b8f8 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/DeviceGroupsOutputStream.java @@ -0,0 +1,74 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.messages.multidevice; + +import com.google.protobuf.ByteString; + +import org.session.libsignal.service.internal.push.SignalServiceProtos; + +import java.io.IOException; +import java.io.OutputStream; + +public class DeviceGroupsOutputStream extends ChunkedOutputStream { + + public DeviceGroupsOutputStream(OutputStream out) { + super(out); + } + + public void write(DeviceGroup group) throws IOException { + writeGroupDetails(group); + writeAvatarImage(group); + } + + public void close() throws IOException { + out.close(); + } + + private void writeAvatarImage(DeviceGroup contact) throws IOException { + // Loki - Temporarily disable this + /* + if (contact.getAvatar().isPresent()) { + writeStream(contact.getAvatar().get().getInputStream()); + } + */ + } + + private void writeGroupDetails(DeviceGroup group) throws IOException { + SignalServiceProtos.GroupDetails.Builder groupDetails = SignalServiceProtos.GroupDetails.newBuilder(); + groupDetails.setId(ByteString.copyFrom(group.getId())); + + if (group.getName().isPresent()) { + groupDetails.setName(group.getName().get()); + } + + if (group.getAvatar().isPresent()) { + SignalServiceProtos.GroupDetails.Avatar.Builder avatarBuilder = SignalServiceProtos.GroupDetails.Avatar.newBuilder(); + avatarBuilder.setContentType(group.getAvatar().get().getContentType()); + avatarBuilder.setLength((int)group.getAvatar().get().getLength()); + groupDetails.setAvatar(avatarBuilder); + } + + if (group.getExpirationTimer().isPresent()) { + groupDetails.setExpireTimer(group.getExpirationTimer().get()); + } + + if (group.getColor().isPresent()) { + groupDetails.setColor(group.getColor().get()); + } + + groupDetails.addAllMembers(group.getMembers()); + groupDetails.addAllAdmins(group.getAdmins()); + groupDetails.setActive(group.isActive()); + groupDetails.setBlocked(group.isBlocked()); + + byte[] serializedContactDetails = groupDetails.build().toByteArray(); + + // Loki - Since iOS has trouble parsing variable length integers, just write a fixed length one + out.write(toByteArray(serializedContactDetails.length)); + out.write(serializedContactDetails); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/DeviceInfo.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/DeviceInfo.java new file mode 100644 index 000000000..72e9c105a --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/DeviceInfo.java @@ -0,0 +1,42 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.messages.multidevice; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class DeviceInfo { + + @JsonProperty + private long id; + + @JsonProperty + private String name; + + @JsonProperty + private long created; + + @JsonProperty + private long lastSeen; + + public DeviceInfo() {} + + public long getId() { + return id; + } + + public String getName() { + return name; + } + + public long getCreated() { + return created; + } + + public long getLastSeen() { + return lastSeen; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/ReadMessage.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/ReadMessage.java new file mode 100644 index 000000000..86f85929c --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/ReadMessage.java @@ -0,0 +1,30 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.messages.multidevice; + +import java.util.LinkedList; +import java.util.List; + +public class ReadMessage { + + private final String sender; + private final long timestamp; + + public ReadMessage(String sender, long timestamp) { + this.sender = sender; + this.timestamp = timestamp; + } + + public long getTimestamp() { + return timestamp; + } + + public String getSender() { + return sender; + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/RequestMessage.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/RequestMessage.java new file mode 100644 index 000000000..ec6a0aeee --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/RequestMessage.java @@ -0,0 +1,34 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.messages.multidevice; + +import org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request; + +public class RequestMessage { + + private final Request request; + + public RequestMessage(Request request) { + this.request = request; + } + + public boolean isContactsRequest() { + return request.getType() == Request.Type.CONTACTS; + } + + public boolean isGroupsRequest() { + return request.getType() == Request.Type.GROUPS; + } + + public boolean isBlockedListRequest() { + return request.getType() == Request.Type.BLOCKED; + } + + public boolean isConfigurationRequest() { + return request.getType() == Request.Type.CONFIGURATION; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/SentTranscriptMessage.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/SentTranscriptMessage.java new file mode 100644 index 000000000..cabcec852 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/SentTranscriptMessage.java @@ -0,0 +1,67 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.messages.multidevice; + +import org.session.libsignal.libsignal.util.guava.Optional; +import org.session.libsignal.service.api.messages.SignalServiceDataMessage; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +public class SentTranscriptMessage { + + private final Optional destination; + private final long timestamp; + private final long expirationStartTimestamp; + private final SignalServiceDataMessage message; + private final Map unidentifiedStatus; + + // Loki - Open groups + public long messageServerID = -1; + + public SentTranscriptMessage(String destination, long timestamp, SignalServiceDataMessage message, + long expirationStartTimestamp, Map unidentifiedStatus) + { + this.destination = Optional.of(destination); + this.timestamp = timestamp; + this.message = message; + this.expirationStartTimestamp = expirationStartTimestamp; + this.unidentifiedStatus = new HashMap(unidentifiedStatus); + } + + public SentTranscriptMessage(long timestamp, SignalServiceDataMessage message) { + this.destination = Optional.absent(); + this.timestamp = timestamp; + this.message = message; + this.expirationStartTimestamp = 0; + this.unidentifiedStatus = Collections.emptyMap(); + } + + public Optional getDestination() { + return destination; + } + + public long getTimestamp() { + return timestamp; + } + + public long getExpirationStartTimestamp() { + return expirationStartTimestamp; + } + + public SignalServiceDataMessage getMessage() { + return message; + } + + public boolean isUnidentified(String destination) { + if (unidentifiedStatus.containsKey(destination)) { + return unidentifiedStatus.get(destination); + } + return false; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/SignalServiceSyncMessage.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/SignalServiceSyncMessage.java new file mode 100644 index 000000000..47e957246 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/SignalServiceSyncMessage.java @@ -0,0 +1,250 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.messages.multidevice; + +import org.session.libsignal.libsignal.util.guava.Optional; +import org.session.libsignal.service.api.messages.SignalServiceAttachment; +import org.session.libsignal.service.api.messages.multidevice.StickerPackOperationMessage; +import org.session.libsignal.service.loki.api.opengroups.PublicChat; +import org.session.libsignal.service.loki.protocol.meta.TTLUtilities; + +import java.util.LinkedList; +import java.util.List; + +public class SignalServiceSyncMessage { + + private final Optional sent; + private final Optional contacts; + private final Optional groups; + private final Optional> openGroups; + private final Optional blockedList; + private final Optional request; + private final Optional> reads; + private final Optional verified; + private final Optional configuration; + private final Optional> stickerPackOperations; + + private SignalServiceSyncMessage(Optional sent, + Optional contacts, + Optional groups, + Optional blockedList, + Optional request, + Optional> reads, + Optional verified, + Optional configuration, + Optional> stickerPackOperations, + Optional> openGroups) + { + this.sent = sent; + this.contacts = contacts; + this.groups = groups; + this.blockedList = blockedList; + this.request = request; + this.reads = reads; + this.verified = verified; + this.configuration = configuration; + this.stickerPackOperations = stickerPackOperations; + this.openGroups = openGroups; + } + + public static SignalServiceSyncMessage forSentTranscript(SentTranscriptMessage sent) { + return new SignalServiceSyncMessage(Optional.of(sent), + Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.>absent(), + Optional.absent(), + Optional.absent(), + Optional.>absent(), + Optional.>absent()); + } + + public static SignalServiceSyncMessage forContacts(ContactsMessage contacts) { + return new SignalServiceSyncMessage(Optional.absent(), + Optional.of(contacts), + Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.>absent(), + Optional.absent(), + Optional.absent(), + Optional.>absent(), + Optional.>absent()); + } + + public static SignalServiceSyncMessage forGroups(SignalServiceAttachment groups) { + return new SignalServiceSyncMessage(Optional.absent(), + Optional.absent(), + Optional.of(groups), + Optional.absent(), + Optional.absent(), + Optional.>absent(), + Optional.absent(), + Optional.absent(), + Optional.>absent(), + Optional.>absent()); + } + + public static SignalServiceSyncMessage forRequest(RequestMessage request) { + return new SignalServiceSyncMessage(Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.of(request), + Optional.>absent(), + Optional.absent(), + Optional.absent(), + Optional.>absent(), + Optional.>absent()); + } + + public static SignalServiceSyncMessage forRead(List reads) { + return new SignalServiceSyncMessage(Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.of(reads), + Optional.absent(), + Optional.absent(), + Optional.>absent(), + Optional.>absent()); + } + + public static SignalServiceSyncMessage forRead(ReadMessage read) { + List reads = new LinkedList(); + reads.add(read); + + return new SignalServiceSyncMessage(Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.of(reads), + Optional.absent(), + Optional.absent(), + Optional.>absent(), + Optional.>absent()); + } + + public static SignalServiceSyncMessage forVerified(VerifiedMessage verifiedMessage) { + return new SignalServiceSyncMessage(Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.>absent(), + Optional.of(verifiedMessage), + Optional.absent(), + Optional.>absent(), + Optional.>absent()); + } + + public static SignalServiceSyncMessage forBlocked(BlockedListMessage blocked) { + return new SignalServiceSyncMessage(Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.of(blocked), + Optional.absent(), + Optional.>absent(), + Optional.absent(), + Optional.absent(), + Optional.>absent(), + Optional.>absent()); + } + + public static SignalServiceSyncMessage forConfiguration(ConfigurationMessage configuration) { + return new SignalServiceSyncMessage(Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.>absent(), + Optional.absent(), + Optional.of(configuration), + Optional.>absent(), + Optional.>absent()); + } + + public static SignalServiceSyncMessage forStickerPackOperations(List stickerPackOperations) { + return new SignalServiceSyncMessage(Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.>absent(), + Optional.absent(), + Optional.absent(), + Optional.of(stickerPackOperations), + Optional.>absent()); + } + + public static SignalServiceSyncMessage forOpenGroups(List openGroups) { + return new SignalServiceSyncMessage(Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.>absent(), + Optional.absent(), + Optional.absent(), + Optional.>absent(), + Optional.of(openGroups)); + } + + public static SignalServiceSyncMessage empty() { + return new SignalServiceSyncMessage(Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.absent(), + Optional.>absent(), + Optional.absent(), + Optional.absent(), + Optional.>absent(), + Optional.>absent()); + } + + public Optional getSent() { + return sent; + } + + public Optional getGroups() { + return groups; + } + + public Optional getContacts() { + return contacts; + } + + public Optional getRequest() { + return request; + } + + public Optional> getRead() { + return reads; + } + + public Optional getBlockedList() { + return blockedList; + } + + public Optional getVerified() { + return verified; + } + + public Optional getConfiguration() { + return configuration; + } + + public Optional> getStickerPackOperations() { return stickerPackOperations; } + + public Optional> getOpenGroups() { return openGroups; } + + public int getTTL() { return TTLUtilities.getTTL(TTLUtilities.MessageType.Sync); } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/StickerPackOperationMessage.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/StickerPackOperationMessage.java new file mode 100644 index 000000000..458bac1af --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/StickerPackOperationMessage.java @@ -0,0 +1,32 @@ +package org.session.libsignal.service.api.messages.multidevice; + +import org.session.libsignal.libsignal.util.guava.Optional; + +public class StickerPackOperationMessage { + + private final Optional packId; + private final Optional packKey; + private final Optional type; + + public StickerPackOperationMessage(byte[] packId, byte[] packKey, Type type) { + this.packId = Optional.fromNullable(packId); + this.packKey = Optional.fromNullable(packKey); + this.type = Optional.fromNullable(type); + } + + public Optional getPackId() { + return packId; + } + + public Optional getPackKey() { + return packKey; + } + + public Optional getType() { + return type; + } + + public enum Type { + INSTALL, REMOVE + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/VerifiedMessage.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/VerifiedMessage.java new file mode 100644 index 000000000..4daca9feb --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/multidevice/VerifiedMessage.java @@ -0,0 +1,42 @@ +package org.session.libsignal.service.api.messages.multidevice; + + +import org.session.libsignal.libsignal.IdentityKey; +import org.session.libsignal.service.loki.protocol.meta.TTLUtilities; + +public class VerifiedMessage { + + public enum VerifiedState { + DEFAULT, VERIFIED, UNVERIFIED + } + + private final String destination; + private final IdentityKey identityKey; + private final VerifiedState verified; + private final long timestamp; + + public VerifiedMessage(String destination, IdentityKey identityKey, VerifiedState verified, long timestamp) { + this.destination = destination; + this.identityKey = identityKey; + this.verified = verified; + this.timestamp = timestamp; + } + + public String getDestination() { + return destination; + } + + public IdentityKey getIdentityKey() { + return identityKey; + } + + public VerifiedState getVerified() { + return verified; + } + + public long getTimestamp() { + return timestamp; + } + + public int getTTL() { return TTLUtilities.getTTL(TTLUtilities.MessageType.Verified); } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/messages/shared/SharedContact.java b/libsignal/src/main/java/org/session/libsignal/service/api/messages/shared/SharedContact.java new file mode 100644 index 000000000..75ee56835 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/messages/shared/SharedContact.java @@ -0,0 +1,513 @@ +package org.session.libsignal.service.api.messages.shared; + + +import org.session.libsignal.libsignal.util.guava.Optional; +import org.session.libsignal.service.api.messages.SignalServiceAttachment; + +import java.util.LinkedList; +import java.util.List; + +public class SharedContact { + + private final Name name; + private final Optional avatar; + private final Optional> phone; + private final Optional> email; + private final Optional> address; + private final Optional organization; + + public SharedContact(Name name, + Optional avatar, + Optional> phone, + Optional> email, + Optional> address, + Optional organization) + { + this.name = name; + this.avatar = avatar; + this.phone = phone; + this.email = email; + this.address = address; + this.organization = organization; + } + + public static Builder newBuilder() { + return new Builder(); + } + + public Name getName() { + return name; + } + + public Optional getAvatar() { + return avatar; + } + + public Optional> getPhone() { + return phone; + } + + public Optional> getEmail() { + return email; + } + + public Optional> getAddress() { + return address; + } + + public Optional getOrganization() { + return organization; + } + + public static class Avatar { + private final SignalServiceAttachment attachment; + private final boolean isProfile; + + public Avatar(SignalServiceAttachment attachment, boolean isProfile) { + this.attachment = attachment; + this.isProfile = isProfile; + } + + public SignalServiceAttachment getAttachment() { + return attachment; + } + + public boolean isProfile() { + return isProfile; + } + + public static Builder newBuilder() { + return new Builder(); + } + + public static class Builder { + private SignalServiceAttachment attachment; + private boolean isProfile; + + public Builder withAttachment(SignalServiceAttachment attachment) { + this.attachment = attachment; + return this; + } + + public Builder withProfileFlag(boolean isProfile) { + this.isProfile = isProfile; + return this; + } + + public Avatar build() { + return new Avatar(attachment, isProfile); + } + } + } + + public static class Name { + + private final Optional display; + private final Optional given; + private final Optional family; + private final Optional prefix; + private final Optional suffix; + private final Optional middle; + + public Name(Optional display, Optional given, Optional family, Optional prefix, Optional suffix, Optional middle) { + this.display = display; + this.given = given; + this.family = family; + this.prefix = prefix; + this.suffix = suffix; + this.middle = middle; + } + + public static Builder newBuilder() { + return new Builder(); + } + + public Optional getDisplay() { + return display; + } + + public Optional getGiven() { + return given; + } + + public Optional getFamily() { + return family; + } + + public Optional getPrefix() { + return prefix; + } + + public Optional getSuffix() { + return suffix; + } + + public Optional getMiddle() { + return middle; + } + + public static class Builder { + private String display; + private String given; + private String family; + private String prefix; + private String suffix; + private String middle; + + public Builder setDisplay(String display) { + this.display = display; + return this; + } + + public Builder setGiven(String given) { + this.given = given; + return this; + } + + public Builder setFamily(String family) { + this.family = family; + return this; + } + + public Builder setPrefix(String prefix) { + this.prefix = prefix; + return this; + } + + public Builder setSuffix(String suffix) { + this.suffix = suffix; + return this; + } + + public Builder setMiddle(String middle) { + this.middle = middle; + return this; + } + + public Name build() { + return new Name(Optional.fromNullable(display), + Optional.fromNullable(given), + Optional.fromNullable(family), + Optional.fromNullable(prefix), + Optional.fromNullable(suffix), + Optional.fromNullable(middle)); + } + } + } + + public static class Phone { + + public enum Type { + HOME, WORK, MOBILE, CUSTOM + } + + private final String value; + private final Type type; + private final Optional label; + + public Phone(String value, Type type, Optional label) { + this.value = value; + this.type = type; + this.label = label; + } + + public static Builder newBuilder() { + return new Builder(); + } + + public String getValue() { + return value; + } + + public Type getType() { + return type; + } + + public Optional getLabel() { + return label; + } + + public static class Builder { + private String value; + private Type type; + private String label; + + public Builder setValue(String value) { + this.value = value; + return this; + } + + public Builder setType(Type type) { + this.type = type; + return this; + } + + public Builder setLabel(String label) { + this.label = label; + return this; + } + + public Phone build() { + return new Phone(value, type, Optional.fromNullable(label)); + } + } + } + + public static class Email { + + public enum Type { + HOME, WORK, MOBILE, CUSTOM + } + + private final String value; + private final Type type; + private final Optional label; + + public Email(String value, Type type, Optional label) { + this.value = value; + this.type = type; + this.label = label; + } + + public static Builder newBuilder() { + return new Builder(); + } + + public String getValue() { + return value; + } + + public Type getType() { + return type; + } + + public Optional getLabel() { + return label; + } + + public static class Builder { + private String value; + private Type type; + private String label; + + public Builder setValue(String value) { + this.value = value; + return this; + } + + public Builder setType(Type type) { + this.type = type; + return this; + } + + public Builder setLabel(String label) { + this.label = label; + return this; + } + + public Email build() { + return new Email(value, type, Optional.fromNullable(label)); + } + } + } + + public static class PostalAddress { + + public enum Type { + HOME, WORK, CUSTOM + } + + private final Type type; + private final Optional label; + private final Optional street; + private final Optional pobox; + private final Optional neighborhood; + private final Optional city; + private final Optional region; + private final Optional postcode; + private final Optional country; + + public PostalAddress(Type type, Optional label, Optional street, + Optional pobox, Optional neighborhood, + Optional city, Optional region, + Optional postcode, Optional country) + { + this.type = type; + this.label = label; + this.street = street; + this.pobox = pobox; + this.neighborhood = neighborhood; + this.city = city; + this.region = region; + this.postcode = postcode; + this.country = country; + } + + public static Builder newBuilder() { + return new Builder(); + } + + public Type getType() { + return type; + } + + public Optional getLabel() { + return label; + } + + public Optional getStreet() { + return street; + } + + public Optional getPobox() { + return pobox; + } + + public Optional getNeighborhood() { + return neighborhood; + } + + public Optional getCity() { + return city; + } + + public Optional getRegion() { + return region; + } + + public Optional getPostcode() { + return postcode; + } + + public Optional getCountry() { + return country; + } + + public static class Builder { + private Type type; + private String label; + private String street; + private String pobox; + private String neighborhood; + private String city; + private String region; + private String postcode; + private String country; + + public Builder setType(Type type) { + this.type = type; + return this; + } + + public Builder setLabel(String label) { + this.label = label; + return this; + } + + public Builder setStreet(String street) { + this.street = street; + return this; + } + + public Builder setPobox(String pobox) { + this.pobox = pobox; + return this; + } + + public Builder setNeighborhood(String neighborhood) { + this.neighborhood = neighborhood; + return this; + } + + public Builder setCity(String city) { + this.city = city; + return this; + } + + public Builder setRegion(String region) { + this.region = region; + return this; + } + + public Builder setPostcode(String postcode) { + this.postcode = postcode; + return this; + } + + public Builder setCountry(String country) { + this.country = country; + return this; + } + + public PostalAddress build() { + return new PostalAddress(type, Optional.fromNullable(label), Optional.fromNullable(street), + Optional.fromNullable(pobox), Optional.fromNullable(neighborhood), + Optional.fromNullable(city), Optional.fromNullable(region), + Optional.fromNullable(postcode), Optional.fromNullable(country)); + } + } + } + + public static class Builder { + private Name name; + private Avatar avatar; + private String organization; + + private List phone = new LinkedList(); + private List email = new LinkedList(); + private List address = new LinkedList(); + + public Builder setName(Name name) { + this.name = name; + return this; + } + + public Builder withOrganization(String organization) { + this.organization = organization; + return this; + } + + public Builder setAvatar(Avatar avatar) { + this.avatar = avatar; + return this; + } + + public Builder withPhone(Phone phone) { + this.phone.add(phone); + return this; + } + + public Builder withPhones(List phones) { + this.phone.addAll(phones); + return this; + } + + public Builder withEmail(Email email) { + this.email.add(email); + return this; + } + + public Builder withEmails(List emails) { + this.email.addAll(emails); + return this; + } + + public Builder withAddress(PostalAddress address) { + this.address.add(address); + return this; + } + + public Builder withAddresses(List addresses) { + this.address.addAll(addresses); + return this; + } + + public SharedContact build() { + return new SharedContact(name, Optional.fromNullable(avatar), + phone.isEmpty() ? Optional.>absent() : Optional.of(phone), + email.isEmpty() ? Optional.>absent() : Optional.of(email), + address.isEmpty() ? Optional.>absent() : Optional.of(address), + Optional.fromNullable(organization)); + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/profiles/SignalServiceProfile.java b/libsignal/src/main/java/org/session/libsignal/service/api/profiles/SignalServiceProfile.java new file mode 100644 index 000000000..9d6c70593 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/profiles/SignalServiceProfile.java @@ -0,0 +1,44 @@ +package org.session.libsignal.service.api.profiles; + + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class SignalServiceProfile { + + @JsonProperty + private String identityKey; + + @JsonProperty + private String name; + + @JsonProperty + private String avatar; + + @JsonProperty + private String unidentifiedAccess; + + @JsonProperty + private boolean unrestrictedUnidentifiedAccess; + + public SignalServiceProfile() {} + + public String getIdentityKey() { + return identityKey; + } + + public String getName() { + return name; + } + + public String getAvatar() { + return avatar; + } + + public String getUnidentifiedAccess() { + return unidentifiedAccess; + } + + public boolean isUnrestrictedUnidentifiedAccess() { + return unrestrictedUnidentifiedAccess; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/push/ContactTokenDetails.java b/libsignal/src/main/java/org/session/libsignal/service/api/push/ContactTokenDetails.java new file mode 100644 index 000000000..30ec1a3d1 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/push/ContactTokenDetails.java @@ -0,0 +1,69 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.push; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * A class that represents a contact's registration state. + */ +public class ContactTokenDetails { + + @JsonProperty + private String token; + + @JsonProperty + private String relay; + + @JsonProperty + private String number; + + @JsonProperty + private boolean voice; + + @JsonProperty + private boolean video; + + public ContactTokenDetails() {} + + /** + * @return The "anonymized" token (truncated hash) that's transmitted to the server. + */ + public String getToken() { + return token; + } + + /** + * @return The federated server this contact is registered with, or null if on your server. + */ + public String getRelay() { + return relay; + } + + /** + * @return Whether this contact supports secure voice calls. + */ + public boolean isVoice() { + return voice; + } + + public boolean isVideo() { + return video; + } + + public void setNumber(String number) { + this.number = number; + } + + /** + * @return This contact's username (e164 formatted number). + */ + public String getNumber() { + return number; + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/push/SignalServiceAddress.java b/libsignal/src/main/java/org/session/libsignal/service/api/push/SignalServiceAddress.java new file mode 100644 index 000000000..2aa3a7f0c --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/push/SignalServiceAddress.java @@ -0,0 +1,73 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.push; + +import org.session.libsignal.libsignal.util.guava.Optional; + +/** + * A class representing a message destination or origin. + */ +public class SignalServiceAddress { + + public static final int DEFAULT_DEVICE_ID = 1; + + private final String e164number; + private final Optional relay; + + /** + * Construct a PushAddress. + * + * @param e164number The Signal Service username of this destination (eg e164 representation of a phone number). + * @param relay The Signal SErvicefederated server this user is registered with (if not your own server). + */ + public SignalServiceAddress(String e164number, Optional relay) { + this.e164number = e164number; + this.relay = relay; + } + + public SignalServiceAddress(String e164number) { + this(e164number, Optional.absent()); + } + + public String getNumber() { + return e164number; + } + + public Optional getRelay() { + return relay; + } + + @Override + public boolean equals(Object other) { + if (other == null || !(other instanceof SignalServiceAddress)) return false; + + SignalServiceAddress that = (SignalServiceAddress)other; + + return equals(this.e164number, that.e164number) && + equals(this.relay, that.relay); + } + + @Override + public int hashCode() { + int hashCode = 0; + + if (this.e164number != null) hashCode ^= this.e164number.hashCode(); + if (this.relay.isPresent()) hashCode ^= this.relay.get().hashCode(); + + return hashCode; + } + + private boolean equals(String one, String two) { + if (one == null) return two == null; + return one.equals(two); + } + + private boolean equals(Optional one, Optional two) { + if (one.isPresent()) return two.isPresent() && one.get().equals(two.get()); + else return !two.isPresent(); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/push/SignedPreKeyEntity.java b/libsignal/src/main/java/org/session/libsignal/service/api/push/SignedPreKeyEntity.java new file mode 100644 index 000000000..ea9b91d64 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/push/SignedPreKeyEntity.java @@ -0,0 +1,58 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.push; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +import org.session.libsignal.libsignal.ecc.ECPublicKey; +import org.session.libsignal.service.internal.push.PreKeyEntity; +import org.session.libsignal.service.internal.util.Base64; + +import java.io.IOException; + +public class SignedPreKeyEntity extends PreKeyEntity { + + @JsonProperty + @JsonSerialize(using = ByteArraySerializer.class) + @JsonDeserialize(using = ByteArrayDeserializer.class) + private byte[] signature; + + public SignedPreKeyEntity() {} + + public SignedPreKeyEntity(int keyId, ECPublicKey publicKey, byte[] signature) { + super(keyId, publicKey); + this.signature = signature; + } + + public byte[] getSignature() { + return signature; + } + + private static class ByteArraySerializer extends JsonSerializer { + @Override + public void serialize(byte[] value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + gen.writeString(Base64.encodeBytesWithoutPadding(value)); + } + } + + private static class ByteArrayDeserializer extends JsonDeserializer { + + @Override + public byte[] deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + return Base64.decodeWithoutPadding(p.getValueAsString()); + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/push/TrustStore.java b/libsignal/src/main/java/org/session/libsignal/service/api/push/TrustStore.java new file mode 100644 index 000000000..81715f791 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/push/TrustStore.java @@ -0,0 +1,19 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.push; + +import java.io.InputStream; + +/** + * A class that represents a Java {@link java.security.KeyStore} and + * its associated password. + */ +public interface TrustStore { + public InputStream getKeyStoreInputStream(); + public String getKeyStorePassword(); +} + diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/AuthorizationFailedException.java b/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/AuthorizationFailedException.java new file mode 100644 index 000000000..8709b22c3 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/AuthorizationFailedException.java @@ -0,0 +1,15 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.push.exceptions; + +import org.session.libsignal.service.api.push.exceptions.NonSuccessfulResponseCodeException; + +public class AuthorizationFailedException extends NonSuccessfulResponseCodeException { + public AuthorizationFailedException(String s) { + super(s); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/CaptchaRequiredException.java b/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/CaptchaRequiredException.java new file mode 100644 index 000000000..abeb5db5a --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/CaptchaRequiredException.java @@ -0,0 +1,6 @@ +package org.session.libsignal.service.api.push.exceptions; + +import org.session.libsignal.service.api.push.exceptions.NonSuccessfulResponseCodeException; + +public class CaptchaRequiredException extends NonSuccessfulResponseCodeException { +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/EncapsulatedExceptions.java b/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/EncapsulatedExceptions.java new file mode 100644 index 000000000..e23a5ab13 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/EncapsulatedExceptions.java @@ -0,0 +1,49 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.service.api.push.exceptions; + +import org.session.libsignal.service.api.crypto.UntrustedIdentityException; +import org.session.libsignal.service.api.push.exceptions.NetworkFailureException; +import org.session.libsignal.service.api.push.exceptions.UnregisteredUserException; + +import java.util.LinkedList; +import java.util.List; + +public class EncapsulatedExceptions extends Throwable { + + private final List untrustedIdentityExceptions; + private final List unregisteredUserExceptions; + private final List networkExceptions; + + public EncapsulatedExceptions(List untrustedIdentities, + List unregisteredUsers, + List networkExceptions) + { + this.untrustedIdentityExceptions = untrustedIdentities; + this.unregisteredUserExceptions = unregisteredUsers; + this.networkExceptions = networkExceptions; + } + + public EncapsulatedExceptions(UntrustedIdentityException e) { + this.untrustedIdentityExceptions = new LinkedList(); + this.unregisteredUserExceptions = new LinkedList(); + this.networkExceptions = new LinkedList(); + + this.untrustedIdentityExceptions.add(e); + } + + public List getUntrustedIdentityExceptions() { + return untrustedIdentityExceptions; + } + + public List getUnregisteredUserExceptions() { + return unregisteredUserExceptions; + } + + public List getNetworkExceptions() { + return networkExceptions; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/ExpectationFailedException.java b/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/ExpectationFailedException.java new file mode 100644 index 000000000..5ce5b15b3 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/ExpectationFailedException.java @@ -0,0 +1,11 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ +package org.session.libsignal.service.api.push.exceptions; + +import org.session.libsignal.service.api.push.exceptions.NonSuccessfulResponseCodeException; + +public class ExpectationFailedException extends NonSuccessfulResponseCodeException { +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/NetworkFailureException.java b/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/NetworkFailureException.java new file mode 100644 index 000000000..4e37bcfc1 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/NetworkFailureException.java @@ -0,0 +1,21 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.push.exceptions; + +public class NetworkFailureException extends Exception { + + private final String e164number; + + public NetworkFailureException(String e164number, Exception nested) { + super(nested); + this.e164number = e164number; + } + + public String getE164number() { + return e164number; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/NonSuccessfulResponseCodeException.java b/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/NonSuccessfulResponseCodeException.java new file mode 100644 index 000000000..363d57762 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/NonSuccessfulResponseCodeException.java @@ -0,0 +1,20 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.push.exceptions; + +import java.io.IOException; + +public class NonSuccessfulResponseCodeException extends IOException { + + public NonSuccessfulResponseCodeException() { + super(); + } + + public NonSuccessfulResponseCodeException(String s) { + super(s); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/NotFoundException.java b/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/NotFoundException.java new file mode 100644 index 000000000..29e4f24aa --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/NotFoundException.java @@ -0,0 +1,13 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.push.exceptions; + +public class NotFoundException extends NonSuccessfulResponseCodeException { + public NotFoundException(String s) { + super(s); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/PushNetworkException.java b/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/PushNetworkException.java new file mode 100644 index 000000000..6773953fa --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/PushNetworkException.java @@ -0,0 +1,21 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.push.exceptions; + +import java.io.IOException; + +public class PushNetworkException extends IOException { + + public PushNetworkException(Exception exception) { + super(exception); + } + + public PushNetworkException(String s) { + super(s); + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/RateLimitException.java b/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/RateLimitException.java new file mode 100644 index 000000000..f1a248b3c --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/RateLimitException.java @@ -0,0 +1,15 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.push.exceptions; + +import org.session.libsignal.service.api.push.exceptions.NonSuccessfulResponseCodeException; + +public class RateLimitException extends NonSuccessfulResponseCodeException { + public RateLimitException(String s) { + super(s); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/RemoteAttestationResponseExpiredException.java b/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/RemoteAttestationResponseExpiredException.java new file mode 100644 index 000000000..c5e5eaa76 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/RemoteAttestationResponseExpiredException.java @@ -0,0 +1,13 @@ +/* + * Copyright (C) 2019 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.push.exceptions; + +public class RemoteAttestationResponseExpiredException extends NonSuccessfulResponseCodeException { + public RemoteAttestationResponseExpiredException(String message) { + super(message); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/UnregisteredUserException.java b/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/UnregisteredUserException.java new file mode 100644 index 000000000..db131bd9f --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/push/exceptions/UnregisteredUserException.java @@ -0,0 +1,23 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.push.exceptions; + +import java.io.IOException; + +public class UnregisteredUserException extends IOException { + + private final String e164number; + + public UnregisteredUserException(String e164number, Exception exception) { + super(exception); + this.e164number = e164number; + } + + public String getE164Number() { + return e164number; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/util/CredentialsProvider.java b/libsignal/src/main/java/org/session/libsignal/service/api/util/CredentialsProvider.java new file mode 100644 index 000000000..30d5e4c32 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/util/CredentialsProvider.java @@ -0,0 +1,13 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.util; + +public interface CredentialsProvider { + public String getUser(); + public String getPassword(); + public String getSignalingKey(); +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/util/InvalidNumberException.java b/libsignal/src/main/java/org/session/libsignal/service/api/util/InvalidNumberException.java new file mode 100644 index 000000000..5b9e3ce15 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/util/InvalidNumberException.java @@ -0,0 +1,13 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.util; + +public class InvalidNumberException extends Throwable { + public InvalidNumberException(String s) { + super(s); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/util/PhoneNumberFormatter.java b/libsignal/src/main/java/org/session/libsignal/service/api/util/PhoneNumberFormatter.java new file mode 100644 index 000000000..7ef072b63 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/util/PhoneNumberFormatter.java @@ -0,0 +1,159 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.api.util; + +import com.google.i18n.phonenumbers.NumberParseException; +import com.google.i18n.phonenumbers.PhoneNumberUtil; +import com.google.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat; +import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; + +import org.session.libsignal.libsignal.logging.Log; +import org.session.libsignal.service.api.util.InvalidNumberException; + +import java.util.Locale; +import java.util.regex.Pattern; + +/** + * Phone number formats are a pain. + * + * @author Moxie Marlinspike + * + */ +public class PhoneNumberFormatter { + + private static final String TAG = PhoneNumberFormatter.class.getSimpleName(); + + private static final String COUNTRY_CODE_BR = "55"; + private static final String COUNTRY_CODE_US = "1"; + + public static boolean isValidNumber(String e164Number, String countryCode) { + if (!PhoneNumberUtil.getInstance().isPossibleNumber(e164Number, countryCode)) { + Log.w(TAG, "Failed isPossibleNumber()"); + return false; + } + + if (COUNTRY_CODE_US.equals(countryCode) && !Pattern.matches("^\\+1\\d{10}$", e164Number)) { + Log.w(TAG, "Failed US number format check"); + return false; + } + + if (COUNTRY_CODE_BR.equals(countryCode) && !Pattern.matches("^\\+55\\d{2}9?\\d{8}$", e164Number)) { + Log.w(TAG, "Failed Brazil number format check"); + return false; + } + + return e164Number.matches("^\\+[0-9]{10,}") || + e164Number.matches("^\\+685[0-9]{5}") || + e164Number.matches("^\\+376[0-9]{6}") || + e164Number.matches("^\\+299[0-9]{6}") || + e164Number.matches("^\\+597[0-9]{6}") || + e164Number.matches("^\\+298[0-9]{6}") || + e164Number.matches("^\\+240[0-9]{6}") || + e164Number.matches("^\\+687[0-9]{6}") || + e164Number.matches("^\\+689[0-9]{6}"); + } + + private static String impreciseFormatNumber(String number, String localNumber) + throws InvalidNumberException + { + number = number.replaceAll("[^0-9+]", ""); + + if (number.charAt(0) == '+') + return number; + + if (localNumber.charAt(0) == '+') + localNumber = localNumber.substring(1); + + if (localNumber.length() == number.length() || number.length() > localNumber.length()) + return "+" + number; + + int difference = localNumber.length() - number.length(); + + return "+" + localNumber.substring(0, difference) + number; + } + + public static String formatNumberInternational(String number) { + try { + PhoneNumberUtil util = PhoneNumberUtil.getInstance(); + PhoneNumber parsedNumber = util.parse(number, null); + return util.format(parsedNumber, PhoneNumberFormat.INTERNATIONAL); + } catch (NumberParseException e) { + Log.w(TAG, e); + return number; + } + } + + public static String formatNumber(String number, String localNumber) + throws InvalidNumberException + { + if (number == null) { + throw new InvalidNumberException("Null String passed as number."); + } + + if (number.contains("@")) { + throw new InvalidNumberException("Possible attempt to use email address."); + } + + number = number.replaceAll("[^0-9+]", ""); + + if (number.length() == 0) { + throw new InvalidNumberException("No valid characters found."); + } + +// if (number.charAt(0) == '+') +// return number; + + try { + PhoneNumberUtil util = PhoneNumberUtil.getInstance(); + PhoneNumber localNumberObject = util.parse(localNumber, null); + + String localCountryCode = util.getRegionCodeForNumber(localNumberObject); + Log.w(TAG, "Got local CC: " + localCountryCode); + + PhoneNumber numberObject = util.parse(number, localCountryCode); + return util.format(numberObject, PhoneNumberFormat.E164); + } catch (NumberParseException e) { + Log.w(TAG, e); + return impreciseFormatNumber(number, localNumber); + } + } + + public static String getRegionDisplayName(String regionCode) { + return (regionCode == null || regionCode.equals("ZZ") || regionCode.equals(PhoneNumberUtil.REGION_CODE_FOR_NON_GEO_ENTITY)) + ? "Unknown country" : new Locale("", regionCode).getDisplayCountry(Locale.getDefault()); + } + + public static String formatE164(String countryCode, String number) { + try { + PhoneNumberUtil util = PhoneNumberUtil.getInstance(); + int parsedCountryCode = Integer.parseInt(countryCode); + PhoneNumber parsedNumber = util.parse(number, + util.getRegionCodeForCountryCode(parsedCountryCode)); + + return util.format(parsedNumber, PhoneNumberUtil.PhoneNumberFormat.E164); + } catch (NumberParseException e) { + Log.w(TAG, e); + } catch (NumberFormatException e) { + Log.w(TAG, e); + } + + return "+" + + countryCode.replaceAll("[^0-9]", "").replaceAll("^0*", "") + + number.replaceAll("[^0-9]", ""); + } + + public static String getInternationalFormatFromE164(String e164number) { + try { + PhoneNumberUtil util = PhoneNumberUtil.getInstance(); + PhoneNumber parsedNumber = util.parse(e164number, null); + return util.format(parsedNumber, PhoneNumberFormat.INTERNATIONAL); + } catch (NumberParseException e) { + Log.w(TAG, e); + return e164number; + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/util/RealtimeSleepTimer.java b/libsignal/src/main/java/org/session/libsignal/service/api/util/RealtimeSleepTimer.java new file mode 100644 index 000000000..e3dadd1e9 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/util/RealtimeSleepTimer.java @@ -0,0 +1,85 @@ +package org.session.libsignal.service.api.util; + +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.Build; +import android.os.SystemClock; +import android.util.Log; + +/** + * A sleep timer that is based on elapsed realtime, so + * that it works properly, even in low-power sleep modes. + * + */ +public class RealtimeSleepTimer implements SleepTimer { + private static final String TAG = RealtimeSleepTimer.class.getSimpleName(); + + private final AlarmReceiver alarmReceiver; + private final Context context; + + public RealtimeSleepTimer(Context context) { + this.context = context; + alarmReceiver = new AlarmReceiver(); + } + + @Override + public void sleep(long millis) { + context.registerReceiver(alarmReceiver, + new IntentFilter(AlarmReceiver.WAKE_UP_THREAD_ACTION)); + + final long startTime = System.currentTimeMillis(); + alarmReceiver.setAlarm(millis); + + while (System.currentTimeMillis() - startTime < millis) { + try { + synchronized (this) { + wait(millis - System.currentTimeMillis() + startTime); + } + } catch (InterruptedException e) { + Log.w(TAG, e); + } + } + + context.unregisterReceiver(alarmReceiver); + } + + private class AlarmReceiver extends BroadcastReceiver { + private static final String WAKE_UP_THREAD_ACTION = "org.session.libsignal.service.api.util.RealtimeSleepTimer.AlarmReceiver.WAKE_UP_THREAD"; + + private void setAlarm(long millis) { + final Intent intent = new Intent(WAKE_UP_THREAD_ACTION); + final PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); + final AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); + + Log.w(TAG, "Setting alarm to wake up in " + millis + "ms."); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + alarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, + SystemClock.elapsedRealtime() + millis, + pendingIntent); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, + SystemClock.elapsedRealtime() + millis, + pendingIntent); + } else { + alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, + SystemClock.elapsedRealtime() + millis, + pendingIntent); + } + } + + @Override + public void onReceive(Context context, Intent intent) { + Log.w(TAG, "Waking up."); + + synchronized (RealtimeSleepTimer.this) { + RealtimeSleepTimer.this.notifyAll(); + } + } + } +} + diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/util/SleepTimer.java b/libsignal/src/main/java/org/session/libsignal/service/api/util/SleepTimer.java new file mode 100644 index 000000000..15ab20a00 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/util/SleepTimer.java @@ -0,0 +1,5 @@ +package org.session.libsignal.service.api.util; + +public interface SleepTimer { + public void sleep(long millis) throws InterruptedException; +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/util/StreamDetails.java b/libsignal/src/main/java/org/session/libsignal/service/api/util/StreamDetails.java new file mode 100644 index 000000000..046df2959 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/util/StreamDetails.java @@ -0,0 +1,29 @@ +package org.session.libsignal.service.api.util; + + +import java.io.InputStream; + +public class StreamDetails { + + private final InputStream stream; + private final String contentType; + private final long length; + + public StreamDetails(InputStream stream, String contentType, long length) { + this.stream = stream; + this.contentType = contentType; + this.length = length; + } + + public InputStream getStream() { + return stream; + } + + public String getContentType() { + return contentType; + } + + public long getLength() { + return length; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/util/Tls12SocketFactory.java b/libsignal/src/main/java/org/session/libsignal/service/api/util/Tls12SocketFactory.java new file mode 100644 index 000000000..18975536e --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/util/Tls12SocketFactory.java @@ -0,0 +1,69 @@ +package org.session.libsignal.service.api.util; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.Socket; +import java.net.UnknownHostException; + +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; + +/** + * Enables TLS v1.2 when creating SSLSockets. + *

+ * For some reason, android supports TLS v1.2 from API 16, but enables it by + * default only from API 20. + * @link https://developer.android.com/reference/javax/net/ssl/SSLSocket.html + * @see SSLSocketFactory + */ +public class Tls12SocketFactory extends SSLSocketFactory { + private static final String[] TLS_V12_V13_ONLY = {"TLSv1.3", "TLSv1.2"}; + + final SSLSocketFactory delegate; + + public Tls12SocketFactory(SSLSocketFactory base) { + this.delegate = base; + } + + @Override + public String[] getDefaultCipherSuites() { + return delegate.getDefaultCipherSuites(); + } + + @Override + public String[] getSupportedCipherSuites() { + return delegate.getSupportedCipherSuites(); + } + + @Override + public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException { + return patch(delegate.createSocket(s, host, port, autoClose)); + } + + @Override + public Socket createSocket(String host, int port) throws IOException, UnknownHostException { + return patch(delegate.createSocket(host, port)); + } + + @Override + public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException { + return patch(delegate.createSocket(host, port, localHost, localPort)); + } + + @Override + public Socket createSocket(InetAddress host, int port) throws IOException { + return patch(delegate.createSocket(host, port)); + } + + @Override + public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException { + return patch(delegate.createSocket(address, port, localAddress, localPort)); + } + + private Socket patch(Socket s) { + if (s instanceof SSLSocket) { + ((SSLSocket) s).setEnabledProtocols(TLS_V12_V13_ONLY); + } + return s; + } +} \ No newline at end of file diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/util/UptimeSleepTimer.java b/libsignal/src/main/java/org/session/libsignal/service/api/util/UptimeSleepTimer.java new file mode 100644 index 000000000..4211377ee --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/util/UptimeSleepTimer.java @@ -0,0 +1,16 @@ +package org.session.libsignal.service.api.util; + +import org.session.libsignal.service.api.util.SleepTimer; + +/** + * A simle sleep timer. Since Thread.sleep is based on uptime + * this will not work properly in low-power sleep modes, when + * the CPU is suspended and uptime does not elapse. + * + */ +public class UptimeSleepTimer implements SleepTimer { + @Override + public void sleep(long millis) throws InterruptedException { + Thread.sleep(millis); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/api/websocket/ConnectivityListener.java b/libsignal/src/main/java/org/session/libsignal/service/api/websocket/ConnectivityListener.java new file mode 100644 index 000000000..71edd1169 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/api/websocket/ConnectivityListener.java @@ -0,0 +1,9 @@ +package org.session.libsignal.service.api.websocket; + + +public interface ConnectivityListener { + void onConnected(); + void onConnecting(); + void onDisconnected(); + void onAuthenticationFailure(); +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/configuration/SignalCdnUrl.java b/libsignal/src/main/java/org/session/libsignal/service/internal/configuration/SignalCdnUrl.java new file mode 100644 index 000000000..8c8fc9419 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/configuration/SignalCdnUrl.java @@ -0,0 +1,16 @@ +package org.session.libsignal.service.internal.configuration; + + +import org.session.libsignal.service.api.push.TrustStore; + +import okhttp3.ConnectionSpec; + +public class SignalCdnUrl extends SignalUrl { + public SignalCdnUrl(String url, TrustStore trustStore) { + super(url, trustStore); + } + + public SignalCdnUrl(String url, String hostHeader, TrustStore trustStore, ConnectionSpec connectionSpec) { + super(url, hostHeader, trustStore, connectionSpec); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/configuration/SignalContactDiscoveryUrl.java b/libsignal/src/main/java/org/session/libsignal/service/internal/configuration/SignalContactDiscoveryUrl.java new file mode 100644 index 000000000..ab74ecaa9 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/configuration/SignalContactDiscoveryUrl.java @@ -0,0 +1,17 @@ +package org.session.libsignal.service.internal.configuration; + + +import org.session.libsignal.service.api.push.TrustStore; + +import okhttp3.ConnectionSpec; + +public class SignalContactDiscoveryUrl extends SignalUrl { + + public SignalContactDiscoveryUrl(String url, TrustStore trustStore) { + super(url, trustStore); + } + + public SignalContactDiscoveryUrl(String url, String hostHeader, TrustStore trustStore, ConnectionSpec connectionSpec) { + super(url, hostHeader, trustStore, connectionSpec); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/configuration/SignalServiceConfiguration.java b/libsignal/src/main/java/org/session/libsignal/service/internal/configuration/SignalServiceConfiguration.java new file mode 100644 index 000000000..d9d725908 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/configuration/SignalServiceConfiguration.java @@ -0,0 +1,27 @@ +package org.session.libsignal.service.internal.configuration; + + +public class SignalServiceConfiguration { + + private final SignalServiceUrl[] signalServiceUrls; + private final SignalCdnUrl[] signalCdnUrls; + private final SignalContactDiscoveryUrl[] signalContactDiscoveryUrls; + + public SignalServiceConfiguration(SignalServiceUrl[] signalServiceUrls, SignalCdnUrl[] signalCdnUrls, SignalContactDiscoveryUrl[] signalContactDiscoveryUrls) { + this.signalServiceUrls = signalServiceUrls; + this.signalCdnUrls = signalCdnUrls; + this.signalContactDiscoveryUrls = signalContactDiscoveryUrls; + } + + public SignalServiceUrl[] getSignalServiceUrls() { + return signalServiceUrls; + } + + public SignalCdnUrl[] getSignalCdnUrls() { + return signalCdnUrls; + } + + public SignalContactDiscoveryUrl[] getSignalContactDiscoveryUrls() { + return signalContactDiscoveryUrls; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/configuration/SignalServiceUrl.java b/libsignal/src/main/java/org/session/libsignal/service/internal/configuration/SignalServiceUrl.java new file mode 100644 index 000000000..929096a38 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/configuration/SignalServiceUrl.java @@ -0,0 +1,17 @@ +package org.session.libsignal.service.internal.configuration; + + +import org.session.libsignal.service.api.push.TrustStore; + +import okhttp3.ConnectionSpec; + +public class SignalServiceUrl extends SignalUrl { + + public SignalServiceUrl(String url, TrustStore trustStore) { + super(url, trustStore); + } + + public SignalServiceUrl(String url, String hostHeader, TrustStore trustStore, ConnectionSpec connectionSpec) { + super(url, hostHeader, trustStore, connectionSpec); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/configuration/SignalUrl.java b/libsignal/src/main/java/org/session/libsignal/service/internal/configuration/SignalUrl.java new file mode 100644 index 000000000..1bab79d8a --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/configuration/SignalUrl.java @@ -0,0 +1,53 @@ +package org.session.libsignal.service.internal.configuration; + + +import org.session.libsignal.libsignal.util.guava.Optional; +import org.session.libsignal.service.api.push.TrustStore; +import org.session.libsignal.service.internal.util.BlacklistingTrustManager; + +import java.util.Collections; +import java.util.List; + +import javax.net.ssl.TrustManager; + +import okhttp3.ConnectionSpec; + +public class SignalUrl { + + private final String url; + private final Optional hostHeader; + private final Optional connectionSpec; + private TrustStore trustStore; + + public SignalUrl(String url, TrustStore trustStore) { + this(url, null, trustStore, null); + } + + public SignalUrl(String url, String hostHeader, + TrustStore trustStore, + ConnectionSpec connectionSpec) + { + this.url = url; + this.hostHeader = Optional.fromNullable(hostHeader); + this.trustStore = trustStore; + this.connectionSpec = Optional.fromNullable(connectionSpec); + } + + + public Optional getHostHeader() { + return hostHeader; + } + + public String getUrl() { + return url; + } + + public TrustStore getTrustStore() { + return trustStore; + } + + public Optional> getConnectionSpecs() { + return connectionSpec.isPresent() ? Optional.of(Collections.singletonList(connectionSpec.get())) : Optional.>absent(); + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/crypto/ContactDiscoveryCipher.java b/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/crypto/ContactDiscoveryCipher.java new file mode 100644 index 000000000..b3d83cd75 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/crypto/ContactDiscoveryCipher.java @@ -0,0 +1,173 @@ +package org.session.libsignal.service.internal.contacts.crypto; + + +import org.threeten.bp.Instant; +import org.threeten.bp.LocalDateTime; +import org.threeten.bp.Period; +import org.threeten.bp.ZoneId; +import org.threeten.bp.ZonedDateTime; +import org.threeten.bp.format.DateTimeFormatter; +import org.session.libsignal.libsignal.util.ByteUtil; +import org.session.libsignal.service.api.crypto.InvalidCiphertextException; +import org.session.libsignal.service.internal.contacts.crypto.UnauthenticatedQuoteException; +import org.session.libsignal.service.internal.contacts.entities.DiscoveryRequest; +import org.session.libsignal.service.internal.contacts.entities.DiscoveryResponse; +import org.session.libsignal.service.internal.contacts.entities.RemoteAttestationResponse; +import org.session.libsignal.service.internal.util.Hex; +import org.session.libsignal.service.internal.util.JsonUtil; +import org.session.libsignal.service.internal.util.Util; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.security.InvalidAlgorithmParameterException; +import java.security.InvalidKeyException; +import java.security.KeyStore; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.SignatureException; +import java.security.cert.CertPathValidatorException; +import java.security.cert.CertificateException; +import java.util.List; + +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.spec.GCMParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +public class ContactDiscoveryCipher { + + private static final int TAG_LENGTH_BYTES = 16; + private static final int TAG_LENGTH_BITS = TAG_LENGTH_BYTES * 8; + private static final long SIGNATURE_BODY_VERSION = 3L; + + public DiscoveryRequest createDiscoveryRequest(List addressBook, RemoteAttestation remoteAttestation) { + try { + ByteArrayOutputStream requestDataStream = new ByteArrayOutputStream(); + + for (String address : addressBook) { + requestDataStream.write(ByteUtil.longToByteArray(Long.parseLong(address))); + } + + byte[] requestData = requestDataStream.toByteArray(); + byte[] nonce = Util.getSecretBytes(12); + Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); + + cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(remoteAttestation.getKeys().getClientKey(), "AES"), new GCMParameterSpec(TAG_LENGTH_BITS, nonce)); + cipher.updateAAD(remoteAttestation.getRequestId()); + + byte[] cipherText = cipher.doFinal(requestData); + byte[][] parts = ByteUtil.split(cipherText, cipherText.length - TAG_LENGTH_BYTES, TAG_LENGTH_BYTES); + + return new DiscoveryRequest(addressBook.size(), remoteAttestation.getRequestId(), nonce, parts[0], parts[1]); + } catch (IOException e) { + throw new AssertionError(e); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (InvalidKeyException e) { + throw new AssertionError(e); + } catch (NoSuchPaddingException e) { + throw new AssertionError(e); + } catch (InvalidAlgorithmParameterException e) { + throw new AssertionError(e); + } catch (IllegalBlockSizeException e) { + throw new AssertionError(e); + } catch (BadPaddingException e) { + throw new AssertionError(e); + } + } + + public byte[] getDiscoveryResponseData(DiscoveryResponse response, RemoteAttestation remoteAttestation) throws InvalidCiphertextException { + return decrypt(remoteAttestation.getKeys().getServerKey(), response.getIv(), response.getData(), response.getMac()); + } + + public byte[] getRequestId(RemoteAttestationKeys keys, RemoteAttestationResponse response) throws InvalidCiphertextException { + return decrypt(keys.getServerKey(), response.getIv(), response.getCiphertext(), response.getTag()); + } + + public void verifyServerQuote(Quote quote, byte[] serverPublicStatic, String mrenclave) + throws UnauthenticatedQuoteException + { + try { + byte[] theirServerPublicStatic = new byte[serverPublicStatic.length]; + System.arraycopy(quote.getReportData(), 0, theirServerPublicStatic, 0, theirServerPublicStatic.length); + + if (!MessageDigest.isEqual(theirServerPublicStatic, serverPublicStatic)) { + throw new UnauthenticatedQuoteException("Response quote has unauthenticated report data!"); + } + + if (!MessageDigest.isEqual(Hex.fromStringCondensed(mrenclave), quote.getMrenclave())) { + throw new UnauthenticatedQuoteException("The response quote has the wrong mrenclave value in it: " + Hex.toStringCondensed(quote.getMrenclave())); + } + + if (quote.isDebugQuote()) { + throw new UnauthenticatedQuoteException("Received quote for debuggable enclave"); + } + } catch (IOException e) { + throw new UnauthenticatedQuoteException(e); + } + } + + public void verifyIasSignature(KeyStore trustStore, String certificates, String signatureBody, String signature, Quote quote) + throws SignatureException + { + if (certificates == null || certificates.isEmpty()) { + throw new SignatureException("No certificates."); + } + + try { + SigningCertificate signingCertificate = new SigningCertificate(certificates, trustStore); + signingCertificate.verifySignature(signatureBody, signature); + + SignatureBodyEntity signatureBodyEntity = JsonUtil.fromJson(signatureBody, SignatureBodyEntity.class); + + if (signatureBodyEntity.getVersion() != SIGNATURE_BODY_VERSION) { + throw new SignatureException("Unexpected signed quote version " + signatureBodyEntity.getVersion()); + } + + if (!MessageDigest.isEqual(ByteUtil.trim(signatureBodyEntity.getIsvEnclaveQuoteBody(), 432), ByteUtil.trim(quote.getQuoteBytes(), 432))) { + throw new SignatureException("Signed quote is not the same as RA quote: " + Hex.toStringCondensed(signatureBodyEntity.getIsvEnclaveQuoteBody()) + " vs " + Hex.toStringCondensed(quote.getQuoteBytes())); + } + + if (!"OK".equals(signatureBodyEntity.getIsvEnclaveQuoteStatus())) { + throw new SignatureException("Quote status is: " + signatureBodyEntity.getIsvEnclaveQuoteStatus()); + } + + if (Instant.from(ZonedDateTime.of(LocalDateTime.from(DateTimeFormatter.ofPattern("yyy-MM-dd'T'HH:mm:ss.SSSSSS").parse(signatureBodyEntity.getTimestamp())), ZoneId.of("UTC"))) + .plus(Period.ofDays(1)) + .isBefore(Instant.now())) + { + throw new SignatureException("Signature is expired"); + } + + } catch (CertificateException e) { + throw new SignatureException(e); + } catch (CertPathValidatorException e) { + throw new SignatureException(e); + } catch (IOException e) { + throw new SignatureException(e); + } + } + + private byte[] decrypt(byte[] key, byte[] iv, byte[] ciphertext, byte[] tag) throws InvalidCiphertextException { + try { + Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); + cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"), new GCMParameterSpec(128, iv)); + + return cipher.doFinal(ByteUtil.combine(ciphertext, tag)); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (NoSuchPaddingException e) { + throw new AssertionError(e); + } catch(InvalidAlgorithmParameterException e) { + throw new AssertionError(e); + } catch (IllegalBlockSizeException e) { + throw new AssertionError(e); + } catch (InvalidKeyException e) { + throw new InvalidCiphertextException(e); + } catch (BadPaddingException e) { + throw new InvalidCiphertextException(e); + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/crypto/Quote.java b/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/crypto/Quote.java new file mode 100644 index 000000000..5b2aad142 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/crypto/Quote.java @@ -0,0 +1,136 @@ +package org.session.libsignal.service.internal.contacts.crypto; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +public class Quote { + + private static final long SGX_FLAGS_INITTED = 0x0000000000000001L; + private static final long SGX_FLAGS_DEBUG = 0x0000000000000002L; + private static final long SGX_FLAGS_MODE64BIT = 0x0000000000000004L; + private static final long SGX_FLAGS_PROVISION_KEY = 0x0000000000000004L; + private static final long SGX_FLAGS_EINITTOKEN_KEY = 0x0000000000000004L; + private static final long SGX_FLAGS_RESERVED = 0xFFFFFFFFFFFFFFC8L; + private static final long SGX_XFRM_LEGACY = 0x0000000000000003L; + private static final long SGX_XFRM_AVX = 0x0000000000000006L; + private static final long SGX_XFRM_RESERVED = 0xFFFFFFFFFFFFFFF8L; + + private final int version; + private final boolean isSigLinkable; + private final long gid; + private final int qeSvn; + private final int pceSvn; + private final byte[] basename = new byte[32]; + private final byte[] cpuSvn = new byte[16]; + private final long flags; + private final long xfrm; + private final byte[] mrenclave = new byte[32]; + private final byte[] mrsigner = new byte[32]; + private final int isvProdId; + private final int isvSvn; + private final byte[] reportData = new byte[64]; + private final byte[] signature; + private final byte[] quoteBytes; + + public Quote(byte[] quoteBytes) throws InvalidQuoteFormatException { + this.quoteBytes = quoteBytes; + + ByteBuffer quoteBuf = ByteBuffer.wrap(quoteBytes); + quoteBuf.order(ByteOrder.LITTLE_ENDIAN); + + this.version = quoteBuf.getShort(0) & 0xFFFF; + if (!(version >= 1 && version <= 2)) { + throw new InvalidQuoteFormatException("unknown_quote_version "+version); + } + + int sign_type = quoteBuf.getShort(2) & 0xFFFF; + if ((sign_type & ~1) != 0) { + throw new InvalidQuoteFormatException("unknown_quote_sign_type "+sign_type); + } + + this.isSigLinkable = sign_type == 1; + this.gid = quoteBuf.getInt(4) & 0xFFFFFFFF; + this.qeSvn = quoteBuf.getShort(8) & 0xFFFF; + + if (version > 1) { + this.pceSvn = quoteBuf.getShort(10) & 0xFFFF; + } else { + readZero(quoteBuf, 10, 2); + this.pceSvn = 0; + } + + readZero(quoteBuf, 12, 4); // xeid (reserved) + read(quoteBuf, 16, basename); + + // + // report_body + // + + read(quoteBuf, 48, cpuSvn); + readZero(quoteBuf, 64, 4); // misc_select (reserved) + readZero(quoteBuf, 68, 28); // reserved1 + this.flags = quoteBuf.getLong(96); + if ((flags & SGX_FLAGS_RESERVED ) != 0 || + (flags & SGX_FLAGS_INITTED ) == 0 || + (flags & SGX_FLAGS_MODE64BIT) == 0) { + throw new InvalidQuoteFormatException("bad_quote_flags "+flags); + } + this.xfrm = quoteBuf.getLong(104); + if ((xfrm & SGX_XFRM_RESERVED) != 0) { + throw new InvalidQuoteFormatException("bad_quote_xfrm "+xfrm); + } + read(quoteBuf, 112, mrenclave); + readZero(quoteBuf, 144, 32); // reserved2 + read(quoteBuf, 176, mrsigner); + readZero(quoteBuf, 208, 96); // reserved3 + this.isvProdId = quoteBuf.getShort(304) & 0xFFFF; + this.isvSvn = quoteBuf.getShort(306) & 0xFFFF; + readZero(quoteBuf, 308, 60); // reserved4 + read(quoteBuf, 368, reportData); + + // quote signature + int sig_len = quoteBuf.getInt(432) & 0xFFFFFFFF; + if (sig_len != quoteBytes.length - 436) { + throw new InvalidQuoteFormatException("bad_quote_sig_len "+sig_len); + } + this.signature = new byte[sig_len]; + read(quoteBuf, 436, signature); + } + + public byte[] getReportData() { + return reportData; + } + + private void read(ByteBuffer quoteBuf, int pos, byte[] buf) { + quoteBuf.position(pos); + quoteBuf.get(buf); + } + + private void readZero(ByteBuffer quoteBuf, int pos, int count) { + byte[] zeroBuf = new byte[count]; + read(quoteBuf, pos, zeroBuf); + for (int zeroBufIdx = 0; zeroBufIdx < count; zeroBufIdx++) { + if (zeroBuf[zeroBufIdx] != 0) { + throw new IllegalArgumentException("quote_reserved_mismatch "+pos); + } + } + } + + public byte[] getQuoteBytes() { + return quoteBytes; + } + + public byte[] getMrenclave() { + return mrenclave; + } + + public boolean isDebugQuote() { + return (flags & SGX_FLAGS_DEBUG) != 0; + } + + public static class InvalidQuoteFormatException extends Exception { + public InvalidQuoteFormatException(String value) { + super(value); + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/crypto/RemoteAttestation.java b/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/crypto/RemoteAttestation.java new file mode 100644 index 000000000..580b662e6 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/crypto/RemoteAttestation.java @@ -0,0 +1,22 @@ +package org.session.libsignal.service.internal.contacts.crypto; + +import org.session.libsignal.service.internal.contacts.crypto.RemoteAttestationKeys; + +public class RemoteAttestation { + + private final byte[] requestId; + private final RemoteAttestationKeys keys; + + public RemoteAttestation(byte[] requestId, RemoteAttestationKeys keys) { + this.requestId = requestId; + this.keys = keys; + } + + public byte[] getRequestId() { + return requestId; + } + + public RemoteAttestationKeys getKeys() { + return keys; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/crypto/RemoteAttestationKeys.java b/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/crypto/RemoteAttestationKeys.java new file mode 100644 index 000000000..ab2515f87 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/crypto/RemoteAttestationKeys.java @@ -0,0 +1,35 @@ +package org.session.libsignal.service.internal.contacts.crypto; + + +import org.whispersystems.curve25519.Curve25519; +import org.whispersystems.curve25519.Curve25519KeyPair; +import org.session.libsignal.libsignal.kdf.HKDFv3; +import org.session.libsignal.libsignal.util.ByteUtil; + +public class RemoteAttestationKeys { + + private final byte[] clientKey = new byte[32]; + private final byte[] serverKey = new byte[32]; + + public RemoteAttestationKeys(Curve25519KeyPair keyPair, byte[] serverPublicEphemeral, byte[] serverPublicStatic) { + byte[] ephemeralToEphemeral = Curve25519.getInstance(Curve25519.BEST).calculateAgreement(serverPublicEphemeral, keyPair.getPrivateKey()); + byte[] ephemeralToStatic = Curve25519.getInstance(Curve25519.BEST).calculateAgreement(serverPublicStatic, keyPair.getPrivateKey()); + + byte[] masterSecret = ByteUtil.combine(ephemeralToEphemeral, ephemeralToStatic ); + byte[] publicKeys = ByteUtil.combine(keyPair.getPublicKey(), serverPublicEphemeral, serverPublicStatic); + + HKDFv3 generator = new HKDFv3(); + byte[] keys = generator.deriveSecrets(masterSecret, publicKeys, null, clientKey.length + serverKey.length); + + System.arraycopy(keys, 0, clientKey, 0, clientKey.length); + System.arraycopy(keys, clientKey.length, serverKey, 0, serverKey.length); + } + + public byte[] getClientKey() { + return clientKey; + } + + public byte[] getServerKey() { + return serverKey; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/crypto/SignatureBodyEntity.java b/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/crypto/SignatureBodyEntity.java new file mode 100644 index 000000000..910f7046d --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/crypto/SignatureBodyEntity.java @@ -0,0 +1,34 @@ +package org.session.libsignal.service.internal.contacts.crypto; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class SignatureBodyEntity { + + @JsonProperty + private byte[] isvEnclaveQuoteBody; + + @JsonProperty + private String isvEnclaveQuoteStatus; + + @JsonProperty + private Long version; + + @JsonProperty + private String timestamp; + + public byte[] getIsvEnclaveQuoteBody() { + return isvEnclaveQuoteBody; + } + + public String getIsvEnclaveQuoteStatus() { + return isvEnclaveQuoteStatus; + } + + public Long getVersion() { + return version; + } + + public String getTimestamp() { + return timestamp; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/crypto/SigningCertificate.java b/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/crypto/SigningCertificate.java new file mode 100644 index 000000000..aad888ed4 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/crypto/SigningCertificate.java @@ -0,0 +1,79 @@ +package org.session.libsignal.service.internal.contacts.crypto; + +import org.session.libsignal.service.internal.util.Base64; + +import java.io.ByteArrayInputStream; +import java.net.URLDecoder; +import java.security.InvalidAlgorithmParameterException; +import java.security.InvalidKeyException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.Signature; +import java.security.SignatureException; +import java.security.cert.CertPath; +import java.security.cert.CertPathValidator; +import java.security.cert.CertPathValidatorException; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; +import java.security.cert.PKIXParameters; +import java.security.cert.X509Certificate; +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; + +public class SigningCertificate { + + private final CertPath path; + + public SigningCertificate(String certificateChain, KeyStore trustStore) + throws CertificateException, CertPathValidatorException + { + try { + CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); + Collection certificatesCollection = (Collection) certificateFactory.generateCertificates(new ByteArrayInputStream(URLDecoder.decode(certificateChain).getBytes())); + List certificates = new LinkedList(certificatesCollection); + PKIXParameters pkixParameters = new PKIXParameters(trustStore); + CertPathValidator validator = CertPathValidator.getInstance("PKIX"); + + this.path = certificateFactory.generateCertPath(certificates); + + pkixParameters.setRevocationEnabled(false); + validator.validate(path, pkixParameters); + verifyDistinguishedName(path); + } catch (KeyStoreException e) { + throw new AssertionError(e); + } catch (InvalidAlgorithmParameterException e) { + throw new AssertionError(e); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } + } + + public void verifySignature(String body, String encodedSignature) + throws SignatureException + { + try { + Signature signature = Signature.getInstance("SHA256withRSA"); + signature.initVerify(path.getCertificates().get(0)); + signature.update(body.getBytes()); + if (!signature.verify(Base64.decode(encodedSignature.getBytes()))) { + throw new SignatureException("Signature verification failed."); + } + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (InvalidKeyException e) { + throw new AssertionError(e); + } + } + + private void verifyDistinguishedName(CertPath path) throws CertificateException { + X509Certificate leaf = (X509Certificate) path.getCertificates().get(0); + String distinguishedName = leaf.getSubjectX500Principal().getName(); + + if (!"CN=Intel SGX Attestation Report Signing,O=Intel Corporation,L=Santa Clara,ST=CA,C=US".equals(distinguishedName)) { + throw new CertificateException("Bad DN: " + distinguishedName); + } + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/crypto/UnauthenticatedQuoteException.java b/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/crypto/UnauthenticatedQuoteException.java new file mode 100644 index 000000000..d27afacc4 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/crypto/UnauthenticatedQuoteException.java @@ -0,0 +1,12 @@ +package org.session.libsignal.service.internal.contacts.crypto; + + +public class UnauthenticatedQuoteException extends Exception { + public UnauthenticatedQuoteException(String s) { + super(s); + } + + public UnauthenticatedQuoteException(Exception nested) { + super(nested); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/crypto/UnauthenticatedResponseException.java b/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/crypto/UnauthenticatedResponseException.java new file mode 100644 index 000000000..003c4f9cd --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/crypto/UnauthenticatedResponseException.java @@ -0,0 +1,11 @@ +package org.session.libsignal.service.internal.contacts.crypto; + + +public class UnauthenticatedResponseException extends Exception { + public UnauthenticatedResponseException(Exception e) { + super(e); + } + public UnauthenticatedResponseException(String s) { + super(s); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/entities/DiscoveryRequest.java b/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/entities/DiscoveryRequest.java new file mode 100644 index 000000000..61c143799 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/entities/DiscoveryRequest.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2017 Open Whisper Systems + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package org.session.libsignal.service.internal.contacts.entities; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import org.session.libsignal.service.internal.util.Hex; + + +public class DiscoveryRequest { + + @JsonProperty + private int addressCount; + + @JsonProperty + private byte[] requestId; + + @JsonProperty + private byte[] iv; + + @JsonProperty + private byte[] data; + + @JsonProperty + private byte[] mac; + + public DiscoveryRequest() { + + } + + public DiscoveryRequest(int addressCount, byte[] requestId, byte[] iv, byte[] data, byte[] mac) { + this.addressCount = addressCount; + this.requestId = requestId; + this.iv = iv; + this.data = data; + this. mac = mac; + } + + public byte[] getRequestId() { + return requestId; + } + + public byte[] getIv() { + return iv; + } + + public byte[] getData() { + return data; + } + + public byte[] getMac() { + return mac; + } + + public int getAddressCount() { + return addressCount; + } + + public String toString() { + return "{ addressCount: " + addressCount + ", ticket: " + Hex.toString(requestId) + ", iv: " + Hex.toString(iv) + ", data: " + Hex.toString(data) + ", mac: " + Hex.toString(mac) + "}"; + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/entities/DiscoveryResponse.java b/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/entities/DiscoveryResponse.java new file mode 100644 index 000000000..afaf7f479 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/entities/DiscoveryResponse.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2017 Open Whisper Systems + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package org.session.libsignal.service.internal.contacts.entities; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import org.session.libsignal.service.internal.util.Hex; + +public class DiscoveryResponse { + + @JsonProperty + private byte[] iv; + + @JsonProperty + private byte[] data; + + @JsonProperty + private byte[] mac; + + public DiscoveryResponse() {} + + public DiscoveryResponse(byte[] iv, byte[] data, byte[] mac) { + this.iv = iv; + this.data = data; + this.mac = mac; + } + + public byte[] getIv() { + return iv; + } + + public byte[] getData() { + return data; + } + + public byte[] getMac() { + return mac; + } + + public String toString() { + return "{iv: " + (iv == null ? null : Hex.toString(iv)) + ", data: " + (data == null ? null: Hex.toString(data)) + ", mac: " + (mac == null ? null : Hex.toString(mac)) + "}"; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/entities/RemoteAttestationRequest.java b/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/entities/RemoteAttestationRequest.java new file mode 100644 index 000000000..71ec057cd --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/entities/RemoteAttestationRequest.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2017 Open Whisper Systems + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package org.session.libsignal.service.internal.contacts.entities; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class RemoteAttestationRequest { + + @JsonProperty + private byte[] clientPublic; + + public RemoteAttestationRequest() {} + + public RemoteAttestationRequest(byte[] clientPublic) { + this.clientPublic = clientPublic; + } + + public byte[] getClientPublic() { + return clientPublic; + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/entities/RemoteAttestationResponse.java b/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/entities/RemoteAttestationResponse.java new file mode 100644 index 000000000..51a58e569 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/contacts/entities/RemoteAttestationResponse.java @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2017 Open Whisper Systems + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package org.session.libsignal.service.internal.contacts.entities; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class RemoteAttestationResponse { + + @JsonProperty + private byte[] serverEphemeralPublic; + + @JsonProperty + private byte[] serverStaticPublic; + + @JsonProperty + private byte[] quote; + + @JsonProperty + private byte[] iv; + + @JsonProperty + private byte[] ciphertext; + + @JsonProperty + private byte[] tag; + + @JsonProperty + private String signature; + + @JsonProperty + private String certificates; + + @JsonProperty + private String signatureBody; + + public RemoteAttestationResponse(byte[] serverEphemeralPublic, byte[] serverStaticPublic, + byte[] iv, byte[] ciphertext, byte[] tag, + byte[] quote, String signature, String certificates, String signatureBody) + { + this.serverEphemeralPublic = serverEphemeralPublic; + this.serverStaticPublic = serverStaticPublic; + this.iv = iv; + this.ciphertext = ciphertext; + this.tag = tag; + this.quote = quote; + this.signature = signature; + this.certificates = certificates; + this.signatureBody = signatureBody; + } + + public RemoteAttestationResponse() {} + + public byte[] getServerEphemeralPublic() { + return serverEphemeralPublic; + } + + public byte[] getServerStaticPublic() { + return serverStaticPublic; + } + + public byte[] getQuote() { + return quote; + } + + public byte[] getIv() { + return iv; + } + + public byte[] getCiphertext() { + return ciphertext; + } + + public byte[] getTag() { + return tag; + } + + public String getSignature() { + return signature; + } + + public String getCertificates() { + return certificates; + } + + public String getSignatureBody() { + return signatureBody; + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/crypto/PaddingInputStream.java b/libsignal/src/main/java/org/session/libsignal/service/internal/crypto/PaddingInputStream.java new file mode 100644 index 000000000..4040a0078 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/crypto/PaddingInputStream.java @@ -0,0 +1,59 @@ +package org.session.libsignal.service.internal.crypto; + + +import org.session.libsignal.service.internal.util.Util; + +import java.io.FilterInputStream; +import java.io.IOException; +import java.io.InputStream; + +public class PaddingInputStream extends FilterInputStream { + + private long paddingRemaining; + + public PaddingInputStream(InputStream inputStream, long plaintextLength) { + super(inputStream); + this.paddingRemaining = getPaddedSize(plaintextLength) - plaintextLength; + } + + @Override + public int read() throws IOException { + int result = super.read(); + if (result != -1) return result; + + if (paddingRemaining > 0) { + paddingRemaining--; + return 0x00; + } + + return -1; + } + + @Override + public int read(byte[] buffer, int offset, int length) throws IOException { + int result = super.read(buffer, offset, length); + if (result != -1) return result; + + if (paddingRemaining > 0) { + length = Math.min(length, Util.toIntExact(paddingRemaining)); + paddingRemaining -= length; + return length; + } + + return -1; + } + + @Override + public int read(byte[] buffer) throws IOException { + return read(buffer, 0, buffer.length); + } + + @Override + public int available() throws IOException { + return super.available() + Util.toIntExact(paddingRemaining); + } + + public static long getPaddedSize(long size) { + return (int) Math.max(541, Math.floor(Math.pow(1.05, Math.ceil(Math.log(size) / Math.log(1.05))))); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/crypto/ProvisioningCipher.java b/libsignal/src/main/java/org/session/libsignal/service/internal/crypto/ProvisioningCipher.java new file mode 100644 index 000000000..93119e05b --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/crypto/ProvisioningCipher.java @@ -0,0 +1,91 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.internal.crypto; + +import com.google.protobuf.ByteString; + +import org.session.libsignal.libsignal.InvalidKeyException; +import org.session.libsignal.libsignal.ecc.Curve; +import org.session.libsignal.libsignal.ecc.ECKeyPair; +import org.session.libsignal.libsignal.ecc.ECPublicKey; +import org.session.libsignal.libsignal.kdf.HKDFv3; +import org.session.libsignal.service.internal.util.Util; + +import java.security.NoSuchAlgorithmException; + +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.Mac; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.spec.SecretKeySpec; + +import static org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelope; +import static org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage; + + +public class ProvisioningCipher { + + private static final String TAG = ProvisioningCipher.class.getSimpleName(); + + private final ECPublicKey theirPublicKey; + + public ProvisioningCipher(ECPublicKey theirPublicKey) { + this.theirPublicKey = theirPublicKey; + } + + public byte[] encrypt(ProvisionMessage message) throws InvalidKeyException { + ECKeyPair ourKeyPair = Curve.generateKeyPair(); + byte[] sharedSecret = Curve.calculateAgreement(theirPublicKey, ourKeyPair.getPrivateKey()); + byte[] derivedSecret = new HKDFv3().deriveSecrets(sharedSecret, "TextSecure Provisioning Message".getBytes(), 64); + byte[][] parts = Util.split(derivedSecret, 32, 32); + + byte[] version = {0x01}; + byte[] ciphertext = getCiphertext(parts[0], message.toByteArray()); + byte[] mac = getMac(parts[1], Util.join(version, ciphertext)); + byte[] body = Util.join(version, ciphertext, mac); + + return ProvisionEnvelope.newBuilder() + .setPublicKey(ByteString.copyFrom(ourKeyPair.getPublicKey().serialize())) + .setBody(ByteString.copyFrom(body)) + .build() + .toByteArray(); + } + + private byte[] getCiphertext(byte[] key, byte[] message) { + try { + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES")); + + return Util.join(cipher.getIV(), cipher.doFinal(message)); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (NoSuchPaddingException e) { + throw new AssertionError(e); + } catch (java.security.InvalidKeyException e) { + throw new AssertionError(e); + } catch (IllegalBlockSizeException e) { + throw new AssertionError(e); + } catch (BadPaddingException e) { + throw new AssertionError(e); + } + } + + private byte[] getMac(byte[] key, byte[] message) { + try { + Mac mac = Mac.getInstance("HmacSHA256"); + mac.init(new SecretKeySpec(key, "HmacSHA256")); + + return mac.doFinal(message); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (java.security.InvalidKeyException e) { + throw new AssertionError(e); + } + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/AccountAttributes.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/AccountAttributes.java new file mode 100644 index 000000000..a7c1157cb --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/AccountAttributes.java @@ -0,0 +1,81 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.internal.push; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class AccountAttributes { + + @JsonProperty + private String signalingKey; + + @JsonProperty + private int registrationId; + + @JsonProperty + private boolean voice; + + @JsonProperty + private boolean video; + + @JsonProperty + private boolean fetchesMessages; + + @JsonProperty + private String pin; + + @JsonProperty + private byte[] unidentifiedAccessKey; + + @JsonProperty + private boolean unrestrictedUnidentifiedAccess; + + public AccountAttributes(String signalingKey, int registrationId, boolean fetchesMessages, String pin, byte[] unidentifiedAccessKey, boolean unrestrictedUnidentifiedAccess) { + this.signalingKey = signalingKey; + this.registrationId = registrationId; + this.voice = true; + this.video = true; + this.fetchesMessages = fetchesMessages; + this.pin = pin; + this.unidentifiedAccessKey = unidentifiedAccessKey; + this.unrestrictedUnidentifiedAccess = unrestrictedUnidentifiedAccess; + } + + public AccountAttributes() {} + + public String getSignalingKey() { + return signalingKey; + } + + public int getRegistrationId() { + return registrationId; + } + + public boolean isVoice() { + return voice; + } + + public boolean isVideo() { + return video; + } + + public boolean isFetchesMessages() { + return fetchesMessages; + } + + public String getPin() { + return pin; + } + + public byte[] getUnidentifiedAccessKey() { + return unidentifiedAccessKey; + } + + public boolean isUnrestrictedUnidentifiedAccess() { + return unrestrictedUnidentifiedAccess; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/AttachmentUploadAttributes.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/AttachmentUploadAttributes.java new file mode 100644 index 000000000..65bed7ec2 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/AttachmentUploadAttributes.java @@ -0,0 +1,78 @@ +package org.session.libsignal.service.internal.push; + + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class AttachmentUploadAttributes { + @JsonProperty + private String url; + + @JsonProperty + private String key; + + @JsonProperty + private String credential; + + @JsonProperty + private String acl; + + @JsonProperty + private String algorithm; + + @JsonProperty + private String date; + + @JsonProperty + private String policy; + + @JsonProperty + private String signature; + + @JsonProperty + private String attachmentId; + + @JsonProperty + private String attachmentIdString; + + public AttachmentUploadAttributes() {} + + public String getUrl() { + return url; + } + + public String getKey() { + return key; + } + + public String getCredential() { + return credential; + } + + public String getAcl() { + return acl; + } + + public String getAlgorithm() { + return algorithm; + } + + public String getDate() { + return date; + } + + public String getPolicy() { + return policy; + } + + public String getSignature() { + return signature; + } + + public String getAttachmentId() { + return attachmentId; + } + + public String getAttachmentIdString() { + return attachmentIdString; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/ContactDiscoveryCredentials.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/ContactDiscoveryCredentials.java new file mode 100644 index 000000000..3018150ad --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/ContactDiscoveryCredentials.java @@ -0,0 +1,28 @@ +package org.session.libsignal.service.internal.push; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class ContactDiscoveryCredentials { + + @JsonProperty + private String username; + + @JsonProperty + private String password; + + public void setUsername(String username) { + this.username = username; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getUsername() { + return username; + } + + public String getPassword() { + return password; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/ContactDiscoveryFailureReason.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/ContactDiscoveryFailureReason.java new file mode 100644 index 000000000..da59b0764 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/ContactDiscoveryFailureReason.java @@ -0,0 +1,13 @@ +package org.session.libsignal.service.internal.push; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class ContactDiscoveryFailureReason { + + @JsonProperty + private final String reason; + + public ContactDiscoveryFailureReason(String reason) { + this.reason = reason == null ? "" : reason; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/ContactTokenDetailsList.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/ContactTokenDetailsList.java new file mode 100644 index 000000000..7e644bef4 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/ContactTokenDetailsList.java @@ -0,0 +1,25 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.internal.push; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import org.session.libsignal.service.api.push.ContactTokenDetails; + +import java.util.List; + +public class ContactTokenDetailsList { + + @JsonProperty + private List contacts; + + public ContactTokenDetailsList() {} + + public List getContacts() { + return contacts; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/ContactTokenList.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/ContactTokenList.java new file mode 100644 index 000000000..530bcce85 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/ContactTokenList.java @@ -0,0 +1,24 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.internal.push; + +import java.util.List; + +public class ContactTokenList { + + private List contacts; + + public ContactTokenList(List contacts) { + this.contacts = contacts; + } + + public ContactTokenList() {} + + public List getContacts() { + return contacts; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/DeviceCode.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/DeviceCode.java new file mode 100644 index 000000000..e92ee7fce --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/DeviceCode.java @@ -0,0 +1,13 @@ +package org.session.libsignal.service.internal.push; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class DeviceCode { + + @JsonProperty + private String verificationCode; + + public String getVerificationCode() { + return verificationCode; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/DeviceInfoList.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/DeviceInfoList.java new file mode 100644 index 000000000..7c3373df2 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/DeviceInfoList.java @@ -0,0 +1,19 @@ +package org.session.libsignal.service.internal.push; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import org.session.libsignal.service.api.messages.multidevice.DeviceInfo; + +import java.util.List; + +public class DeviceInfoList { + + @JsonProperty + private List devices; + + public DeviceInfoList() {} + + public List getDevices() { + return devices; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/DeviceLimit.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/DeviceLimit.java new file mode 100644 index 000000000..cf22e8eca --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/DeviceLimit.java @@ -0,0 +1,20 @@ +package org.session.libsignal.service.internal.push; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class DeviceLimit { + + @JsonProperty + private int current; + + @JsonProperty + private int max; + + public int getCurrent() { + return current; + } + + public int getMax() { + return max; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/DeviceLimitExceededException.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/DeviceLimitExceededException.java new file mode 100644 index 000000000..ca00a33c3 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/DeviceLimitExceededException.java @@ -0,0 +1,20 @@ +package org.session.libsignal.service.internal.push; + +import org.session.libsignal.service.api.push.exceptions.NonSuccessfulResponseCodeException; + +public class DeviceLimitExceededException extends NonSuccessfulResponseCodeException { + + private final DeviceLimit deviceLimit; + + public DeviceLimitExceededException(DeviceLimit deviceLimit) { + this.deviceLimit = deviceLimit; + } + + public int getCurrent() { + return deviceLimit.getCurrent(); + } + + public int getMax() { + return deviceLimit.getMax(); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/LockedException.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/LockedException.java new file mode 100644 index 000000000..ed7e3285b --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/LockedException.java @@ -0,0 +1,23 @@ +package org.session.libsignal.service.internal.push; + + +import org.session.libsignal.service.api.push.exceptions.NonSuccessfulResponseCodeException; + +public class LockedException extends NonSuccessfulResponseCodeException { + + private int length; + private long timeRemaining; + + LockedException(int length, long timeRemaining) { + this.length = length; + this.timeRemaining = timeRemaining; + } + + public int getLength() { + return length; + } + + public long getTimeRemaining() { + return timeRemaining; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/MismatchedDevices.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/MismatchedDevices.java new file mode 100644 index 000000000..bf9f6f90e --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/MismatchedDevices.java @@ -0,0 +1,27 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.internal.push; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; + +public class MismatchedDevices { + @JsonProperty + private List missingDevices; + + @JsonProperty + private List extraDevices; + + public List getMissingDevices() { + return missingDevices; + } + + public List getExtraDevices() { + return extraDevices; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/OutgoingPushMessage.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/OutgoingPushMessage.java new file mode 100644 index 000000000..8926503ed --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/OutgoingPushMessage.java @@ -0,0 +1,33 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.internal.push; + + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class OutgoingPushMessage { + + @JsonProperty + public int type; + @JsonProperty + private int destinationDeviceId; + @JsonProperty + private int destinationRegistrationId; + @JsonProperty + public String content; + + public OutgoingPushMessage(int type, + int destinationDeviceId, + int destinationRegistrationId, + String content) + { + this.type = type; + this.destinationDeviceId = destinationDeviceId; + this.destinationRegistrationId = destinationRegistrationId; + this.content = content; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/OutgoingPushMessageList.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/OutgoingPushMessageList.java new file mode 100644 index 000000000..9a23aae9d --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/OutgoingPushMessageList.java @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.internal.push; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; + +public class OutgoingPushMessageList { + + @JsonProperty + private String destination; + + @JsonProperty + private long timestamp; + + @JsonProperty + private List messages; + + @JsonProperty + private boolean online; + + public OutgoingPushMessageList(String destination, + long timestamp, + List messages, + boolean online) + { + this.timestamp = timestamp; + this.destination = destination; + this.messages = messages; + this.online = online; + } + + public String getDestination() { + return destination; + } + + public List getMessages() { + return messages; + } + + public long getTimestamp() { + return timestamp; + } + + public boolean isOnline() { + return online; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/PreKeyEntity.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/PreKeyEntity.java new file mode 100644 index 000000000..7b3155e39 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/PreKeyEntity.java @@ -0,0 +1,68 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.internal.push; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +import org.session.libsignal.libsignal.InvalidKeyException; +import org.session.libsignal.libsignal.ecc.Curve; +import org.session.libsignal.libsignal.ecc.ECPublicKey; +import org.session.libsignal.service.internal.util.Base64; + +import java.io.IOException; + +public class PreKeyEntity { + + @JsonProperty + private int keyId; + + @JsonProperty + @JsonSerialize(using = ECPublicKeySerializer.class) + @JsonDeserialize(using = ECPublicKeyDeserializer.class) + private ECPublicKey publicKey; + + public PreKeyEntity() {} + + public PreKeyEntity(int keyId, ECPublicKey publicKey) { + this.keyId = keyId; + this.publicKey = publicKey; + } + + public int getKeyId() { + return keyId; + } + + public ECPublicKey getPublicKey() { + return publicKey; + } + + private static class ECPublicKeySerializer extends JsonSerializer { + @Override + public void serialize(ECPublicKey value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + gen.writeString(Base64.encodeBytesWithoutPadding(value.serialize())); + } + } + + private static class ECPublicKeyDeserializer extends JsonDeserializer { + @Override + public ECPublicKey deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + try { + return Curve.decodePoint(Base64.decodeWithoutPadding(p.getValueAsString()), 0); + } catch (InvalidKeyException e) { + throw new IOException(e); + } + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/PreKeyResponse.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/PreKeyResponse.java new file mode 100644 index 000000000..e8e2d5100 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/PreKeyResponse.java @@ -0,0 +1,47 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.internal.push; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +import org.session.libsignal.libsignal.IdentityKey; +import org.session.libsignal.libsignal.InvalidKeyException; +import org.session.libsignal.service.internal.push.PreKeyResponseItem; +import org.session.libsignal.service.internal.util.Base64; +import org.session.libsignal.service.internal.util.JsonUtil; + +import java.io.IOException; +import java.util.List; + +public class PreKeyResponse { + + @JsonProperty + @JsonSerialize(using = JsonUtil.IdentityKeySerializer.class) + @JsonDeserialize(using = JsonUtil.IdentityKeyDeserializer.class) + private IdentityKey identityKey; + + @JsonProperty + private List devices; + + public IdentityKey getIdentityKey() { + return identityKey; + } + + public List getDevices() { + return devices; + } + + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/PreKeyResponseItem.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/PreKeyResponseItem.java new file mode 100644 index 000000000..86d34020a --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/PreKeyResponseItem.java @@ -0,0 +1,43 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.internal.push; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import org.session.libsignal.service.api.push.SignedPreKeyEntity; + +public class PreKeyResponseItem { + + @JsonProperty + private int deviceId; + + @JsonProperty + private int registrationId; + + @JsonProperty + private SignedPreKeyEntity signedPreKey; + + @JsonProperty + private PreKeyEntity preKey; + + public int getDeviceId() { + return deviceId; + } + + public int getRegistrationId() { + return registrationId; + } + + public SignedPreKeyEntity getSignedPreKey() { + return signedPreKey; + } + + public PreKeyEntity getPreKey() { + return preKey; + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/PreKeyState.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/PreKeyState.java new file mode 100644 index 000000000..f4a8a1f1e --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/PreKeyState.java @@ -0,0 +1,34 @@ +package org.session.libsignal.service.internal.push; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +import org.session.libsignal.libsignal.IdentityKey; +import org.session.libsignal.service.api.push.SignedPreKeyEntity; +import org.session.libsignal.service.internal.push.PreKeyEntity; +import org.session.libsignal.service.internal.util.JsonUtil; + +import java.util.List; + +public class PreKeyState { + + @JsonProperty + @JsonSerialize(using = JsonUtil.IdentityKeySerializer.class) + @JsonDeserialize(using = JsonUtil.IdentityKeyDeserializer.class) + private IdentityKey identityKey; + + @JsonProperty + private List preKeys; + + @JsonProperty + private SignedPreKeyEntity signedPreKey; + + + public PreKeyState(List preKeys, SignedPreKeyEntity signedPreKey, IdentityKey identityKey) { + this.preKeys = preKeys; + this.signedPreKey = signedPreKey; + this.identityKey = identityKey; + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/PreKeyStatus.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/PreKeyStatus.java new file mode 100644 index 000000000..f119667a6 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/PreKeyStatus.java @@ -0,0 +1,21 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.internal.push; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class PreKeyStatus { + + @JsonProperty + private int count; + + public PreKeyStatus() {} + + public int getCount() { + return count; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/ProfileAvatarData.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/ProfileAvatarData.java new file mode 100644 index 000000000..081c73244 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/ProfileAvatarData.java @@ -0,0 +1,37 @@ +package org.session.libsignal.service.internal.push; + + +import org.session.libsignal.service.internal.push.http.OutputStreamFactory; + +import java.io.InputStream; + +public class ProfileAvatarData { + + private final InputStream data; + private final long dataLength; + private final String contentType; + private final OutputStreamFactory outputStreamFactory; + + public ProfileAvatarData(InputStream data, long dataLength, String contentType, OutputStreamFactory outputStreamFactory) { + this.data = data; + this.dataLength = dataLength; + this.contentType = contentType; + this.outputStreamFactory = outputStreamFactory; + } + + public InputStream getData() { + return data; + } + + public long getDataLength() { + return dataLength; + } + + public OutputStreamFactory getOutputStreamFactory() { + return outputStreamFactory; + } + + public String getContentType() { + return contentType; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/ProfileAvatarUploadAttributes.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/ProfileAvatarUploadAttributes.java new file mode 100644 index 000000000..c6bfa619a --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/ProfileAvatarUploadAttributes.java @@ -0,0 +1,64 @@ +package org.session.libsignal.service.internal.push; + + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class ProfileAvatarUploadAttributes { + @JsonProperty + private String url; + + @JsonProperty + private String key; + + @JsonProperty + private String credential; + + @JsonProperty + private String acl; + + @JsonProperty + private String algorithm; + + @JsonProperty + private String date; + + @JsonProperty + private String policy; + + @JsonProperty + private String signature; + + public ProfileAvatarUploadAttributes() {} + + public String getUrl() { + return url; + } + + public String getKey() { + return key; + } + + public String getCredential() { + return credential; + } + + public String getAcl() { + return acl; + } + + public String getAlgorithm() { + return algorithm; + } + + public String getDate() { + return date; + } + + public String getPolicy() { + return policy; + } + + public String getSignature() { + return signature; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/ProvisioningMessage.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/ProvisioningMessage.java new file mode 100644 index 000000000..727f5ff8f --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/ProvisioningMessage.java @@ -0,0 +1,14 @@ +package org.session.libsignal.service.internal.push; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class ProvisioningMessage { + + @JsonProperty + private String body; + + public ProvisioningMessage(String body) { + this.body = body; + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/ProvisioningProtos.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/ProvisioningProtos.java new file mode 100644 index 000000000..bc963250f --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/ProvisioningProtos.java @@ -0,0 +1,1698 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: Provisioning.proto + +package org.session.libsignal.service.internal.push; + +public final class ProvisioningProtos { + private ProvisioningProtos() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + } + public interface ProvisionEnvelopeOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional bytes publicKey = 1; + /** + * optional bytes publicKey = 1; + */ + boolean hasPublicKey(); + /** + * optional bytes publicKey = 1; + */ + com.google.protobuf.ByteString getPublicKey(); + + // optional bytes body = 2; + /** + * optional bytes body = 2; + * + *

+     * Encrypted ProvisionMessage
+     * 
+ */ + boolean hasBody(); + /** + * optional bytes body = 2; + * + *
+     * Encrypted ProvisionMessage
+     * 
+ */ + com.google.protobuf.ByteString getBody(); + } + /** + * Protobuf type {@code signalservice.ProvisionEnvelope} + */ + public static final class ProvisionEnvelope extends + com.google.protobuf.GeneratedMessage + implements ProvisionEnvelopeOrBuilder { + // Use ProvisionEnvelope.newBuilder() to construct. + private ProvisionEnvelope(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private ProvisionEnvelope(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final ProvisionEnvelope defaultInstance; + public static ProvisionEnvelope getDefaultInstance() { + return defaultInstance; + } + + public ProvisionEnvelope getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private ProvisionEnvelope( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + publicKey_ = input.readBytes(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + body_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.ProvisioningProtos.internal_static_signalservice_ProvisionEnvelope_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.ProvisioningProtos.internal_static_signalservice_ProvisionEnvelope_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelope.class, org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelope.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public ProvisionEnvelope parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new ProvisionEnvelope(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional bytes publicKey = 1; + public static final int PUBLICKEY_FIELD_NUMBER = 1; + private com.google.protobuf.ByteString publicKey_; + /** + * optional bytes publicKey = 1; + */ + public boolean hasPublicKey() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes publicKey = 1; + */ + public com.google.protobuf.ByteString getPublicKey() { + return publicKey_; + } + + // optional bytes body = 2; + public static final int BODY_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString body_; + /** + * optional bytes body = 2; + * + *
+     * Encrypted ProvisionMessage
+     * 
+ */ + public boolean hasBody() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes body = 2; + * + *
+     * Encrypted ProvisionMessage
+     * 
+ */ + public com.google.protobuf.ByteString getBody() { + return body_; + } + + private void initFields() { + publicKey_ = com.google.protobuf.ByteString.EMPTY; + body_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, publicKey_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, body_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, publicKey_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, body_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelope parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelope parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelope parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelope parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelope parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelope parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelope parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelope parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelope parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelope parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelope prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.ProvisionEnvelope} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelopeOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.ProvisioningProtos.internal_static_signalservice_ProvisionEnvelope_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.ProvisioningProtos.internal_static_signalservice_ProvisionEnvelope_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelope.class, org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelope.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelope.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + publicKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + body_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.ProvisioningProtos.internal_static_signalservice_ProvisionEnvelope_descriptor; + } + + public org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelope getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelope.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelope build() { + org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelope result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelope buildPartial() { + org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelope result = new org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelope(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.publicKey_ = publicKey_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.body_ = body_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelope) { + return mergeFrom((org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelope)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelope other) { + if (other == org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelope.getDefaultInstance()) return this; + if (other.hasPublicKey()) { + setPublicKey(other.getPublicKey()); + } + if (other.hasBody()) { + setBody(other.getBody()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelope parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionEnvelope) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional bytes publicKey = 1; + private com.google.protobuf.ByteString publicKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes publicKey = 1; + */ + public boolean hasPublicKey() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes publicKey = 1; + */ + public com.google.protobuf.ByteString getPublicKey() { + return publicKey_; + } + /** + * optional bytes publicKey = 1; + */ + public Builder setPublicKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + publicKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes publicKey = 1; + */ + public Builder clearPublicKey() { + bitField0_ = (bitField0_ & ~0x00000001); + publicKey_ = getDefaultInstance().getPublicKey(); + onChanged(); + return this; + } + + // optional bytes body = 2; + private com.google.protobuf.ByteString body_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes body = 2; + * + *
+       * Encrypted ProvisionMessage
+       * 
+ */ + public boolean hasBody() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes body = 2; + * + *
+       * Encrypted ProvisionMessage
+       * 
+ */ + public com.google.protobuf.ByteString getBody() { + return body_; + } + /** + * optional bytes body = 2; + * + *
+       * Encrypted ProvisionMessage
+       * 
+ */ + public Builder setBody(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + body_ = value; + onChanged(); + return this; + } + /** + * optional bytes body = 2; + * + *
+       * Encrypted ProvisionMessage
+       * 
+ */ + public Builder clearBody() { + bitField0_ = (bitField0_ & ~0x00000002); + body_ = getDefaultInstance().getBody(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.ProvisionEnvelope) + } + + static { + defaultInstance = new ProvisionEnvelope(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.ProvisionEnvelope) + } + + public interface ProvisionMessageOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional bytes identityKeyPublic = 1; + /** + * optional bytes identityKeyPublic = 1; + */ + boolean hasIdentityKeyPublic(); + /** + * optional bytes identityKeyPublic = 1; + */ + com.google.protobuf.ByteString getIdentityKeyPublic(); + + // optional bytes identityKeyPrivate = 2; + /** + * optional bytes identityKeyPrivate = 2; + */ + boolean hasIdentityKeyPrivate(); + /** + * optional bytes identityKeyPrivate = 2; + */ + com.google.protobuf.ByteString getIdentityKeyPrivate(); + + // optional string number = 3; + /** + * optional string number = 3; + */ + boolean hasNumber(); + /** + * optional string number = 3; + */ + String getNumber(); + /** + * optional string number = 3; + */ + com.google.protobuf.ByteString + getNumberBytes(); + + // optional string provisioningCode = 4; + /** + * optional string provisioningCode = 4; + */ + boolean hasProvisioningCode(); + /** + * optional string provisioningCode = 4; + */ + String getProvisioningCode(); + /** + * optional string provisioningCode = 4; + */ + com.google.protobuf.ByteString + getProvisioningCodeBytes(); + + // optional string userAgent = 5; + /** + * optional string userAgent = 5; + */ + boolean hasUserAgent(); + /** + * optional string userAgent = 5; + */ + String getUserAgent(); + /** + * optional string userAgent = 5; + */ + com.google.protobuf.ByteString + getUserAgentBytes(); + + // optional bytes profileKey = 6; + /** + * optional bytes profileKey = 6; + */ + boolean hasProfileKey(); + /** + * optional bytes profileKey = 6; + */ + com.google.protobuf.ByteString getProfileKey(); + + // optional bool readReceipts = 7; + /** + * optional bool readReceipts = 7; + */ + boolean hasReadReceipts(); + /** + * optional bool readReceipts = 7; + */ + boolean getReadReceipts(); + } + /** + * Protobuf type {@code signalservice.ProvisionMessage} + */ + public static final class ProvisionMessage extends + com.google.protobuf.GeneratedMessage + implements ProvisionMessageOrBuilder { + // Use ProvisionMessage.newBuilder() to construct. + private ProvisionMessage(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private ProvisionMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final ProvisionMessage defaultInstance; + public static ProvisionMessage getDefaultInstance() { + return defaultInstance; + } + + public ProvisionMessage getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private ProvisionMessage( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + identityKeyPublic_ = input.readBytes(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + identityKeyPrivate_ = input.readBytes(); + break; + } + case 26: { + bitField0_ |= 0x00000004; + number_ = input.readBytes(); + break; + } + case 34: { + bitField0_ |= 0x00000008; + provisioningCode_ = input.readBytes(); + break; + } + case 42: { + bitField0_ |= 0x00000010; + userAgent_ = input.readBytes(); + break; + } + case 50: { + bitField0_ |= 0x00000020; + profileKey_ = input.readBytes(); + break; + } + case 56: { + bitField0_ |= 0x00000040; + readReceipts_ = input.readBool(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.ProvisioningProtos.internal_static_signalservice_ProvisionMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.ProvisioningProtos.internal_static_signalservice_ProvisionMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage.class, org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public ProvisionMessage parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new ProvisionMessage(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional bytes identityKeyPublic = 1; + public static final int IDENTITYKEYPUBLIC_FIELD_NUMBER = 1; + private com.google.protobuf.ByteString identityKeyPublic_; + /** + * optional bytes identityKeyPublic = 1; + */ + public boolean hasIdentityKeyPublic() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes identityKeyPublic = 1; + */ + public com.google.protobuf.ByteString getIdentityKeyPublic() { + return identityKeyPublic_; + } + + // optional bytes identityKeyPrivate = 2; + public static final int IDENTITYKEYPRIVATE_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString identityKeyPrivate_; + /** + * optional bytes identityKeyPrivate = 2; + */ + public boolean hasIdentityKeyPrivate() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes identityKeyPrivate = 2; + */ + public com.google.protobuf.ByteString getIdentityKeyPrivate() { + return identityKeyPrivate_; + } + + // optional string number = 3; + public static final int NUMBER_FIELD_NUMBER = 3; + private Object number_; + /** + * optional string number = 3; + */ + public boolean hasNumber() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional string number = 3; + */ + public String getNumber() { + Object ref = number_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + number_ = s; + } + return s; + } + } + /** + * optional string number = 3; + */ + public com.google.protobuf.ByteString + getNumberBytes() { + Object ref = number_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + number_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional string provisioningCode = 4; + public static final int PROVISIONINGCODE_FIELD_NUMBER = 4; + private Object provisioningCode_; + /** + * optional string provisioningCode = 4; + */ + public boolean hasProvisioningCode() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional string provisioningCode = 4; + */ + public String getProvisioningCode() { + Object ref = provisioningCode_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + provisioningCode_ = s; + } + return s; + } + } + /** + * optional string provisioningCode = 4; + */ + public com.google.protobuf.ByteString + getProvisioningCodeBytes() { + Object ref = provisioningCode_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + provisioningCode_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional string userAgent = 5; + public static final int USERAGENT_FIELD_NUMBER = 5; + private Object userAgent_; + /** + * optional string userAgent = 5; + */ + public boolean hasUserAgent() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional string userAgent = 5; + */ + public String getUserAgent() { + Object ref = userAgent_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + userAgent_ = s; + } + return s; + } + } + /** + * optional string userAgent = 5; + */ + public com.google.protobuf.ByteString + getUserAgentBytes() { + Object ref = userAgent_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + userAgent_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional bytes profileKey = 6; + public static final int PROFILEKEY_FIELD_NUMBER = 6; + private com.google.protobuf.ByteString profileKey_; + /** + * optional bytes profileKey = 6; + */ + public boolean hasProfileKey() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional bytes profileKey = 6; + */ + public com.google.protobuf.ByteString getProfileKey() { + return profileKey_; + } + + // optional bool readReceipts = 7; + public static final int READRECEIPTS_FIELD_NUMBER = 7; + private boolean readReceipts_; + /** + * optional bool readReceipts = 7; + */ + public boolean hasReadReceipts() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * optional bool readReceipts = 7; + */ + public boolean getReadReceipts() { + return readReceipts_; + } + + private void initFields() { + identityKeyPublic_ = com.google.protobuf.ByteString.EMPTY; + identityKeyPrivate_ = com.google.protobuf.ByteString.EMPTY; + number_ = ""; + provisioningCode_ = ""; + userAgent_ = ""; + profileKey_ = com.google.protobuf.ByteString.EMPTY; + readReceipts_ = false; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, identityKeyPublic_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, identityKeyPrivate_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(3, getNumberBytes()); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeBytes(4, getProvisioningCodeBytes()); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + output.writeBytes(5, getUserAgentBytes()); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + output.writeBytes(6, profileKey_); + } + if (((bitField0_ & 0x00000040) == 0x00000040)) { + output.writeBool(7, readReceipts_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, identityKeyPublic_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, identityKeyPrivate_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, getNumberBytes()); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(4, getProvisioningCodeBytes()); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(5, getUserAgentBytes()); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(6, profileKey_); + } + if (((bitField0_ & 0x00000040) == 0x00000040)) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(7, readReceipts_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.ProvisionMessage} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.ProvisioningProtos.internal_static_signalservice_ProvisionMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.ProvisioningProtos.internal_static_signalservice_ProvisionMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage.class, org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + identityKeyPublic_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + identityKeyPrivate_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + number_ = ""; + bitField0_ = (bitField0_ & ~0x00000004); + provisioningCode_ = ""; + bitField0_ = (bitField0_ & ~0x00000008); + userAgent_ = ""; + bitField0_ = (bitField0_ & ~0x00000010); + profileKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000020); + readReceipts_ = false; + bitField0_ = (bitField0_ & ~0x00000040); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.ProvisioningProtos.internal_static_signalservice_ProvisionMessage_descriptor; + } + + public org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage build() { + org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage buildPartial() { + org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage result = new org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.identityKeyPublic_ = identityKeyPublic_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.identityKeyPrivate_ = identityKeyPrivate_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.number_ = number_; + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000008; + } + result.provisioningCode_ = provisioningCode_; + if (((from_bitField0_ & 0x00000010) == 0x00000010)) { + to_bitField0_ |= 0x00000010; + } + result.userAgent_ = userAgent_; + if (((from_bitField0_ & 0x00000020) == 0x00000020)) { + to_bitField0_ |= 0x00000020; + } + result.profileKey_ = profileKey_; + if (((from_bitField0_ & 0x00000040) == 0x00000040)) { + to_bitField0_ |= 0x00000040; + } + result.readReceipts_ = readReceipts_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage) { + return mergeFrom((org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage other) { + if (other == org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage.getDefaultInstance()) return this; + if (other.hasIdentityKeyPublic()) { + setIdentityKeyPublic(other.getIdentityKeyPublic()); + } + if (other.hasIdentityKeyPrivate()) { + setIdentityKeyPrivate(other.getIdentityKeyPrivate()); + } + if (other.hasNumber()) { + bitField0_ |= 0x00000004; + number_ = other.number_; + onChanged(); + } + if (other.hasProvisioningCode()) { + bitField0_ |= 0x00000008; + provisioningCode_ = other.provisioningCode_; + onChanged(); + } + if (other.hasUserAgent()) { + bitField0_ |= 0x00000010; + userAgent_ = other.userAgent_; + onChanged(); + } + if (other.hasProfileKey()) { + setProfileKey(other.getProfileKey()); + } + if (other.hasReadReceipts()) { + setReadReceipts(other.getReadReceipts()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.ProvisioningProtos.ProvisionMessage) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional bytes identityKeyPublic = 1; + private com.google.protobuf.ByteString identityKeyPublic_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes identityKeyPublic = 1; + */ + public boolean hasIdentityKeyPublic() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes identityKeyPublic = 1; + */ + public com.google.protobuf.ByteString getIdentityKeyPublic() { + return identityKeyPublic_; + } + /** + * optional bytes identityKeyPublic = 1; + */ + public Builder setIdentityKeyPublic(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + identityKeyPublic_ = value; + onChanged(); + return this; + } + /** + * optional bytes identityKeyPublic = 1; + */ + public Builder clearIdentityKeyPublic() { + bitField0_ = (bitField0_ & ~0x00000001); + identityKeyPublic_ = getDefaultInstance().getIdentityKeyPublic(); + onChanged(); + return this; + } + + // optional bytes identityKeyPrivate = 2; + private com.google.protobuf.ByteString identityKeyPrivate_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes identityKeyPrivate = 2; + */ + public boolean hasIdentityKeyPrivate() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes identityKeyPrivate = 2; + */ + public com.google.protobuf.ByteString getIdentityKeyPrivate() { + return identityKeyPrivate_; + } + /** + * optional bytes identityKeyPrivate = 2; + */ + public Builder setIdentityKeyPrivate(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + identityKeyPrivate_ = value; + onChanged(); + return this; + } + /** + * optional bytes identityKeyPrivate = 2; + */ + public Builder clearIdentityKeyPrivate() { + bitField0_ = (bitField0_ & ~0x00000002); + identityKeyPrivate_ = getDefaultInstance().getIdentityKeyPrivate(); + onChanged(); + return this; + } + + // optional string number = 3; + private Object number_ = ""; + /** + * optional string number = 3; + */ + public boolean hasNumber() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional string number = 3; + */ + public String getNumber() { + Object ref = number_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + number_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string number = 3; + */ + public com.google.protobuf.ByteString + getNumberBytes() { + Object ref = number_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + number_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string number = 3; + */ + public Builder setNumber( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + number_ = value; + onChanged(); + return this; + } + /** + * optional string number = 3; + */ + public Builder clearNumber() { + bitField0_ = (bitField0_ & ~0x00000004); + number_ = getDefaultInstance().getNumber(); + onChanged(); + return this; + } + /** + * optional string number = 3; + */ + public Builder setNumberBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + number_ = value; + onChanged(); + return this; + } + + // optional string provisioningCode = 4; + private Object provisioningCode_ = ""; + /** + * optional string provisioningCode = 4; + */ + public boolean hasProvisioningCode() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional string provisioningCode = 4; + */ + public String getProvisioningCode() { + Object ref = provisioningCode_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + provisioningCode_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string provisioningCode = 4; + */ + public com.google.protobuf.ByteString + getProvisioningCodeBytes() { + Object ref = provisioningCode_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + provisioningCode_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string provisioningCode = 4; + */ + public Builder setProvisioningCode( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + provisioningCode_ = value; + onChanged(); + return this; + } + /** + * optional string provisioningCode = 4; + */ + public Builder clearProvisioningCode() { + bitField0_ = (bitField0_ & ~0x00000008); + provisioningCode_ = getDefaultInstance().getProvisioningCode(); + onChanged(); + return this; + } + /** + * optional string provisioningCode = 4; + */ + public Builder setProvisioningCodeBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + provisioningCode_ = value; + onChanged(); + return this; + } + + // optional string userAgent = 5; + private Object userAgent_ = ""; + /** + * optional string userAgent = 5; + */ + public boolean hasUserAgent() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional string userAgent = 5; + */ + public String getUserAgent() { + Object ref = userAgent_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + userAgent_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string userAgent = 5; + */ + public com.google.protobuf.ByteString + getUserAgentBytes() { + Object ref = userAgent_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + userAgent_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string userAgent = 5; + */ + public Builder setUserAgent( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000010; + userAgent_ = value; + onChanged(); + return this; + } + /** + * optional string userAgent = 5; + */ + public Builder clearUserAgent() { + bitField0_ = (bitField0_ & ~0x00000010); + userAgent_ = getDefaultInstance().getUserAgent(); + onChanged(); + return this; + } + /** + * optional string userAgent = 5; + */ + public Builder setUserAgentBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000010; + userAgent_ = value; + onChanged(); + return this; + } + + // optional bytes profileKey = 6; + private com.google.protobuf.ByteString profileKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes profileKey = 6; + */ + public boolean hasProfileKey() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional bytes profileKey = 6; + */ + public com.google.protobuf.ByteString getProfileKey() { + return profileKey_; + } + /** + * optional bytes profileKey = 6; + */ + public Builder setProfileKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000020; + profileKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes profileKey = 6; + */ + public Builder clearProfileKey() { + bitField0_ = (bitField0_ & ~0x00000020); + profileKey_ = getDefaultInstance().getProfileKey(); + onChanged(); + return this; + } + + // optional bool readReceipts = 7; + private boolean readReceipts_ ; + /** + * optional bool readReceipts = 7; + */ + public boolean hasReadReceipts() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * optional bool readReceipts = 7; + */ + public boolean getReadReceipts() { + return readReceipts_; + } + /** + * optional bool readReceipts = 7; + */ + public Builder setReadReceipts(boolean value) { + bitField0_ |= 0x00000040; + readReceipts_ = value; + onChanged(); + return this; + } + /** + * optional bool readReceipts = 7; + */ + public Builder clearReadReceipts() { + bitField0_ = (bitField0_ & ~0x00000040); + readReceipts_ = false; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.ProvisionMessage) + } + + static { + defaultInstance = new ProvisionMessage(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.ProvisionMessage) + } + + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_ProvisionEnvelope_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_ProvisionEnvelope_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_ProvisionMessage_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_ProvisionMessage_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + String[] descriptorData = { + "\n\022Provisioning.proto\022\rsignalservice\"4\n\021P" + + "rovisionEnvelope\022\021\n\tpublicKey\030\001 \001(\014\022\014\n\004b" + + "ody\030\002 \001(\014\"\260\001\n\020ProvisionMessage\022\031\n\021identi" + + "tyKeyPublic\030\001 \001(\014\022\032\n\022identityKeyPrivate\030" + + "\002 \001(\014\022\016\n\006number\030\003 \001(\t\022\030\n\020provisioningCod" + + "e\030\004 \001(\t\022\021\n\tuserAgent\030\005 \001(\t\022\022\n\nprofileKey" + + "\030\006 \001(\014\022\024\n\014readReceipts\030\007 \001(\010BD\n.org.whis" + + "persystems.signalservice.internal.pushB\022" + + "ProvisioningProtos" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + internal_static_signalservice_ProvisionEnvelope_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_signalservice_ProvisionEnvelope_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_ProvisionEnvelope_descriptor, + new String[] { "PublicKey", "Body", }); + internal_static_signalservice_ProvisionMessage_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_signalservice_ProvisionMessage_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_ProvisionMessage_descriptor, + new String[] { "IdentityKeyPublic", "IdentityKeyPrivate", "Number", "ProvisioningCode", "UserAgent", "ProfileKey", "ReadReceipts", }); + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/PushAttachmentData.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/PushAttachmentData.java new file mode 100644 index 000000000..9e878985c --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/PushAttachmentData.java @@ -0,0 +1,51 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.internal.push; + +import org.session.libsignal.service.api.messages.SignalServiceAttachment.ProgressListener; +import org.session.libsignal.service.internal.push.http.OutputStreamFactory; + +import java.io.InputStream; + +public class PushAttachmentData { + + private final String contentType; + private final InputStream data; + private final long dataSize; + private final OutputStreamFactory outputStreamFactory; + private final ProgressListener listener; + + public PushAttachmentData(String contentType, InputStream data, long dataSize, + OutputStreamFactory outputStreamFactory, ProgressListener listener) + { + this.contentType = contentType; + this.data = data; + this.dataSize = dataSize; + this.outputStreamFactory = outputStreamFactory; + this.listener = listener; + } + + public String getContentType() { + return contentType; + } + + public InputStream getData() { + return data; + } + + public long getDataSize() { + return dataSize; + } + + public OutputStreamFactory getOutputStreamFactory() { + return outputStreamFactory; + } + + public ProgressListener getListener() { + return listener; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/PushServiceSocket.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/PushServiceSocket.java new file mode 100644 index 000000000..8b390bcbb --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/PushServiceSocket.java @@ -0,0 +1,1176 @@ +/* + * Copyright (C) 2014-2017 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.internal.push; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.core.JsonProcessingException; + +import org.session.libsignal.libsignal.IdentityKey; +import org.session.libsignal.libsignal.ecc.ECPublicKey; +import org.session.libsignal.libsignal.logging.Log; +import org.session.libsignal.libsignal.state.PreKeyBundle; +import org.session.libsignal.libsignal.state.PreKeyRecord; +import org.session.libsignal.libsignal.state.SignedPreKeyRecord; +import org.session.libsignal.libsignal.util.Pair; +import org.session.libsignal.libsignal.util.guava.Optional; +import org.session.libsignal.service.api.crypto.UnidentifiedAccess; +import org.session.libsignal.service.api.messages.SignalServiceAttachment.ProgressListener; +import org.session.libsignal.service.api.messages.calls.TurnServerInfo; +import org.session.libsignal.service.api.messages.multidevice.DeviceInfo; +import org.session.libsignal.service.api.profiles.SignalServiceProfile; +import org.session.libsignal.service.api.push.ContactTokenDetails; +import org.session.libsignal.service.api.push.SignalServiceAddress; +import org.session.libsignal.service.api.push.SignedPreKeyEntity; +import org.session.libsignal.service.api.push.exceptions.AuthorizationFailedException; +import org.session.libsignal.service.api.push.exceptions.CaptchaRequiredException; +import org.session.libsignal.service.api.push.exceptions.ExpectationFailedException; +import org.session.libsignal.service.api.push.exceptions.NonSuccessfulResponseCodeException; +import org.session.libsignal.service.api.push.exceptions.NotFoundException; +import org.session.libsignal.service.api.push.exceptions.PushNetworkException; +import org.session.libsignal.service.api.push.exceptions.RateLimitException; +import org.session.libsignal.service.api.push.exceptions.RemoteAttestationResponseExpiredException; +import org.session.libsignal.service.api.push.exceptions.UnregisteredUserException; +import org.session.libsignal.service.api.util.CredentialsProvider; +import org.session.libsignal.service.api.util.Tls12SocketFactory; +import org.session.libsignal.service.internal.configuration.SignalServiceConfiguration; +import org.session.libsignal.service.internal.configuration.SignalUrl; +import org.session.libsignal.service.internal.contacts.entities.DiscoveryRequest; +import org.session.libsignal.service.internal.contacts.entities.DiscoveryResponse; +import org.session.libsignal.service.internal.contacts.entities.RemoteAttestationRequest; +import org.session.libsignal.service.internal.contacts.entities.RemoteAttestationResponse; +import org.session.libsignal.service.internal.push.AttachmentUploadAttributes; +import org.session.libsignal.service.internal.push.ContactDiscoveryCredentials; +import org.session.libsignal.service.internal.push.ContactDiscoveryFailureReason; +import org.session.libsignal.service.internal.push.ContactTokenDetailsList; +import org.session.libsignal.service.internal.push.DeviceLimitExceededException; +import org.session.libsignal.service.internal.push.OutgoingPushMessageList; +import org.session.libsignal.service.internal.push.PreKeyResponseItem; +import org.session.libsignal.service.internal.push.ProfileAvatarUploadAttributes; +import org.session.libsignal.service.internal.push.ProvisioningMessage; +import org.session.libsignal.service.internal.push.PushAttachmentData; +import org.session.libsignal.service.internal.push.SendMessageResponse; +import org.session.libsignal.service.internal.push.SenderCertificate; +import org.session.libsignal.service.internal.push.SignalServiceEnvelopeEntity; +import org.session.libsignal.service.internal.push.SignalServiceEnvelopeEntityList; +import org.session.libsignal.service.internal.push.exceptions.MismatchedDevicesException; +import org.session.libsignal.service.internal.push.exceptions.StaleDevicesException; +import org.session.libsignal.service.internal.push.http.DigestingRequestBody; +import org.session.libsignal.service.internal.push.http.OutputStreamFactory; +import org.session.libsignal.service.internal.util.Base64; +import org.session.libsignal.service.internal.util.BlacklistingTrustManager; +import org.session.libsignal.service.internal.util.Hex; +import org.session.libsignal.service.internal.util.JsonUtil; +import org.session.libsignal.service.internal.util.Util; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.security.KeyManagementException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.Collections; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.TrustManagerFactory; +import javax.net.ssl.X509TrustManager; + +import okhttp3.Call; +import okhttp3.ConnectionSpec; +import okhttp3.Credentials; +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; + +/** + * @author Moxie Marlinspike + */ +public class PushServiceSocket { + + private static final String TAG = PushServiceSocket.class.getSimpleName(); + + private static final String CREATE_ACCOUNT_SMS_PATH = "/v1/accounts/sms/code/%s?client=%s"; + private static final String CREATE_ACCOUNT_VOICE_PATH = "/v1/accounts/voice/code/%s"; + private static final String VERIFY_ACCOUNT_CODE_PATH = "/v1/accounts/code/%s"; + private static final String REGISTER_GCM_PATH = "/v1/accounts/gcm/"; + private static final String TURN_SERVER_INFO = "/v1/accounts/turn"; + private static final String SET_ACCOUNT_ATTRIBUTES = "/v1/accounts/attributes/"; + private static final String PIN_PATH = "/v1/accounts/pin/"; + + private static final String PREKEY_METADATA_PATH = "/v2/keys/"; + private static final String PREKEY_PATH = "/v2/keys/%s"; + private static final String PREKEY_DEVICE_PATH = "/v2/keys/%s/%s"; + private static final String SIGNED_PREKEY_PATH = "/v2/keys/signed"; + + private static final String PROVISIONING_CODE_PATH = "/v1/devices/provisioning/code"; + private static final String PROVISIONING_MESSAGE_PATH = "/v1/provisioning/%s"; + private static final String DEVICE_PATH = "/v1/devices/%s"; + + private static final String DIRECTORY_TOKENS_PATH = "/v1/directory/tokens"; + private static final String DIRECTORY_VERIFY_PATH = "/v1/directory/%s"; + private static final String DIRECTORY_AUTH_PATH = "/v1/directory/auth"; + private static final String DIRECTORY_FEEDBACK_PATH = "/v1/directory/feedback-v3/%s"; + private static final String MESSAGE_PATH = "/v1/messages/%s"; + private static final String SENDER_ACK_MESSAGE_PATH = "/v1/messages/%s/%d"; + private static final String UUID_ACK_MESSAGE_PATH = "/v1/messages/uuid/%s"; + private static final String ATTACHMENT_PATH = "/v2/attachments/form/upload"; + + private static final String PROFILE_PATH = "/v1/profile/%s"; + + private static final String SENDER_CERTIFICATE_PATH = "/v1/certificate/delivery"; + + private static final String ATTACHMENT_DOWNLOAD_PATH = "attachments/%d"; + private static final String ATTACHMENT_UPLOAD_PATH = "attachments/"; + + private static final String STICKER_MANIFEST_PATH = "stickers/%s/manifest.proto"; + private static final String STICKER_PATH = "stickers/%s/full/%d"; + + private static final Map NO_HEADERS = Collections.emptyMap(); + private static final ResponseCodeHandler NO_HANDLER = new EmptyResponseCodeHandler(); + + private long soTimeoutMillis = TimeUnit.SECONDS.toMillis(30); + private final Set connections = new HashSet(); + + private final ServiceConnectionHolder[] serviceClients; + private final ConnectionHolder[] cdnClients; + private final ConnectionHolder[] contactDiscoveryClients; + private final OkHttpClient attachmentClient; + + private final CredentialsProvider credentialsProvider; + private final String userAgent; + private final SecureRandom random; + + public PushServiceSocket(SignalServiceConfiguration signalServiceConfiguration, CredentialsProvider credentialsProvider, String userAgent) { + this.credentialsProvider = credentialsProvider; + this.userAgent = userAgent; + this.serviceClients = createServiceConnectionHolders(signalServiceConfiguration.getSignalServiceUrls()); + this.cdnClients = createConnectionHolders(signalServiceConfiguration.getSignalCdnUrls()); + this.contactDiscoveryClients = createConnectionHolders(signalServiceConfiguration.getSignalContactDiscoveryUrls()); + this.attachmentClient = createAttachmentClient(); + this.random = new SecureRandom(); + } + + public void requestSmsVerificationCode(boolean androidSmsRetriever, Optional captchaToken) throws IOException { + String path = String.format(CREATE_ACCOUNT_SMS_PATH, credentialsProvider.getUser(), androidSmsRetriever ? "android-ng" : "android"); + + if (captchaToken.isPresent()) { + path += "&captcha=" + captchaToken.get(); + } + + makeServiceRequest(path, "GET", null, NO_HEADERS, new ResponseCodeHandler() { + @Override + public void handle(int responseCode) throws NonSuccessfulResponseCodeException { + if (responseCode == 402) { + throw new CaptchaRequiredException(); + } + } + }); + } + + public void requestVoiceVerificationCode(Locale locale, Optional captchaToken) throws IOException { + Map headers = locale != null ? Collections.singletonMap("Accept-Language", locale.getLanguage() + "-" + locale.getCountry()) : NO_HEADERS; + String path = String.format(CREATE_ACCOUNT_VOICE_PATH, credentialsProvider.getUser()); + + if (captchaToken.isPresent()) { + path += "?captcha=" + captchaToken.get(); + } + + makeServiceRequest(path, "GET", null, headers, new ResponseCodeHandler() { + @Override + public void handle(int responseCode) throws NonSuccessfulResponseCodeException { + if (responseCode == 402) { + throw new CaptchaRequiredException(); + } + } + }); + } + + public void verifyAccountCode(String verificationCode, String signalingKey, int registrationId, boolean fetchesMessages, String pin, + byte[] unidentifiedAccessKey, boolean unrestrictedUnidentifiedAccess) + throws IOException + { + AccountAttributes signalingKeyEntity = new AccountAttributes(signalingKey, registrationId, fetchesMessages, pin, + unidentifiedAccessKey, unrestrictedUnidentifiedAccess); + makeServiceRequest(String.format(VERIFY_ACCOUNT_CODE_PATH, verificationCode), + "PUT", JsonUtil.toJson(signalingKeyEntity)); + } + + public void setAccountAttributes(String signalingKey, int registrationId, boolean fetchesMessages, String pin, + byte[] unidentifiedAccessKey, boolean unrestrictedUnidentifiedAccess) + throws IOException + { + AccountAttributes accountAttributes = new AccountAttributes(signalingKey, registrationId, fetchesMessages, pin, + unidentifiedAccessKey, unrestrictedUnidentifiedAccess); + makeServiceRequest(SET_ACCOUNT_ATTRIBUTES, "PUT", JsonUtil.toJson(accountAttributes)); + } + + public String getNewDeviceVerificationCode() throws IOException { + String responseText = makeServiceRequest(PROVISIONING_CODE_PATH, "GET", null); + return JsonUtil.fromJson(responseText, DeviceCode.class).getVerificationCode(); + } + + public List getDevices() throws IOException { + String responseText = makeServiceRequest(String.format(DEVICE_PATH, ""), "GET", null); + return JsonUtil.fromJson(responseText, DeviceInfoList.class).getDevices(); + } + + public void removeDevice(long deviceId) throws IOException { + makeServiceRequest(String.format(DEVICE_PATH, String.valueOf(deviceId)), "DELETE", null); + } + + public void sendProvisioningMessage(String destination, byte[] body) throws IOException { + makeServiceRequest(String.format(PROVISIONING_MESSAGE_PATH, destination), "PUT", + JsonUtil.toJson(new ProvisioningMessage(Base64.encodeBytes(body)))); + } + + public void registerGcmId(String gcmRegistrationId) throws IOException { + GcmRegistrationId registration = new GcmRegistrationId(gcmRegistrationId, true); + makeServiceRequest(REGISTER_GCM_PATH, "PUT", JsonUtil.toJson(registration)); + } + + public void unregisterGcmId() throws IOException { + makeServiceRequest(REGISTER_GCM_PATH, "DELETE", null); + } + + public void setPin(String pin) throws IOException { + RegistrationLock accountLock = new RegistrationLock(pin); + makeServiceRequest(PIN_PATH, "PUT", JsonUtil.toJson(accountLock)); + } + + public void removePin() throws IOException { + makeServiceRequest(PIN_PATH, "DELETE", null); + } + + public byte[] getSenderCertificate() throws IOException { + String responseText = makeServiceRequest(SENDER_CERTIFICATE_PATH, "GET", null); + return JsonUtil.fromJson(responseText, SenderCertificate.class).getCertificate(); + } + + public SendMessageResponse sendMessage(OutgoingPushMessageList bundle, Optional unidentifiedAccess) + throws IOException + { + try { + String responseText = makeServiceRequest(String.format(MESSAGE_PATH, bundle.getDestination()), "PUT", JsonUtil.toJson(bundle), NO_HEADERS, unidentifiedAccess); + + if (responseText == null) return new SendMessageResponse(false); + else return JsonUtil.fromJson(responseText, SendMessageResponse.class); + } catch (NotFoundException nfe) { + throw new UnregisteredUserException(bundle.getDestination(), nfe); + } + } + + public List getMessages() throws IOException { + String responseText = makeServiceRequest(String.format(MESSAGE_PATH, ""), "GET", null); + return JsonUtil.fromJson(responseText, SignalServiceEnvelopeEntityList.class).getMessages(); + } + + public void acknowledgeMessage(String sender, long timestamp) throws IOException { + makeServiceRequest(String.format(SENDER_ACK_MESSAGE_PATH, sender, timestamp), "DELETE", null); + } + + public void acknowledgeMessage(String uuid) throws IOException { + makeServiceRequest(String.format(UUID_ACK_MESSAGE_PATH, uuid), "DELETE", null); + } + + public void registerPreKeys(IdentityKey identityKey, + SignedPreKeyRecord signedPreKey, + List records) + throws IOException + { + List entities = new LinkedList(); + + for (PreKeyRecord record : records) { + PreKeyEntity entity = new PreKeyEntity(record.getId(), + record.getKeyPair().getPublicKey()); + + entities.add(entity); + } + + SignedPreKeyEntity signedPreKeyEntity = new SignedPreKeyEntity(signedPreKey.getId(), + signedPreKey.getKeyPair().getPublicKey(), + signedPreKey.getSignature()); + + makeServiceRequest(String.format(PREKEY_PATH, ""), "PUT", + JsonUtil.toJson(new PreKeyState(entities, signedPreKeyEntity, identityKey))); + } + + public int getAvailablePreKeys() throws IOException { + String responseText = makeServiceRequest(PREKEY_METADATA_PATH, "GET", null); + PreKeyStatus preKeyStatus = JsonUtil.fromJson(responseText, PreKeyStatus.class); + + return preKeyStatus.getCount(); + } + + public List getPreKeys(SignalServiceAddress destination, + Optional unidentifiedAccess, + int deviceIdInteger) + throws IOException + { + try { + String deviceId = String.valueOf(deviceIdInteger); + + if (deviceId.equals("1")) + deviceId = "*"; + + String path = String.format(PREKEY_DEVICE_PATH, destination.getNumber(), deviceId); + + if (destination.getRelay().isPresent()) { + path = path + "?relay=" + destination.getRelay().get(); + } + + String responseText = makeServiceRequest(path, "GET", null, NO_HEADERS, unidentifiedAccess); + PreKeyResponse response = JsonUtil.fromJson(responseText, PreKeyResponse.class); + List bundles = new LinkedList(); + + for (PreKeyResponseItem device : response.getDevices()) { + ECPublicKey preKey = null; + ECPublicKey signedPreKey = null; + byte[] signedPreKeySignature = null; + int preKeyId = -1; + int signedPreKeyId = -1; + + if (device.getSignedPreKey() != null) { + signedPreKey = device.getSignedPreKey().getPublicKey(); + signedPreKeyId = device.getSignedPreKey().getKeyId(); + signedPreKeySignature = device.getSignedPreKey().getSignature(); + } + + if (device.getPreKey() != null) { + preKeyId = device.getPreKey().getKeyId(); + preKey = device.getPreKey().getPublicKey(); + } + + bundles.add(new PreKeyBundle(device.getRegistrationId(), device.getDeviceId(), preKeyId, + preKey, signedPreKeyId, signedPreKey, signedPreKeySignature, + response.getIdentityKey())); + } + + return bundles; + } catch (NotFoundException nfe) { + throw new UnregisteredUserException(destination.getNumber(), nfe); + } + } + + public PreKeyBundle getPreKey(SignalServiceAddress destination, int deviceId) throws IOException { + try { + String path = String.format(PREKEY_DEVICE_PATH, destination.getNumber(), + String.valueOf(deviceId)); + + if (destination.getRelay().isPresent()) { + path = path + "?relay=" + destination.getRelay().get(); + } + + String responseText = makeServiceRequest(path, "GET", null); + PreKeyResponse response = JsonUtil.fromJson(responseText, PreKeyResponse.class); + + if (response.getDevices() == null || response.getDevices().size() < 1) + throw new IOException("Empty prekey list"); + + PreKeyResponseItem device = response.getDevices().get(0); + ECPublicKey preKey = null; + ECPublicKey signedPreKey = null; + byte[] signedPreKeySignature = null; + int preKeyId = -1; + int signedPreKeyId = -1; + + if (device.getPreKey() != null) { + preKeyId = device.getPreKey().getKeyId(); + preKey = device.getPreKey().getPublicKey(); + } + + if (device.getSignedPreKey() != null) { + signedPreKeyId = device.getSignedPreKey().getKeyId(); + signedPreKey = device.getSignedPreKey().getPublicKey(); + signedPreKeySignature = device.getSignedPreKey().getSignature(); + } + + return new PreKeyBundle(device.getRegistrationId(), device.getDeviceId(), preKeyId, preKey, + signedPreKeyId, signedPreKey, signedPreKeySignature, response.getIdentityKey()); + } catch (NotFoundException nfe) { + throw new UnregisteredUserException(destination.getNumber(), nfe); + } + } + + public SignedPreKeyEntity getCurrentSignedPreKey() throws IOException { + try { + String responseText = makeServiceRequest(SIGNED_PREKEY_PATH, "GET", null); + return JsonUtil.fromJson(responseText, SignedPreKeyEntity.class); + } catch (NotFoundException e) { + Log.w(TAG, e); + return null; + } + } + + public void setCurrentSignedPreKey(SignedPreKeyRecord signedPreKey) throws IOException { + SignedPreKeyEntity signedPreKeyEntity = new SignedPreKeyEntity(signedPreKey.getId(), + signedPreKey.getKeyPair().getPublicKey(), + signedPreKey.getSignature()); + makeServiceRequest(SIGNED_PREKEY_PATH, "PUT", JsonUtil.toJson(signedPreKeyEntity)); + } + + public void retrieveAttachment(long attachmentId, File destination, int maxSizeBytes, ProgressListener listener) + throws NonSuccessfulResponseCodeException, PushNetworkException + { + downloadFromCdn(destination, String.format(ATTACHMENT_DOWNLOAD_PATH, attachmentId), maxSizeBytes, listener); + } + + public void retrieveSticker(File destination, byte[] packId, int stickerId) + throws NonSuccessfulResponseCodeException, PushNetworkException + { + String hexPackId = Hex.toStringCondensed(packId); + downloadFromCdn(destination, String.format(STICKER_PATH, hexPackId, stickerId), 1024 * 1024, null); + } + + public byte[] retrieveSticker(byte[] packId, int stickerId) + throws NonSuccessfulResponseCodeException, PushNetworkException + { + String hexPackId = Hex.toStringCondensed(packId); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + + downloadFromCdn(output, String.format(STICKER_PATH, hexPackId, stickerId), 1024 * 1024, null); + + return output.toByteArray(); + } + + public byte[] retrieveStickerManifest(byte[] packId) + throws NonSuccessfulResponseCodeException, PushNetworkException + { + String hexPackId = Hex.toStringCondensed(packId); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + + downloadFromCdn(output, String.format(STICKER_MANIFEST_PATH, hexPackId), 1024 * 1024, null); + + return output.toByteArray(); + } + + public SignalServiceProfile retrieveProfile(SignalServiceAddress target, Optional unidentifiedAccess) + throws NonSuccessfulResponseCodeException, PushNetworkException + { + try { + String response = makeServiceRequest(String.format(PROFILE_PATH, target.getNumber()), "GET", null, NO_HEADERS, unidentifiedAccess); + return JsonUtil.fromJson(response, SignalServiceProfile.class); + } catch (IOException e) { + Log.w(TAG, e); + throw new NonSuccessfulResponseCodeException("Unable to parse entity"); + } + } + + public void retrieveProfileAvatar(String path, File destination, int maxSizeBytes) + throws NonSuccessfulResponseCodeException, PushNetworkException + { + downloadFromCdn(destination, path, maxSizeBytes, null); + } + + public void setProfileName(String name) throws NonSuccessfulResponseCodeException, PushNetworkException { + makeServiceRequest(String.format(PROFILE_PATH, "name/" + (name == null ? "" : URLEncoder.encode(name))), "PUT", ""); + } + + public void setProfileAvatar(ProfileAvatarData profileAvatar) + throws NonSuccessfulResponseCodeException, PushNetworkException + { + String response = makeServiceRequest(String.format(PROFILE_PATH, "form/avatar"), "GET", null); + ProfileAvatarUploadAttributes formAttributes; + + try { + formAttributes = JsonUtil.fromJson(response, ProfileAvatarUploadAttributes.class); + } catch (IOException e) { + Log.w(TAG, e); + throw new NonSuccessfulResponseCodeException("Unable to parse entity"); + } + + if (profileAvatar != null) { + uploadToCdn("", formAttributes.getAcl(), formAttributes.getKey(), + formAttributes.getPolicy(), formAttributes.getAlgorithm(), + formAttributes.getCredential(), formAttributes.getDate(), + formAttributes.getSignature(), profileAvatar.getData(), + profileAvatar.getContentType(), profileAvatar.getDataLength(), + profileAvatar.getOutputStreamFactory(), null); + } + } + + public List retrieveDirectory(Set contactTokens) + throws NonSuccessfulResponseCodeException, PushNetworkException + { + try { + ContactTokenList contactTokenList = new ContactTokenList(new LinkedList(contactTokens)); + String response = makeServiceRequest(DIRECTORY_TOKENS_PATH, "PUT", JsonUtil.toJson(contactTokenList)); + ContactTokenDetailsList activeTokens = JsonUtil.fromJson(response, ContactTokenDetailsList.class); + + return activeTokens.getContacts(); + } catch (IOException e) { + Log.w(TAG, e); + throw new NonSuccessfulResponseCodeException("Unable to parse entity"); + } + } + + public ContactTokenDetails getContactTokenDetails(String contactToken) throws IOException { + try { + String response = makeServiceRequest(String.format(DIRECTORY_VERIFY_PATH, contactToken), "GET", null); + return JsonUtil.fromJson(response, ContactTokenDetails.class); + } catch (NotFoundException nfe) { + return null; + } + } + + public String getContactDiscoveryAuthorization() throws IOException { + String response = makeServiceRequest(DIRECTORY_AUTH_PATH, "GET", null); + ContactDiscoveryCredentials token = JsonUtil.fromJson(response, ContactDiscoveryCredentials.class); + return Credentials.basic(token.getUsername(), token.getPassword()); + } + + public Pair> getContactDiscoveryRemoteAttestation(String authorization, RemoteAttestationRequest request, String mrenclave) + throws IOException + { + Response response = makeContactDiscoveryRequest(authorization, new LinkedList(), "/v1/attestation/" + mrenclave, "PUT", JsonUtil.toJson(request)); + ResponseBody body = response.body(); + List rawCookies = response.headers("Set-Cookie"); + List cookies = new LinkedList(); + + for (String cookie : rawCookies) { + cookies.add(cookie.split(";")[0]); + } + + if (body != null) { + return new Pair>(JsonUtil.fromJson(body.string(), RemoteAttestationResponse.class), cookies); + } else { + throw new NonSuccessfulResponseCodeException("Empty response!"); + } + } + + public DiscoveryResponse getContactDiscoveryRegisteredUsers(String authorizationToken, DiscoveryRequest request, List cookies, String mrenclave) + throws IOException + { + ResponseBody body = makeContactDiscoveryRequest(authorizationToken, cookies, "/v1/discovery/" + mrenclave, "PUT", JsonUtil.toJson(request)).body(); + + if (body != null) { + return JsonUtil.fromJson(body.string(), DiscoveryResponse.class); + } else { + throw new NonSuccessfulResponseCodeException("Empty response!"); + } + } + + public void reportContactDiscoveryServiceMatch() throws IOException { + makeServiceRequest(String.format(DIRECTORY_FEEDBACK_PATH, "ok"), "PUT", ""); + } + + public void reportContactDiscoveryServiceMismatch() throws IOException { + makeServiceRequest(String.format(DIRECTORY_FEEDBACK_PATH, "mismatch"), "PUT", ""); + } + + public void reportContactDiscoveryServiceAttestationError(String reason) throws IOException { + ContactDiscoveryFailureReason failureReason = new ContactDiscoveryFailureReason(reason); + makeServiceRequest(String.format(DIRECTORY_FEEDBACK_PATH, "attestation-error"), "PUT", JsonUtil.toJson(failureReason)); + } + + public void reportContactDiscoveryServiceUnexpectedError(String reason) throws IOException { + ContactDiscoveryFailureReason failureReason = new ContactDiscoveryFailureReason(reason); + makeServiceRequest(String.format(DIRECTORY_FEEDBACK_PATH, "unexpected-error"), "PUT", JsonUtil.toJson(failureReason)); + } + + public TurnServerInfo getTurnServerInfo() throws IOException { + String response = makeServiceRequest(TURN_SERVER_INFO, "GET", null); + return JsonUtil.fromJson(response, TurnServerInfo.class); + } + + public void setSoTimeoutMillis(long soTimeoutMillis) { + this.soTimeoutMillis = soTimeoutMillis; + } + + public void cancelInFlightRequests() { + synchronized (connections) { + Log.w(TAG, "Canceling: " + connections.size()); + for (Call connection : connections) { + Log.w(TAG, "Canceling: " + connection); + connection.cancel(); + } + } + } + + public AttachmentUploadAttributes getAttachmentUploadAttributes() throws NonSuccessfulResponseCodeException, PushNetworkException { + String response = makeServiceRequest(ATTACHMENT_PATH, "GET", null); + try { + return JsonUtil.fromJson(response, AttachmentUploadAttributes.class); + } catch (IOException e) { + Log.w(TAG, e); + throw new NonSuccessfulResponseCodeException("Unable to parse entity"); + } + } + + public Pair uploadAttachment(PushAttachmentData attachment, AttachmentUploadAttributes uploadAttributes) + throws PushNetworkException, NonSuccessfulResponseCodeException + { + long id = Long.parseLong(uploadAttributes.getAttachmentId()); + byte[] digest = uploadToCdn(ATTACHMENT_UPLOAD_PATH, uploadAttributes.getAcl(), uploadAttributes.getKey(), + uploadAttributes.getPolicy(), uploadAttributes.getAlgorithm(), + uploadAttributes.getCredential(), uploadAttributes.getDate(), + uploadAttributes.getSignature(), attachment.getData(), + "application/octet-stream", attachment.getDataSize(), + attachment.getOutputStreamFactory(), attachment.getListener()); + + return new Pair(id, digest); + } + + private void downloadFromCdn(File destination, String path, int maxSizeBytes, ProgressListener listener) + throws PushNetworkException, NonSuccessfulResponseCodeException + { + try { + FileOutputStream outputStream = new FileOutputStream(destination); + downloadFromCdn(outputStream, path, maxSizeBytes, listener); + } catch (IOException e) { + throw new PushNetworkException(e); + } + } + + private void downloadFromCdn(OutputStream outputStream, String path, int maxSizeBytes, ProgressListener listener) + throws PushNetworkException, NonSuccessfulResponseCodeException + { + ConnectionHolder connectionHolder = getRandom(cdnClients, random); + OkHttpClient okHttpClient = connectionHolder.getClient() + .newBuilder() + .connectTimeout(soTimeoutMillis, TimeUnit.MILLISECONDS) + .readTimeout(soTimeoutMillis, TimeUnit.MILLISECONDS) + .build(); + + Request.Builder request = new Request.Builder().url(connectionHolder.getUrl() + "/" + path).get(); + + if (connectionHolder.getHostHeader().isPresent()) { + request.addHeader("Host", connectionHolder.getHostHeader().get()); + } + + Call call = okHttpClient.newCall(request.build()); + + synchronized (connections) { + connections.add(call); + } + + Response response; + + try { + response = call.execute(); + + if (response.isSuccessful()) { + ResponseBody body = response.body(); + + if (body == null) throw new PushNetworkException("No response body!"); + if (body.contentLength() > maxSizeBytes) throw new PushNetworkException("Response exceeds max size!"); + + InputStream in = body.byteStream(); + byte[] buffer = new byte[32768]; + + int read, totalRead = 0; + + while ((read = in.read(buffer, 0, buffer.length)) != -1) { + outputStream.write(buffer, 0, read); + if ((totalRead += read) > maxSizeBytes) throw new PushNetworkException("Response exceeded max size!"); + + if (listener != null) { + listener.onAttachmentProgress(body.contentLength(), totalRead); + } + } + + return; + } + } catch (IOException e) { + throw new PushNetworkException(e); + } finally { + synchronized (connections) { + connections.remove(call); + } + } + + throw new NonSuccessfulResponseCodeException("Response: " + response); + } + + private byte[] uploadToCdn(String path, String acl, String key, String policy, String algorithm, + String credential, String date, String signature, + InputStream data, String contentType, long length, + OutputStreamFactory outputStreamFactory, ProgressListener progressListener) + throws PushNetworkException, NonSuccessfulResponseCodeException + { + ConnectionHolder connectionHolder = getRandom(cdnClients, random); + OkHttpClient okHttpClient = connectionHolder.getClient() + .newBuilder() + .connectTimeout(soTimeoutMillis, TimeUnit.MILLISECONDS) + .readTimeout(soTimeoutMillis, TimeUnit.MILLISECONDS) + .build(); + + DigestingRequestBody file = new DigestingRequestBody(data, outputStreamFactory, contentType, length, progressListener); + + RequestBody requestBody = new MultipartBody.Builder() + .setType(MultipartBody.FORM) + .addFormDataPart("acl", acl) + .addFormDataPart("key", key) + .addFormDataPart("policy", policy) + .addFormDataPart("Content-Type", contentType) + .addFormDataPart("x-amz-algorithm", algorithm) + .addFormDataPart("x-amz-credential", credential) + .addFormDataPart("x-amz-date", date) + .addFormDataPart("x-amz-signature", signature) + .addFormDataPart("file", "file", file) + .build(); + + Request.Builder request = new Request.Builder() + .url(connectionHolder.getUrl() + "/" + path) + .post(requestBody); + + if (connectionHolder.getHostHeader().isPresent()) { + request.addHeader("Host", connectionHolder.getHostHeader().get()); + } + + Call call = okHttpClient.newCall(request.build()); + + synchronized (connections) { + connections.add(call); + } + + try { + Response response; + + try { + response = call.execute(); + } catch (IOException e) { + throw new PushNetworkException(e); + } + + if (response.isSuccessful()) return file.getTransmittedDigest(); + else throw new NonSuccessfulResponseCodeException("Response: " + response); + } finally { + synchronized (connections) { + connections.remove(call); + } + } + } + + private String makeServiceRequest(String urlFragment, String method, String body) + throws NonSuccessfulResponseCodeException, PushNetworkException + { + return makeServiceRequest(urlFragment, method, body, NO_HEADERS, NO_HANDLER, Optional.absent()); + } + + private String makeServiceRequest(String urlFragment, String method, String body, Map headers) + throws NonSuccessfulResponseCodeException, PushNetworkException + { + return makeServiceRequest(urlFragment, method, body, headers, NO_HANDLER, Optional.absent()); + } + + private String makeServiceRequest(String urlFragment, String method, String body, Map headers, ResponseCodeHandler responseCodeHandler) + throws NonSuccessfulResponseCodeException, PushNetworkException + { + return makeServiceRequest(urlFragment, method, body, headers, responseCodeHandler, Optional.absent()); + } + + private String makeServiceRequest(String urlFragment, String method, String body, Map headers, Optional unidentifiedAccessKey) + throws NonSuccessfulResponseCodeException, PushNetworkException + { + return makeServiceRequest(urlFragment, method, body, headers, NO_HANDLER, unidentifiedAccessKey); + } + + private String makeServiceRequest(String urlFragment, String method, String body, Map headers, ResponseCodeHandler responseCodeHandler, Optional unidentifiedAccessKey) + throws NonSuccessfulResponseCodeException, PushNetworkException + { + Response response = getServiceConnection(urlFragment, method, body, headers, unidentifiedAccessKey); + + int responseCode; + String responseMessage; + String responseBody; + + try { + responseCode = response.code(); + responseMessage = response.message(); + responseBody = response.body().string(); + } catch (IOException ioe) { + throw new PushNetworkException(ioe); + } + + responseCodeHandler.handle(responseCode); + + switch (responseCode) { + case 413: + throw new RateLimitException("Rate limit exceeded: " + responseCode); + case 401: + case 403: + throw new AuthorizationFailedException("Authorization failed!"); + case 404: + throw new NotFoundException("Not found"); + case 409: + MismatchedDevices mismatchedDevices; + + try { + mismatchedDevices = JsonUtil.fromJson(responseBody, MismatchedDevices.class); + } catch (JsonProcessingException e) { + Log.w(TAG, e); + throw new NonSuccessfulResponseCodeException("Bad response: " + responseCode + " " + responseMessage); + } catch (IOException e) { + throw new PushNetworkException(e); + } + + throw new MismatchedDevicesException(mismatchedDevices); + case 410: + StaleDevices staleDevices; + + try { + staleDevices = JsonUtil.fromJson(responseBody, StaleDevices.class); + } catch (JsonProcessingException e) { + throw new NonSuccessfulResponseCodeException("Bad response: " + responseCode + " " + responseMessage); + } catch (IOException e) { + throw new PushNetworkException(e); + } + + throw new StaleDevicesException(staleDevices); + case 411: + DeviceLimit deviceLimit; + + try { + deviceLimit = JsonUtil.fromJson(responseBody, DeviceLimit.class); + } catch (JsonProcessingException e) { + throw new NonSuccessfulResponseCodeException("Bad response: " + responseCode + " " + responseMessage); + } catch (IOException e) { + throw new PushNetworkException(e); + } + + throw new DeviceLimitExceededException(deviceLimit); + case 417: + throw new ExpectationFailedException(); + case 423: + RegistrationLockFailure accountLockFailure; + + try { + accountLockFailure = JsonUtil.fromJson(responseBody, RegistrationLockFailure.class); + } catch (JsonProcessingException e) { + Log.w(TAG, e); + throw new NonSuccessfulResponseCodeException("Bad response: " + responseCode + " " + responseMessage); + } catch (IOException e) { + throw new PushNetworkException(e); + } + + throw new LockedException(accountLockFailure.length, accountLockFailure.timeRemaining); + } + + if (responseCode != 200 && responseCode != 204) { + throw new NonSuccessfulResponseCodeException("Bad response: " + responseCode + " " + + responseMessage); + } + + return responseBody; + } + + private Response getServiceConnection(String urlFragment, String method, String body, Map headers, Optional unidentifiedAccess) + throws PushNetworkException + { + try { + ServiceConnectionHolder connectionHolder = (ServiceConnectionHolder) getRandom(serviceClients, random); + OkHttpClient baseClient = unidentifiedAccess.isPresent() ? connectionHolder.getUnidentifiedClient() : connectionHolder.getClient(); + OkHttpClient okHttpClient = baseClient.newBuilder() + .connectTimeout(soTimeoutMillis, TimeUnit.MILLISECONDS) + .readTimeout(soTimeoutMillis, TimeUnit.MILLISECONDS) + .build(); + + Log.w(TAG, "Push service URL: " + connectionHolder.getUrl()); + Log.w(TAG, "Opening URL: " + String.format("%s%s", connectionHolder.getUrl(), urlFragment)); + + Request.Builder request = new Request.Builder(); + request.url(String.format("%s%s", connectionHolder.getUrl(), urlFragment)); + + if (body != null) { + request.method(method, RequestBody.create(MediaType.parse("application/json"), body)); + } else { + request.method(method, null); + } + + for (Map.Entry header : headers.entrySet()) { + request.addHeader(header.getKey(), header.getValue()); + } + + if (unidentifiedAccess.isPresent()) { + request.addHeader("Unidentified-Access-Key", Base64.encodeBytes(unidentifiedAccess.get().getUnidentifiedAccessKey())); + } else if (credentialsProvider.getPassword() != null) { + request.addHeader("Authorization", getAuthorizationHeader(credentialsProvider)); + } + + if (userAgent != null) { + request.addHeader("X-Signal-Agent", userAgent); + } + + if (connectionHolder.getHostHeader().isPresent()) { + request.addHeader("Host", connectionHolder.getHostHeader().get()); + } + + Call call = okHttpClient.newCall(request.build()); + + synchronized (connections) { + connections.add(call); + } + + try { + return call.execute(); + } finally { + synchronized (connections) { + connections.remove(call); + } + } + } catch (IOException e) { + throw new PushNetworkException(e); + } + } + + private Response makeContactDiscoveryRequest(String authorization, List cookies, String path, String method, String body) + throws PushNetworkException, NonSuccessfulResponseCodeException + { + ConnectionHolder connectionHolder = getRandom(contactDiscoveryClients, random); + OkHttpClient okHttpClient = connectionHolder.getClient() + .newBuilder() + .connectTimeout(soTimeoutMillis, TimeUnit.MILLISECONDS) + .readTimeout(soTimeoutMillis, TimeUnit.MILLISECONDS) + .build(); + + Request.Builder request = new Request.Builder().url(connectionHolder.getUrl() + path); + + if (body != null) { + request.method(method, RequestBody.create(MediaType.parse("application/json"), body)); + } else { + request.method(method, null); + } + + if (connectionHolder.getHostHeader().isPresent()) { + request.addHeader("Host", connectionHolder.getHostHeader().get()); + } + + if (authorization != null) { + request.addHeader("Authorization", authorization); + } + + if (cookies != null && !cookies.isEmpty()) { + request.addHeader("Cookie", Util.join(cookies, "; ")); + } + + Call call = okHttpClient.newCall(request.build()); + + synchronized (connections) { + connections.add(call); + } + + Response response; + + try { + response = call.execute(); + + if (response.isSuccessful()) { + return response; + } + } catch (IOException e) { + throw new PushNetworkException(e); + } finally { + synchronized (connections) { + connections.remove(call); + } + } + + switch (response.code()) { + case 401: + case 403: + throw new AuthorizationFailedException("Authorization failed!"); + case 409: + throw new RemoteAttestationResponseExpiredException("Remote attestation response expired"); + case 429: + throw new RateLimitException("Rate limit exceeded: " + response.code()); + } + + throw new NonSuccessfulResponseCodeException("Response: " + response); + } + + private ServiceConnectionHolder[] createServiceConnectionHolders(SignalUrl[] urls) { + List serviceConnectionHolders = new LinkedList(); + + for (SignalUrl url : urls) { + serviceConnectionHolders.add(new ServiceConnectionHolder(createConnectionClient(url), + createConnectionClient(url), + url.getUrl(), url.getHostHeader())); + } + + return serviceConnectionHolders.toArray(new ServiceConnectionHolder[0]); + } + + private ConnectionHolder[] createConnectionHolders(SignalUrl[] urls) { + List connectionHolders = new LinkedList(); + + for (SignalUrl url : urls) { + connectionHolders.add(new ConnectionHolder(createConnectionClient(url), url.getUrl(), url.getHostHeader())); + } + + return connectionHolders.toArray(new ConnectionHolder[0]); + } + + private OkHttpClient createConnectionClient(SignalUrl url) { + try { + TrustManager[] trustManagers = BlacklistingTrustManager.createFor(url.getTrustStore()); + + SSLContext context = SSLContext.getInstance("TLS"); + context.init(null, trustManagers, null); + + return new OkHttpClient.Builder() + .sslSocketFactory(new Tls12SocketFactory(context.getSocketFactory()), (X509TrustManager)trustManagers[0]) + .connectionSpecs(url.getConnectionSpecs().or(Util.immutableList(ConnectionSpec.RESTRICTED_TLS))) + .build(); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (KeyManagementException e) { + throw new AssertionError(e); + } + } + + private OkHttpClient createAttachmentClient() { + try { + SSLContext context = SSLContext.getInstance("TLS"); + context.init(null, null, null); + + TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); + trustManagerFactory.init((KeyStore)null); + + return new OkHttpClient.Builder() + .sslSocketFactory(new Tls12SocketFactory(context.getSocketFactory()), + (X509TrustManager)trustManagerFactory.getTrustManagers()[0]) + .connectionSpecs(Util.immutableList(ConnectionSpec.RESTRICTED_TLS)) + .build(); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (KeyManagementException e) { + throw new AssertionError(e); + } catch (KeyStoreException e) { + throw new AssertionError(e); + } + } + + private String getAuthorizationHeader(CredentialsProvider credentialsProvider) { + try { + return "Basic " + Base64.encodeBytes((credentialsProvider.getUser() + ":" + credentialsProvider.getPassword()).getBytes("UTF-8")); + } catch (UnsupportedEncodingException e) { + throw new AssertionError(e); + } + } + + private ConnectionHolder getRandom(ConnectionHolder[] connections, SecureRandom random) { + return connections[random.nextInt(connections.length)]; + } + + private static class GcmRegistrationId { + + @JsonProperty + private String gcmRegistrationId; + + @JsonProperty + private boolean webSocketChannel; + + public GcmRegistrationId() {} + + public GcmRegistrationId(String gcmRegistrationId, boolean webSocketChannel) { + this.gcmRegistrationId = gcmRegistrationId; + this.webSocketChannel = webSocketChannel; + } + } + + private static class RegistrationLock { + @JsonProperty + private String pin; + + public RegistrationLock() {} + + public RegistrationLock(String pin) { + this.pin = pin; + } + } + + private static class RegistrationLockFailure { + @JsonProperty + private int length; + + @JsonProperty + private long timeRemaining; + } + + private static class AttachmentDescriptor { + @JsonProperty + private long id; + + @JsonProperty + private String location; + + public long getId() { + return id; + } + + public String getLocation() { + return location; + } + } + + + private static class ConnectionHolder { + + private final OkHttpClient client; + private final String url; + private final Optional hostHeader; + + private ConnectionHolder(OkHttpClient client, String url, Optional hostHeader) { + this.client = client; + this.url = url; + this.hostHeader = hostHeader; + } + + OkHttpClient getClient() { + return client; + } + + public String getUrl() { + return url; + } + + Optional getHostHeader() { + return hostHeader; + } + } + + private static class ServiceConnectionHolder extends ConnectionHolder { + + private final OkHttpClient unidentifiedClient; + + private ServiceConnectionHolder(OkHttpClient identifiedClient, OkHttpClient unidentifiedClient, String url, Optional hostHeader) { + super(identifiedClient, url, hostHeader); + this.unidentifiedClient = unidentifiedClient; + } + + OkHttpClient getUnidentifiedClient() { + return unidentifiedClient; + } + } + + private interface ResponseCodeHandler { + void handle(int responseCode) throws NonSuccessfulResponseCodeException, PushNetworkException; + } + + private static class EmptyResponseCodeHandler implements ResponseCodeHandler { + @Override + public void handle(int responseCode) { } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/PushTransportDetails.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/PushTransportDetails.java new file mode 100644 index 000000000..4114147d2 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/PushTransportDetails.java @@ -0,0 +1,68 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.internal.push; + + +import org.session.libsignal.libsignal.logging.Log; + +public class PushTransportDetails { + + private static final String TAG = PushTransportDetails.class.getSimpleName(); + + private final int messageVersion; + + public PushTransportDetails(int messageVersion) { + this.messageVersion = messageVersion; + } + + public byte[] getStrippedPaddingMessageBody(byte[] messageWithPadding) { + if (messageVersion < 2) throw new AssertionError("Unknown version: " + messageVersion); + else if (messageVersion == 2) return messageWithPadding; + + int paddingStart = 0; + + for (int i=messageWithPadding.length-1;i>=0;i--) { + if (messageWithPadding[i] == (byte)0x80) { + paddingStart = i; + break; + } else if (messageWithPadding[i] != (byte)0x00) { + Log.w(TAG, "Padding byte is malformed, returning unstripped padding."); + return messageWithPadding; + } + } + + byte[] strippedMessage = new byte[paddingStart]; + System.arraycopy(messageWithPadding, 0, strippedMessage, 0, strippedMessage.length); + + return strippedMessage; + } + + public byte[] getPaddedMessageBody(byte[] messageBody) { + if (messageVersion < 2) throw new AssertionError("Unknown version: " + messageVersion); + else if (messageVersion == 2) return messageBody; + + // NOTE: This is dumb. We have our own padding scheme, but so does the cipher. + // The +1 -1 here is to make sure the Cipher has room to add one padding byte, + // otherwise it'll add a full 16 extra bytes. + byte[] paddedMessage = new byte[getPaddedMessageLength(messageBody.length + 1) - 1]; + System.arraycopy(messageBody, 0, paddedMessage, 0, messageBody.length); + paddedMessage[messageBody.length] = (byte)0x80; + + return paddedMessage; + } + + private int getPaddedMessageLength(int messageLength) { + int messageLengthWithTerminator = messageLength + 1; + int messagePartCount = messageLengthWithTerminator / 160; + + if (messageLengthWithTerminator % 160 != 0) { + messagePartCount++; + } + + return messagePartCount * 160; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/SendMessageResponse.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/SendMessageResponse.java new file mode 100644 index 000000000..b7ff39de6 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/SendMessageResponse.java @@ -0,0 +1,16 @@ +package org.session.libsignal.service.internal.push; + +public class SendMessageResponse { + + private boolean needsSync; + + public SendMessageResponse() {} + + public SendMessageResponse(boolean needsSync) { + this.needsSync = needsSync; + } + + public boolean getNeedsSync() { + return needsSync; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/SenderCertificate.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/SenderCertificate.java new file mode 100644 index 000000000..73ed837f2 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/SenderCertificate.java @@ -0,0 +1,45 @@ +package org.session.libsignal.service.internal.push; + + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +import org.session.libsignal.service.internal.util.Base64; + +import java.io.IOException; + +public class SenderCertificate { + + @JsonProperty + @JsonDeserialize(using = ByteArrayDesieralizer.class) + @JsonSerialize(using = ByteArraySerializer.class) + private byte[] certificate; + + public SenderCertificate() {} + + public byte[] getCertificate() { + return certificate; + } + + public static class ByteArraySerializer extends JsonSerializer { + @Override + public void serialize(byte[] value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + gen.writeString(Base64.encodeBytes(value)); + } + } + + public static class ByteArrayDesieralizer extends JsonDeserializer { + + @Override + public byte[] deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + return Base64.decode(p.getValueAsString()); + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/SignalServiceEnvelopeEntity.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/SignalServiceEnvelopeEntity.java new file mode 100644 index 000000000..f7ea32c35 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/SignalServiceEnvelopeEntity.java @@ -0,0 +1,71 @@ +package org.session.libsignal.service.internal.push; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class SignalServiceEnvelopeEntity { + + @JsonProperty + private int type; + + @JsonProperty + private String relay; + + @JsonProperty + private long timestamp; + + @JsonProperty + private String source; + + @JsonProperty + private int sourceDevice; + + @JsonProperty + private byte[] message; + + @JsonProperty + private byte[] content; + + @JsonProperty + private long serverTimestamp; + + @JsonProperty + private String guid; + + public SignalServiceEnvelopeEntity() {} + + public int getType() { + return type; + } + + public String getRelay() { + return relay; + } + + public long getTimestamp() { + return timestamp; + } + + public String getSource() { + return source; + } + + public int getSourceDevice() { + return sourceDevice; + } + + public byte[] getMessage() { + return message; + } + + public byte[] getContent() { + return content; + } + + public long getServerTimestamp() { + return serverTimestamp; + } + + public String getServerUuid() { + return guid; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/SignalServiceEnvelopeEntityList.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/SignalServiceEnvelopeEntityList.java new file mode 100644 index 000000000..52b49d02e --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/SignalServiceEnvelopeEntityList.java @@ -0,0 +1,14 @@ +package org.session.libsignal.service.internal.push; + +import java.util.List; + +public class SignalServiceEnvelopeEntityList { + + private List messages; + + public SignalServiceEnvelopeEntityList() {} + + public List getMessages() { + return messages; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/SignalServiceProtos.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/SignalServiceProtos.java new file mode 100644 index 000000000..21b2d6b2d --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/SignalServiceProtos.java @@ -0,0 +1,46735 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: SignalService.proto + +package org.session.libsignal.service.internal.push; + +public final class SignalServiceProtos { + private SignalServiceProtos() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + } + public interface EnvelopeOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional .signalservice.Envelope.Type type = 1; + /** + * optional .signalservice.Envelope.Type type = 1; + */ + boolean hasType(); + /** + * optional .signalservice.Envelope.Type type = 1; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope.Type getType(); + + // optional string source = 2; + /** + * optional string source = 2; + */ + boolean hasSource(); + /** + * optional string source = 2; + */ + String getSource(); + /** + * optional string source = 2; + */ + com.google.protobuf.ByteString + getSourceBytes(); + + // optional uint32 sourceDevice = 7; + /** + * optional uint32 sourceDevice = 7; + */ + boolean hasSourceDevice(); + /** + * optional uint32 sourceDevice = 7; + */ + int getSourceDevice(); + + // optional string relay = 3; + /** + * optional string relay = 3; + */ + boolean hasRelay(); + /** + * optional string relay = 3; + */ + String getRelay(); + /** + * optional string relay = 3; + */ + com.google.protobuf.ByteString + getRelayBytes(); + + // optional uint64 timestamp = 5; + /** + * optional uint64 timestamp = 5; + */ + boolean hasTimestamp(); + /** + * optional uint64 timestamp = 5; + */ + long getTimestamp(); + + // optional bytes legacyMessage = 6; + /** + * optional bytes legacyMessage = 6; + * + *
+     * Contains an encrypted DataMessage
+     * 
+ */ + boolean hasLegacyMessage(); + /** + * optional bytes legacyMessage = 6; + * + *
+     * Contains an encrypted DataMessage
+     * 
+ */ + com.google.protobuf.ByteString getLegacyMessage(); + + // optional bytes content = 8; + /** + * optional bytes content = 8; + * + *
+     * Contains an encrypted Content
+     * 
+ */ + boolean hasContent(); + /** + * optional bytes content = 8; + * + *
+     * Contains an encrypted Content
+     * 
+ */ + com.google.protobuf.ByteString getContent(); + + // optional string serverGuid = 9; + /** + * optional string serverGuid = 9; + */ + boolean hasServerGuid(); + /** + * optional string serverGuid = 9; + */ + String getServerGuid(); + /** + * optional string serverGuid = 9; + */ + com.google.protobuf.ByteString + getServerGuidBytes(); + + // optional uint64 serverTimestamp = 10; + /** + * optional uint64 serverTimestamp = 10; + */ + boolean hasServerTimestamp(); + /** + * optional uint64 serverTimestamp = 10; + */ + long getServerTimestamp(); + } + /** + * Protobuf type {@code signalservice.Envelope} + */ + public static final class Envelope extends + com.google.protobuf.GeneratedMessage + implements EnvelopeOrBuilder { + // Use Envelope.newBuilder() to construct. + private Envelope(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Envelope(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Envelope defaultInstance; + public static Envelope getDefaultInstance() { + return defaultInstance; + } + + public Envelope getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Envelope( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + int rawValue = input.readEnum(); + org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope.Type value = org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope.Type.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(1, rawValue); + } else { + bitField0_ |= 0x00000001; + type_ = value; + } + break; + } + case 18: { + bitField0_ |= 0x00000002; + source_ = input.readBytes(); + break; + } + case 26: { + bitField0_ |= 0x00000008; + relay_ = input.readBytes(); + break; + } + case 40: { + bitField0_ |= 0x00000010; + timestamp_ = input.readUInt64(); + break; + } + case 50: { + bitField0_ |= 0x00000020; + legacyMessage_ = input.readBytes(); + break; + } + case 56: { + bitField0_ |= 0x00000004; + sourceDevice_ = input.readUInt32(); + break; + } + case 66: { + bitField0_ |= 0x00000040; + content_ = input.readBytes(); + break; + } + case 74: { + bitField0_ |= 0x00000080; + serverGuid_ = input.readBytes(); + break; + } + case 80: { + bitField0_ |= 0x00000100; + serverTimestamp_ = input.readUInt64(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_Envelope_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_Envelope_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope.class, org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Envelope parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Envelope(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + /** + * Protobuf enum {@code signalservice.Envelope.Type} + */ + public enum Type + implements com.google.protobuf.ProtocolMessageEnum { + /** + * UNKNOWN = 0; + */ + UNKNOWN(0, 0), + /** + * CIPHERTEXT = 1; + */ + CIPHERTEXT(1, 1), + /** + * KEY_EXCHANGE = 2; + */ + KEY_EXCHANGE(2, 2), + /** + * PREKEY_BUNDLE = 3; + */ + PREKEY_BUNDLE(3, 3), + /** + * RECEIPT = 5; + */ + RECEIPT(4, 5), + /** + * UNIDENTIFIED_SENDER = 6; + */ + UNIDENTIFIED_SENDER(5, 6), + /** + * CLOSED_GROUP_CIPHERTEXT = 7; + * + *
+       * Loki
+       * 
+ */ + CLOSED_GROUP_CIPHERTEXT(6, 7), + /** + * FALLBACK_MESSAGE = 101; + * + *
+       * Loki - Encrypted using the fallback session cipher. Contains a pre key bundle if it's a session request.
+       * 
+ */ + FALLBACK_MESSAGE(7, 101), + ; + + /** + * UNKNOWN = 0; + */ + public static final int UNKNOWN_VALUE = 0; + /** + * CIPHERTEXT = 1; + */ + public static final int CIPHERTEXT_VALUE = 1; + /** + * KEY_EXCHANGE = 2; + */ + public static final int KEY_EXCHANGE_VALUE = 2; + /** + * PREKEY_BUNDLE = 3; + */ + public static final int PREKEY_BUNDLE_VALUE = 3; + /** + * RECEIPT = 5; + */ + public static final int RECEIPT_VALUE = 5; + /** + * UNIDENTIFIED_SENDER = 6; + */ + public static final int UNIDENTIFIED_SENDER_VALUE = 6; + /** + * CLOSED_GROUP_CIPHERTEXT = 7; + * + *
+       * Loki
+       * 
+ */ + public static final int CLOSED_GROUP_CIPHERTEXT_VALUE = 7; + /** + * FALLBACK_MESSAGE = 101; + * + *
+       * Loki - Encrypted using the fallback session cipher. Contains a pre key bundle if it's a session request.
+       * 
+ */ + public static final int FALLBACK_MESSAGE_VALUE = 101; + + + public final int getNumber() { return value; } + + public static Type valueOf(int value) { + switch (value) { + case 0: return UNKNOWN; + case 1: return CIPHERTEXT; + case 2: return KEY_EXCHANGE; + case 3: return PREKEY_BUNDLE; + case 5: return RECEIPT; + case 6: return UNIDENTIFIED_SENDER; + case 7: return CLOSED_GROUP_CIPHERTEXT; + case 101: return FALLBACK_MESSAGE; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static com.google.protobuf.Internal.EnumLiteMap + internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Type findValueByNumber(int number) { + return Type.valueOf(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(index); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope.getDescriptor().getEnumTypes().get(0); + } + + private static final Type[] VALUES = values(); + + public static Type valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int index; + private final int value; + + private Type(int index, int value) { + this.index = index; + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:signalservice.Envelope.Type) + } + + private int bitField0_; + // optional .signalservice.Envelope.Type type = 1; + public static final int TYPE_FIELD_NUMBER = 1; + private org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope.Type type_; + /** + * optional .signalservice.Envelope.Type type = 1; + */ + public boolean hasType() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional .signalservice.Envelope.Type type = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope.Type getType() { + return type_; + } + + // optional string source = 2; + public static final int SOURCE_FIELD_NUMBER = 2; + private Object source_; + /** + * optional string source = 2; + */ + public boolean hasSource() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string source = 2; + */ + public String getSource() { + Object ref = source_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + source_ = s; + } + return s; + } + } + /** + * optional string source = 2; + */ + public com.google.protobuf.ByteString + getSourceBytes() { + Object ref = source_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + source_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional uint32 sourceDevice = 7; + public static final int SOURCEDEVICE_FIELD_NUMBER = 7; + private int sourceDevice_; + /** + * optional uint32 sourceDevice = 7; + */ + public boolean hasSourceDevice() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional uint32 sourceDevice = 7; + */ + public int getSourceDevice() { + return sourceDevice_; + } + + // optional string relay = 3; + public static final int RELAY_FIELD_NUMBER = 3; + private Object relay_; + /** + * optional string relay = 3; + */ + public boolean hasRelay() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional string relay = 3; + */ + public String getRelay() { + Object ref = relay_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + relay_ = s; + } + return s; + } + } + /** + * optional string relay = 3; + */ + public com.google.protobuf.ByteString + getRelayBytes() { + Object ref = relay_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + relay_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional uint64 timestamp = 5; + public static final int TIMESTAMP_FIELD_NUMBER = 5; + private long timestamp_; + /** + * optional uint64 timestamp = 5; + */ + public boolean hasTimestamp() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional uint64 timestamp = 5; + */ + public long getTimestamp() { + return timestamp_; + } + + // optional bytes legacyMessage = 6; + public static final int LEGACYMESSAGE_FIELD_NUMBER = 6; + private com.google.protobuf.ByteString legacyMessage_; + /** + * optional bytes legacyMessage = 6; + * + *
+     * Contains an encrypted DataMessage
+     * 
+ */ + public boolean hasLegacyMessage() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional bytes legacyMessage = 6; + * + *
+     * Contains an encrypted DataMessage
+     * 
+ */ + public com.google.protobuf.ByteString getLegacyMessage() { + return legacyMessage_; + } + + // optional bytes content = 8; + public static final int CONTENT_FIELD_NUMBER = 8; + private com.google.protobuf.ByteString content_; + /** + * optional bytes content = 8; + * + *
+     * Contains an encrypted Content
+     * 
+ */ + public boolean hasContent() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * optional bytes content = 8; + * + *
+     * Contains an encrypted Content
+     * 
+ */ + public com.google.protobuf.ByteString getContent() { + return content_; + } + + // optional string serverGuid = 9; + public static final int SERVERGUID_FIELD_NUMBER = 9; + private Object serverGuid_; + /** + * optional string serverGuid = 9; + */ + public boolean hasServerGuid() { + return ((bitField0_ & 0x00000080) == 0x00000080); + } + /** + * optional string serverGuid = 9; + */ + public String getServerGuid() { + Object ref = serverGuid_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + serverGuid_ = s; + } + return s; + } + } + /** + * optional string serverGuid = 9; + */ + public com.google.protobuf.ByteString + getServerGuidBytes() { + Object ref = serverGuid_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + serverGuid_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional uint64 serverTimestamp = 10; + public static final int SERVERTIMESTAMP_FIELD_NUMBER = 10; + private long serverTimestamp_; + /** + * optional uint64 serverTimestamp = 10; + */ + public boolean hasServerTimestamp() { + return ((bitField0_ & 0x00000100) == 0x00000100); + } + /** + * optional uint64 serverTimestamp = 10; + */ + public long getServerTimestamp() { + return serverTimestamp_; + } + + private void initFields() { + type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope.Type.UNKNOWN; + source_ = ""; + sourceDevice_ = 0; + relay_ = ""; + timestamp_ = 0L; + legacyMessage_ = com.google.protobuf.ByteString.EMPTY; + content_ = com.google.protobuf.ByteString.EMPTY; + serverGuid_ = ""; + serverTimestamp_ = 0L; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeEnum(1, type_.getNumber()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, getSourceBytes()); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeBytes(3, getRelayBytes()); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + output.writeUInt64(5, timestamp_); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + output.writeBytes(6, legacyMessage_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeUInt32(7, sourceDevice_); + } + if (((bitField0_ & 0x00000040) == 0x00000040)) { + output.writeBytes(8, content_); + } + if (((bitField0_ & 0x00000080) == 0x00000080)) { + output.writeBytes(9, getServerGuidBytes()); + } + if (((bitField0_ & 0x00000100) == 0x00000100)) { + output.writeUInt64(10, serverTimestamp_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(1, type_.getNumber()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, getSourceBytes()); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, getRelayBytes()); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(5, timestamp_); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(6, legacyMessage_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(7, sourceDevice_); + } + if (((bitField0_ & 0x00000040) == 0x00000040)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(8, content_); + } + if (((bitField0_ & 0x00000080) == 0x00000080)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(9, getServerGuidBytes()); + } + if (((bitField0_ & 0x00000100) == 0x00000100)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(10, serverTimestamp_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.Envelope} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.EnvelopeOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_Envelope_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_Envelope_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope.class, org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope.Type.UNKNOWN; + bitField0_ = (bitField0_ & ~0x00000001); + source_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + sourceDevice_ = 0; + bitField0_ = (bitField0_ & ~0x00000004); + relay_ = ""; + bitField0_ = (bitField0_ & ~0x00000008); + timestamp_ = 0L; + bitField0_ = (bitField0_ & ~0x00000010); + legacyMessage_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000020); + content_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000040); + serverGuid_ = ""; + bitField0_ = (bitField0_ & ~0x00000080); + serverTimestamp_ = 0L; + bitField0_ = (bitField0_ & ~0x00000100); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_Envelope_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope result = new org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.type_ = type_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.source_ = source_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.sourceDevice_ = sourceDevice_; + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000008; + } + result.relay_ = relay_; + if (((from_bitField0_ & 0x00000010) == 0x00000010)) { + to_bitField0_ |= 0x00000010; + } + result.timestamp_ = timestamp_; + if (((from_bitField0_ & 0x00000020) == 0x00000020)) { + to_bitField0_ |= 0x00000020; + } + result.legacyMessage_ = legacyMessage_; + if (((from_bitField0_ & 0x00000040) == 0x00000040)) { + to_bitField0_ |= 0x00000040; + } + result.content_ = content_; + if (((from_bitField0_ & 0x00000080) == 0x00000080)) { + to_bitField0_ |= 0x00000080; + } + result.serverGuid_ = serverGuid_; + if (((from_bitField0_ & 0x00000100) == 0x00000100)) { + to_bitField0_ |= 0x00000100; + } + result.serverTimestamp_ = serverTimestamp_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope.getDefaultInstance()) return this; + if (other.hasType()) { + setType(other.getType()); + } + if (other.hasSource()) { + bitField0_ |= 0x00000002; + source_ = other.source_; + onChanged(); + } + if (other.hasSourceDevice()) { + setSourceDevice(other.getSourceDevice()); + } + if (other.hasRelay()) { + bitField0_ |= 0x00000008; + relay_ = other.relay_; + onChanged(); + } + if (other.hasTimestamp()) { + setTimestamp(other.getTimestamp()); + } + if (other.hasLegacyMessage()) { + setLegacyMessage(other.getLegacyMessage()); + } + if (other.hasContent()) { + setContent(other.getContent()); + } + if (other.hasServerGuid()) { + bitField0_ |= 0x00000080; + serverGuid_ = other.serverGuid_; + onChanged(); + } + if (other.hasServerTimestamp()) { + setServerTimestamp(other.getServerTimestamp()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional .signalservice.Envelope.Type type = 1; + private org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope.Type type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope.Type.UNKNOWN; + /** + * optional .signalservice.Envelope.Type type = 1; + */ + public boolean hasType() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional .signalservice.Envelope.Type type = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope.Type getType() { + return type_; + } + /** + * optional .signalservice.Envelope.Type type = 1; + */ + public Builder setType(org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope.Type value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + type_ = value; + onChanged(); + return this; + } + /** + * optional .signalservice.Envelope.Type type = 1; + */ + public Builder clearType() { + bitField0_ = (bitField0_ & ~0x00000001); + type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope.Type.UNKNOWN; + onChanged(); + return this; + } + + // optional string source = 2; + private Object source_ = ""; + /** + * optional string source = 2; + */ + public boolean hasSource() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string source = 2; + */ + public String getSource() { + Object ref = source_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + source_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string source = 2; + */ + public com.google.protobuf.ByteString + getSourceBytes() { + Object ref = source_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + source_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string source = 2; + */ + public Builder setSource( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + source_ = value; + onChanged(); + return this; + } + /** + * optional string source = 2; + */ + public Builder clearSource() { + bitField0_ = (bitField0_ & ~0x00000002); + source_ = getDefaultInstance().getSource(); + onChanged(); + return this; + } + /** + * optional string source = 2; + */ + public Builder setSourceBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + source_ = value; + onChanged(); + return this; + } + + // optional uint32 sourceDevice = 7; + private int sourceDevice_ ; + /** + * optional uint32 sourceDevice = 7; + */ + public boolean hasSourceDevice() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional uint32 sourceDevice = 7; + */ + public int getSourceDevice() { + return sourceDevice_; + } + /** + * optional uint32 sourceDevice = 7; + */ + public Builder setSourceDevice(int value) { + bitField0_ |= 0x00000004; + sourceDevice_ = value; + onChanged(); + return this; + } + /** + * optional uint32 sourceDevice = 7; + */ + public Builder clearSourceDevice() { + bitField0_ = (bitField0_ & ~0x00000004); + sourceDevice_ = 0; + onChanged(); + return this; + } + + // optional string relay = 3; + private Object relay_ = ""; + /** + * optional string relay = 3; + */ + public boolean hasRelay() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional string relay = 3; + */ + public String getRelay() { + Object ref = relay_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + relay_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string relay = 3; + */ + public com.google.protobuf.ByteString + getRelayBytes() { + Object ref = relay_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + relay_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string relay = 3; + */ + public Builder setRelay( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + relay_ = value; + onChanged(); + return this; + } + /** + * optional string relay = 3; + */ + public Builder clearRelay() { + bitField0_ = (bitField0_ & ~0x00000008); + relay_ = getDefaultInstance().getRelay(); + onChanged(); + return this; + } + /** + * optional string relay = 3; + */ + public Builder setRelayBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + relay_ = value; + onChanged(); + return this; + } + + // optional uint64 timestamp = 5; + private long timestamp_ ; + /** + * optional uint64 timestamp = 5; + */ + public boolean hasTimestamp() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional uint64 timestamp = 5; + */ + public long getTimestamp() { + return timestamp_; + } + /** + * optional uint64 timestamp = 5; + */ + public Builder setTimestamp(long value) { + bitField0_ |= 0x00000010; + timestamp_ = value; + onChanged(); + return this; + } + /** + * optional uint64 timestamp = 5; + */ + public Builder clearTimestamp() { + bitField0_ = (bitField0_ & ~0x00000010); + timestamp_ = 0L; + onChanged(); + return this; + } + + // optional bytes legacyMessage = 6; + private com.google.protobuf.ByteString legacyMessage_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes legacyMessage = 6; + * + *
+       * Contains an encrypted DataMessage
+       * 
+ */ + public boolean hasLegacyMessage() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional bytes legacyMessage = 6; + * + *
+       * Contains an encrypted DataMessage
+       * 
+ */ + public com.google.protobuf.ByteString getLegacyMessage() { + return legacyMessage_; + } + /** + * optional bytes legacyMessage = 6; + * + *
+       * Contains an encrypted DataMessage
+       * 
+ */ + public Builder setLegacyMessage(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000020; + legacyMessage_ = value; + onChanged(); + return this; + } + /** + * optional bytes legacyMessage = 6; + * + *
+       * Contains an encrypted DataMessage
+       * 
+ */ + public Builder clearLegacyMessage() { + bitField0_ = (bitField0_ & ~0x00000020); + legacyMessage_ = getDefaultInstance().getLegacyMessage(); + onChanged(); + return this; + } + + // optional bytes content = 8; + private com.google.protobuf.ByteString content_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes content = 8; + * + *
+       * Contains an encrypted Content
+       * 
+ */ + public boolean hasContent() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * optional bytes content = 8; + * + *
+       * Contains an encrypted Content
+       * 
+ */ + public com.google.protobuf.ByteString getContent() { + return content_; + } + /** + * optional bytes content = 8; + * + *
+       * Contains an encrypted Content
+       * 
+ */ + public Builder setContent(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000040; + content_ = value; + onChanged(); + return this; + } + /** + * optional bytes content = 8; + * + *
+       * Contains an encrypted Content
+       * 
+ */ + public Builder clearContent() { + bitField0_ = (bitField0_ & ~0x00000040); + content_ = getDefaultInstance().getContent(); + onChanged(); + return this; + } + + // optional string serverGuid = 9; + private Object serverGuid_ = ""; + /** + * optional string serverGuid = 9; + */ + public boolean hasServerGuid() { + return ((bitField0_ & 0x00000080) == 0x00000080); + } + /** + * optional string serverGuid = 9; + */ + public String getServerGuid() { + Object ref = serverGuid_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + serverGuid_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string serverGuid = 9; + */ + public com.google.protobuf.ByteString + getServerGuidBytes() { + Object ref = serverGuid_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + serverGuid_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string serverGuid = 9; + */ + public Builder setServerGuid( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000080; + serverGuid_ = value; + onChanged(); + return this; + } + /** + * optional string serverGuid = 9; + */ + public Builder clearServerGuid() { + bitField0_ = (bitField0_ & ~0x00000080); + serverGuid_ = getDefaultInstance().getServerGuid(); + onChanged(); + return this; + } + /** + * optional string serverGuid = 9; + */ + public Builder setServerGuidBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000080; + serverGuid_ = value; + onChanged(); + return this; + } + + // optional uint64 serverTimestamp = 10; + private long serverTimestamp_ ; + /** + * optional uint64 serverTimestamp = 10; + */ + public boolean hasServerTimestamp() { + return ((bitField0_ & 0x00000100) == 0x00000100); + } + /** + * optional uint64 serverTimestamp = 10; + */ + public long getServerTimestamp() { + return serverTimestamp_; + } + /** + * optional uint64 serverTimestamp = 10; + */ + public Builder setServerTimestamp(long value) { + bitField0_ |= 0x00000100; + serverTimestamp_ = value; + onChanged(); + return this; + } + /** + * optional uint64 serverTimestamp = 10; + */ + public Builder clearServerTimestamp() { + bitField0_ = (bitField0_ & ~0x00000100); + serverTimestamp_ = 0L; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.Envelope) + } + + static { + defaultInstance = new Envelope(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.Envelope) + } + + public interface ContentOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional .signalservice.DataMessage dataMessage = 1; + /** + * optional .signalservice.DataMessage dataMessage = 1; + */ + boolean hasDataMessage(); + /** + * optional .signalservice.DataMessage dataMessage = 1; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage getDataMessage(); + /** + * optional .signalservice.DataMessage dataMessage = 1; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessageOrBuilder getDataMessageOrBuilder(); + + // optional .signalservice.SyncMessage syncMessage = 2; + /** + * optional .signalservice.SyncMessage syncMessage = 2; + */ + boolean hasSyncMessage(); + /** + * optional .signalservice.SyncMessage syncMessage = 2; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage getSyncMessage(); + /** + * optional .signalservice.SyncMessage syncMessage = 2; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessageOrBuilder getSyncMessageOrBuilder(); + + // optional .signalservice.CallMessage callMessage = 3; + /** + * optional .signalservice.CallMessage callMessage = 3; + */ + boolean hasCallMessage(); + /** + * optional .signalservice.CallMessage callMessage = 3; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage getCallMessage(); + /** + * optional .signalservice.CallMessage callMessage = 3; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessageOrBuilder getCallMessageOrBuilder(); + + // optional .signalservice.NullMessage nullMessage = 4; + /** + * optional .signalservice.NullMessage nullMessage = 4; + */ + boolean hasNullMessage(); + /** + * optional .signalservice.NullMessage nullMessage = 4; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage getNullMessage(); + /** + * optional .signalservice.NullMessage nullMessage = 4; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessageOrBuilder getNullMessageOrBuilder(); + + // optional .signalservice.ReceiptMessage receiptMessage = 5; + /** + * optional .signalservice.ReceiptMessage receiptMessage = 5; + */ + boolean hasReceiptMessage(); + /** + * optional .signalservice.ReceiptMessage receiptMessage = 5; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage getReceiptMessage(); + /** + * optional .signalservice.ReceiptMessage receiptMessage = 5; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessageOrBuilder getReceiptMessageOrBuilder(); + + // optional .signalservice.TypingMessage typingMessage = 6; + /** + * optional .signalservice.TypingMessage typingMessage = 6; + */ + boolean hasTypingMessage(); + /** + * optional .signalservice.TypingMessage typingMessage = 6; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage getTypingMessage(); + /** + * optional .signalservice.TypingMessage typingMessage = 6; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessageOrBuilder getTypingMessageOrBuilder(); + + // optional .signalservice.PreKeyBundleMessage preKeyBundleMessage = 101; + /** + * optional .signalservice.PreKeyBundleMessage preKeyBundleMessage = 101; + * + *
+     * Loki
+     * 
+ */ + boolean hasPreKeyBundleMessage(); + /** + * optional .signalservice.PreKeyBundleMessage preKeyBundleMessage = 101; + * + *
+     * Loki
+     * 
+ */ + org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage getPreKeyBundleMessage(); + /** + * optional .signalservice.PreKeyBundleMessage preKeyBundleMessage = 101; + * + *
+     * Loki
+     * 
+ */ + org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessageOrBuilder getPreKeyBundleMessageOrBuilder(); + + // optional .signalservice.DeviceLinkMessage deviceLinkMessage = 103; + /** + * optional .signalservice.DeviceLinkMessage deviceLinkMessage = 103; + * + *
+     * Loki
+     * 
+ */ + boolean hasDeviceLinkMessage(); + /** + * optional .signalservice.DeviceLinkMessage deviceLinkMessage = 103; + * + *
+     * Loki
+     * 
+ */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage getDeviceLinkMessage(); + /** + * optional .signalservice.DeviceLinkMessage deviceLinkMessage = 103; + * + *
+     * Loki
+     * 
+ */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessageOrBuilder getDeviceLinkMessageOrBuilder(); + } + /** + * Protobuf type {@code signalservice.Content} + */ + public static final class Content extends + com.google.protobuf.GeneratedMessage + implements ContentOrBuilder { + // Use Content.newBuilder() to construct. + private Content(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Content(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Content defaultInstance; + public static Content getDefaultInstance() { + return defaultInstance; + } + + public Content getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Content( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Builder subBuilder = null; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + subBuilder = dataMessage_.toBuilder(); + } + dataMessage_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(dataMessage_); + dataMessage_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000001; + break; + } + case 18: { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Builder subBuilder = null; + if (((bitField0_ & 0x00000002) == 0x00000002)) { + subBuilder = syncMessage_.toBuilder(); + } + syncMessage_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(syncMessage_); + syncMessage_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000002; + break; + } + case 26: { + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Builder subBuilder = null; + if (((bitField0_ & 0x00000004) == 0x00000004)) { + subBuilder = callMessage_.toBuilder(); + } + callMessage_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(callMessage_); + callMessage_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000004; + break; + } + case 34: { + org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage.Builder subBuilder = null; + if (((bitField0_ & 0x00000008) == 0x00000008)) { + subBuilder = nullMessage_.toBuilder(); + } + nullMessage_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(nullMessage_); + nullMessage_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000008; + break; + } + case 42: { + org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.Builder subBuilder = null; + if (((bitField0_ & 0x00000010) == 0x00000010)) { + subBuilder = receiptMessage_.toBuilder(); + } + receiptMessage_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(receiptMessage_); + receiptMessage_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000010; + break; + } + case 50: { + org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.Builder subBuilder = null; + if (((bitField0_ & 0x00000020) == 0x00000020)) { + subBuilder = typingMessage_.toBuilder(); + } + typingMessage_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(typingMessage_); + typingMessage_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000020; + break; + } + case 810: { + org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage.Builder subBuilder = null; + if (((bitField0_ & 0x00000040) == 0x00000040)) { + subBuilder = preKeyBundleMessage_.toBuilder(); + } + preKeyBundleMessage_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(preKeyBundleMessage_); + preKeyBundleMessage_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000040; + break; + } + case 826: { + org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage.Builder subBuilder = null; + if (((bitField0_ & 0x00000080) == 0x00000080)) { + subBuilder = deviceLinkMessage_.toBuilder(); + } + deviceLinkMessage_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(deviceLinkMessage_); + deviceLinkMessage_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000080; + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_Content_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_Content_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.Content.class, org.session.libsignal.service.internal.push.SignalServiceProtos.Content.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Content parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Content(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional .signalservice.DataMessage dataMessage = 1; + public static final int DATAMESSAGE_FIELD_NUMBER = 1; + private org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage dataMessage_; + /** + * optional .signalservice.DataMessage dataMessage = 1; + */ + public boolean hasDataMessage() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional .signalservice.DataMessage dataMessage = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage getDataMessage() { + return dataMessage_; + } + /** + * optional .signalservice.DataMessage dataMessage = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessageOrBuilder getDataMessageOrBuilder() { + return dataMessage_; + } + + // optional .signalservice.SyncMessage syncMessage = 2; + public static final int SYNCMESSAGE_FIELD_NUMBER = 2; + private org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage syncMessage_; + /** + * optional .signalservice.SyncMessage syncMessage = 2; + */ + public boolean hasSyncMessage() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .signalservice.SyncMessage syncMessage = 2; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage getSyncMessage() { + return syncMessage_; + } + /** + * optional .signalservice.SyncMessage syncMessage = 2; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessageOrBuilder getSyncMessageOrBuilder() { + return syncMessage_; + } + + // optional .signalservice.CallMessage callMessage = 3; + public static final int CALLMESSAGE_FIELD_NUMBER = 3; + private org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage callMessage_; + /** + * optional .signalservice.CallMessage callMessage = 3; + */ + public boolean hasCallMessage() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .signalservice.CallMessage callMessage = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage getCallMessage() { + return callMessage_; + } + /** + * optional .signalservice.CallMessage callMessage = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessageOrBuilder getCallMessageOrBuilder() { + return callMessage_; + } + + // optional .signalservice.NullMessage nullMessage = 4; + public static final int NULLMESSAGE_FIELD_NUMBER = 4; + private org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage nullMessage_; + /** + * optional .signalservice.NullMessage nullMessage = 4; + */ + public boolean hasNullMessage() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional .signalservice.NullMessage nullMessage = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage getNullMessage() { + return nullMessage_; + } + /** + * optional .signalservice.NullMessage nullMessage = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessageOrBuilder getNullMessageOrBuilder() { + return nullMessage_; + } + + // optional .signalservice.ReceiptMessage receiptMessage = 5; + public static final int RECEIPTMESSAGE_FIELD_NUMBER = 5; + private org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage receiptMessage_; + /** + * optional .signalservice.ReceiptMessage receiptMessage = 5; + */ + public boolean hasReceiptMessage() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional .signalservice.ReceiptMessage receiptMessage = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage getReceiptMessage() { + return receiptMessage_; + } + /** + * optional .signalservice.ReceiptMessage receiptMessage = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessageOrBuilder getReceiptMessageOrBuilder() { + return receiptMessage_; + } + + // optional .signalservice.TypingMessage typingMessage = 6; + public static final int TYPINGMESSAGE_FIELD_NUMBER = 6; + private org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage typingMessage_; + /** + * optional .signalservice.TypingMessage typingMessage = 6; + */ + public boolean hasTypingMessage() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional .signalservice.TypingMessage typingMessage = 6; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage getTypingMessage() { + return typingMessage_; + } + /** + * optional .signalservice.TypingMessage typingMessage = 6; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessageOrBuilder getTypingMessageOrBuilder() { + return typingMessage_; + } + + // optional .signalservice.PreKeyBundleMessage preKeyBundleMessage = 101; + public static final int PREKEYBUNDLEMESSAGE_FIELD_NUMBER = 101; + private org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage preKeyBundleMessage_; + /** + * optional .signalservice.PreKeyBundleMessage preKeyBundleMessage = 101; + * + *
+     * Loki
+     * 
+ */ + public boolean hasPreKeyBundleMessage() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * optional .signalservice.PreKeyBundleMessage preKeyBundleMessage = 101; + * + *
+     * Loki
+     * 
+ */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage getPreKeyBundleMessage() { + return preKeyBundleMessage_; + } + /** + * optional .signalservice.PreKeyBundleMessage preKeyBundleMessage = 101; + * + *
+     * Loki
+     * 
+ */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessageOrBuilder getPreKeyBundleMessageOrBuilder() { + return preKeyBundleMessage_; + } + + // optional .signalservice.DeviceLinkMessage deviceLinkMessage = 103; + public static final int DEVICELINKMESSAGE_FIELD_NUMBER = 103; + private org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage deviceLinkMessage_; + /** + * optional .signalservice.DeviceLinkMessage deviceLinkMessage = 103; + * + *
+     * Loki
+     * 
+ */ + public boolean hasDeviceLinkMessage() { + return ((bitField0_ & 0x00000080) == 0x00000080); + } + /** + * optional .signalservice.DeviceLinkMessage deviceLinkMessage = 103; + * + *
+     * Loki
+     * 
+ */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage getDeviceLinkMessage() { + return deviceLinkMessage_; + } + /** + * optional .signalservice.DeviceLinkMessage deviceLinkMessage = 103; + * + *
+     * Loki
+     * 
+ */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessageOrBuilder getDeviceLinkMessageOrBuilder() { + return deviceLinkMessage_; + } + + private void initFields() { + dataMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.getDefaultInstance(); + syncMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.getDefaultInstance(); + callMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.getDefaultInstance(); + nullMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage.getDefaultInstance(); + receiptMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.getDefaultInstance(); + typingMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.getDefaultInstance(); + preKeyBundleMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage.getDefaultInstance(); + deviceLinkMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage.getDefaultInstance(); + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeMessage(1, dataMessage_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeMessage(2, syncMessage_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeMessage(3, callMessage_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeMessage(4, nullMessage_); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + output.writeMessage(5, receiptMessage_); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + output.writeMessage(6, typingMessage_); + } + if (((bitField0_ & 0x00000040) == 0x00000040)) { + output.writeMessage(101, preKeyBundleMessage_); + } + if (((bitField0_ & 0x00000080) == 0x00000080)) { + output.writeMessage(103, deviceLinkMessage_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, dataMessage_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, syncMessage_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, callMessage_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(4, nullMessage_); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(5, receiptMessage_); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(6, typingMessage_); + } + if (((bitField0_ & 0x00000040) == 0x00000040)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(101, preKeyBundleMessage_); + } + if (((bitField0_ & 0x00000080) == 0x00000080)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(103, deviceLinkMessage_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.Content parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.Content parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.Content parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.Content parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.Content parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.Content parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.Content parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.Content parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.Content parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.Content parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.Content prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.Content} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.ContentOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_Content_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_Content_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.Content.class, org.session.libsignal.service.internal.push.SignalServiceProtos.Content.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.Content.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getDataMessageFieldBuilder(); + getSyncMessageFieldBuilder(); + getCallMessageFieldBuilder(); + getNullMessageFieldBuilder(); + getReceiptMessageFieldBuilder(); + getTypingMessageFieldBuilder(); + getPreKeyBundleMessageFieldBuilder(); + getDeviceLinkMessageFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + if (dataMessageBuilder_ == null) { + dataMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.getDefaultInstance(); + } else { + dataMessageBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + if (syncMessageBuilder_ == null) { + syncMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.getDefaultInstance(); + } else { + syncMessageBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + if (callMessageBuilder_ == null) { + callMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.getDefaultInstance(); + } else { + callMessageBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + if (nullMessageBuilder_ == null) { + nullMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage.getDefaultInstance(); + } else { + nullMessageBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000008); + if (receiptMessageBuilder_ == null) { + receiptMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.getDefaultInstance(); + } else { + receiptMessageBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000010); + if (typingMessageBuilder_ == null) { + typingMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.getDefaultInstance(); + } else { + typingMessageBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000020); + if (preKeyBundleMessageBuilder_ == null) { + preKeyBundleMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage.getDefaultInstance(); + } else { + preKeyBundleMessageBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000040); + if (deviceLinkMessageBuilder_ == null) { + deviceLinkMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage.getDefaultInstance(); + } else { + deviceLinkMessageBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000080); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_Content_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.Content getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.Content.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.Content build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.Content result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.Content buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.Content result = new org.session.libsignal.service.internal.push.SignalServiceProtos.Content(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + if (dataMessageBuilder_ == null) { + result.dataMessage_ = dataMessage_; + } else { + result.dataMessage_ = dataMessageBuilder_.build(); + } + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + if (syncMessageBuilder_ == null) { + result.syncMessage_ = syncMessage_; + } else { + result.syncMessage_ = syncMessageBuilder_.build(); + } + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + if (callMessageBuilder_ == null) { + result.callMessage_ = callMessage_; + } else { + result.callMessage_ = callMessageBuilder_.build(); + } + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000008; + } + if (nullMessageBuilder_ == null) { + result.nullMessage_ = nullMessage_; + } else { + result.nullMessage_ = nullMessageBuilder_.build(); + } + if (((from_bitField0_ & 0x00000010) == 0x00000010)) { + to_bitField0_ |= 0x00000010; + } + if (receiptMessageBuilder_ == null) { + result.receiptMessage_ = receiptMessage_; + } else { + result.receiptMessage_ = receiptMessageBuilder_.build(); + } + if (((from_bitField0_ & 0x00000020) == 0x00000020)) { + to_bitField0_ |= 0x00000020; + } + if (typingMessageBuilder_ == null) { + result.typingMessage_ = typingMessage_; + } else { + result.typingMessage_ = typingMessageBuilder_.build(); + } + if (((from_bitField0_ & 0x00000040) == 0x00000040)) { + to_bitField0_ |= 0x00000040; + } + if (preKeyBundleMessageBuilder_ == null) { + result.preKeyBundleMessage_ = preKeyBundleMessage_; + } else { + result.preKeyBundleMessage_ = preKeyBundleMessageBuilder_.build(); + } + if (((from_bitField0_ & 0x00000080) == 0x00000080)) { + to_bitField0_ |= 0x00000080; + } + if (deviceLinkMessageBuilder_ == null) { + result.deviceLinkMessage_ = deviceLinkMessage_; + } else { + result.deviceLinkMessage_ = deviceLinkMessageBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.Content) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.Content)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.Content other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.Content.getDefaultInstance()) return this; + if (other.hasDataMessage()) { + mergeDataMessage(other.getDataMessage()); + } + if (other.hasSyncMessage()) { + mergeSyncMessage(other.getSyncMessage()); + } + if (other.hasCallMessage()) { + mergeCallMessage(other.getCallMessage()); + } + if (other.hasNullMessage()) { + mergeNullMessage(other.getNullMessage()); + } + if (other.hasReceiptMessage()) { + mergeReceiptMessage(other.getReceiptMessage()); + } + if (other.hasTypingMessage()) { + mergeTypingMessage(other.getTypingMessage()); + } + if (other.hasPreKeyBundleMessage()) { + mergePreKeyBundleMessage(other.getPreKeyBundleMessage()); + } + if (other.hasDeviceLinkMessage()) { + mergeDeviceLinkMessage(other.getDeviceLinkMessage()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.Content parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.Content) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional .signalservice.DataMessage dataMessage = 1; + private org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage dataMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessageOrBuilder> dataMessageBuilder_; + /** + * optional .signalservice.DataMessage dataMessage = 1; + */ + public boolean hasDataMessage() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional .signalservice.DataMessage dataMessage = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage getDataMessage() { + if (dataMessageBuilder_ == null) { + return dataMessage_; + } else { + return dataMessageBuilder_.getMessage(); + } + } + /** + * optional .signalservice.DataMessage dataMessage = 1; + */ + public Builder setDataMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage value) { + if (dataMessageBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + dataMessage_ = value; + onChanged(); + } else { + dataMessageBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * optional .signalservice.DataMessage dataMessage = 1; + */ + public Builder setDataMessage( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Builder builderForValue) { + if (dataMessageBuilder_ == null) { + dataMessage_ = builderForValue.build(); + onChanged(); + } else { + dataMessageBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * optional .signalservice.DataMessage dataMessage = 1; + */ + public Builder mergeDataMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage value) { + if (dataMessageBuilder_ == null) { + if (((bitField0_ & 0x00000001) == 0x00000001) && + dataMessage_ != org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.getDefaultInstance()) { + dataMessage_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.newBuilder(dataMessage_).mergeFrom(value).buildPartial(); + } else { + dataMessage_ = value; + } + onChanged(); + } else { + dataMessageBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * optional .signalservice.DataMessage dataMessage = 1; + */ + public Builder clearDataMessage() { + if (dataMessageBuilder_ == null) { + dataMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.getDefaultInstance(); + onChanged(); + } else { + dataMessageBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + /** + * optional .signalservice.DataMessage dataMessage = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Builder getDataMessageBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getDataMessageFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.DataMessage dataMessage = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessageOrBuilder getDataMessageOrBuilder() { + if (dataMessageBuilder_ != null) { + return dataMessageBuilder_.getMessageOrBuilder(); + } else { + return dataMessage_; + } + } + /** + * optional .signalservice.DataMessage dataMessage = 1; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessageOrBuilder> + getDataMessageFieldBuilder() { + if (dataMessageBuilder_ == null) { + dataMessageBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessageOrBuilder>( + dataMessage_, + getParentForChildren(), + isClean()); + dataMessage_ = null; + } + return dataMessageBuilder_; + } + + // optional .signalservice.SyncMessage syncMessage = 2; + private org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage syncMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessageOrBuilder> syncMessageBuilder_; + /** + * optional .signalservice.SyncMessage syncMessage = 2; + */ + public boolean hasSyncMessage() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .signalservice.SyncMessage syncMessage = 2; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage getSyncMessage() { + if (syncMessageBuilder_ == null) { + return syncMessage_; + } else { + return syncMessageBuilder_.getMessage(); + } + } + /** + * optional .signalservice.SyncMessage syncMessage = 2; + */ + public Builder setSyncMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage value) { + if (syncMessageBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + syncMessage_ = value; + onChanged(); + } else { + syncMessageBuilder_.setMessage(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .signalservice.SyncMessage syncMessage = 2; + */ + public Builder setSyncMessage( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Builder builderForValue) { + if (syncMessageBuilder_ == null) { + syncMessage_ = builderForValue.build(); + onChanged(); + } else { + syncMessageBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .signalservice.SyncMessage syncMessage = 2; + */ + public Builder mergeSyncMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage value) { + if (syncMessageBuilder_ == null) { + if (((bitField0_ & 0x00000002) == 0x00000002) && + syncMessage_ != org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.getDefaultInstance()) { + syncMessage_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.newBuilder(syncMessage_).mergeFrom(value).buildPartial(); + } else { + syncMessage_ = value; + } + onChanged(); + } else { + syncMessageBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .signalservice.SyncMessage syncMessage = 2; + */ + public Builder clearSyncMessage() { + if (syncMessageBuilder_ == null) { + syncMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.getDefaultInstance(); + onChanged(); + } else { + syncMessageBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + /** + * optional .signalservice.SyncMessage syncMessage = 2; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Builder getSyncMessageBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getSyncMessageFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.SyncMessage syncMessage = 2; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessageOrBuilder getSyncMessageOrBuilder() { + if (syncMessageBuilder_ != null) { + return syncMessageBuilder_.getMessageOrBuilder(); + } else { + return syncMessage_; + } + } + /** + * optional .signalservice.SyncMessage syncMessage = 2; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessageOrBuilder> + getSyncMessageFieldBuilder() { + if (syncMessageBuilder_ == null) { + syncMessageBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessageOrBuilder>( + syncMessage_, + getParentForChildren(), + isClean()); + syncMessage_ = null; + } + return syncMessageBuilder_; + } + + // optional .signalservice.CallMessage callMessage = 3; + private org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage callMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessageOrBuilder> callMessageBuilder_; + /** + * optional .signalservice.CallMessage callMessage = 3; + */ + public boolean hasCallMessage() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .signalservice.CallMessage callMessage = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage getCallMessage() { + if (callMessageBuilder_ == null) { + return callMessage_; + } else { + return callMessageBuilder_.getMessage(); + } + } + /** + * optional .signalservice.CallMessage callMessage = 3; + */ + public Builder setCallMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage value) { + if (callMessageBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + callMessage_ = value; + onChanged(); + } else { + callMessageBuilder_.setMessage(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .signalservice.CallMessage callMessage = 3; + */ + public Builder setCallMessage( + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Builder builderForValue) { + if (callMessageBuilder_ == null) { + callMessage_ = builderForValue.build(); + onChanged(); + } else { + callMessageBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .signalservice.CallMessage callMessage = 3; + */ + public Builder mergeCallMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage value) { + if (callMessageBuilder_ == null) { + if (((bitField0_ & 0x00000004) == 0x00000004) && + callMessage_ != org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.getDefaultInstance()) { + callMessage_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.newBuilder(callMessage_).mergeFrom(value).buildPartial(); + } else { + callMessage_ = value; + } + onChanged(); + } else { + callMessageBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .signalservice.CallMessage callMessage = 3; + */ + public Builder clearCallMessage() { + if (callMessageBuilder_ == null) { + callMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.getDefaultInstance(); + onChanged(); + } else { + callMessageBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + /** + * optional .signalservice.CallMessage callMessage = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Builder getCallMessageBuilder() { + bitField0_ |= 0x00000004; + onChanged(); + return getCallMessageFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.CallMessage callMessage = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessageOrBuilder getCallMessageOrBuilder() { + if (callMessageBuilder_ != null) { + return callMessageBuilder_.getMessageOrBuilder(); + } else { + return callMessage_; + } + } + /** + * optional .signalservice.CallMessage callMessage = 3; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessageOrBuilder> + getCallMessageFieldBuilder() { + if (callMessageBuilder_ == null) { + callMessageBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessageOrBuilder>( + callMessage_, + getParentForChildren(), + isClean()); + callMessage_ = null; + } + return callMessageBuilder_; + } + + // optional .signalservice.NullMessage nullMessage = 4; + private org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage nullMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage, org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessageOrBuilder> nullMessageBuilder_; + /** + * optional .signalservice.NullMessage nullMessage = 4; + */ + public boolean hasNullMessage() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional .signalservice.NullMessage nullMessage = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage getNullMessage() { + if (nullMessageBuilder_ == null) { + return nullMessage_; + } else { + return nullMessageBuilder_.getMessage(); + } + } + /** + * optional .signalservice.NullMessage nullMessage = 4; + */ + public Builder setNullMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage value) { + if (nullMessageBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + nullMessage_ = value; + onChanged(); + } else { + nullMessageBuilder_.setMessage(value); + } + bitField0_ |= 0x00000008; + return this; + } + /** + * optional .signalservice.NullMessage nullMessage = 4; + */ + public Builder setNullMessage( + org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage.Builder builderForValue) { + if (nullMessageBuilder_ == null) { + nullMessage_ = builderForValue.build(); + onChanged(); + } else { + nullMessageBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000008; + return this; + } + /** + * optional .signalservice.NullMessage nullMessage = 4; + */ + public Builder mergeNullMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage value) { + if (nullMessageBuilder_ == null) { + if (((bitField0_ & 0x00000008) == 0x00000008) && + nullMessage_ != org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage.getDefaultInstance()) { + nullMessage_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage.newBuilder(nullMessage_).mergeFrom(value).buildPartial(); + } else { + nullMessage_ = value; + } + onChanged(); + } else { + nullMessageBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000008; + return this; + } + /** + * optional .signalservice.NullMessage nullMessage = 4; + */ + public Builder clearNullMessage() { + if (nullMessageBuilder_ == null) { + nullMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage.getDefaultInstance(); + onChanged(); + } else { + nullMessageBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + /** + * optional .signalservice.NullMessage nullMessage = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage.Builder getNullMessageBuilder() { + bitField0_ |= 0x00000008; + onChanged(); + return getNullMessageFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.NullMessage nullMessage = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessageOrBuilder getNullMessageOrBuilder() { + if (nullMessageBuilder_ != null) { + return nullMessageBuilder_.getMessageOrBuilder(); + } else { + return nullMessage_; + } + } + /** + * optional .signalservice.NullMessage nullMessage = 4; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage, org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessageOrBuilder> + getNullMessageFieldBuilder() { + if (nullMessageBuilder_ == null) { + nullMessageBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage, org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessageOrBuilder>( + nullMessage_, + getParentForChildren(), + isClean()); + nullMessage_ = null; + } + return nullMessageBuilder_; + } + + // optional .signalservice.ReceiptMessage receiptMessage = 5; + private org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage receiptMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage, org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessageOrBuilder> receiptMessageBuilder_; + /** + * optional .signalservice.ReceiptMessage receiptMessage = 5; + */ + public boolean hasReceiptMessage() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional .signalservice.ReceiptMessage receiptMessage = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage getReceiptMessage() { + if (receiptMessageBuilder_ == null) { + return receiptMessage_; + } else { + return receiptMessageBuilder_.getMessage(); + } + } + /** + * optional .signalservice.ReceiptMessage receiptMessage = 5; + */ + public Builder setReceiptMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage value) { + if (receiptMessageBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + receiptMessage_ = value; + onChanged(); + } else { + receiptMessageBuilder_.setMessage(value); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * optional .signalservice.ReceiptMessage receiptMessage = 5; + */ + public Builder setReceiptMessage( + org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.Builder builderForValue) { + if (receiptMessageBuilder_ == null) { + receiptMessage_ = builderForValue.build(); + onChanged(); + } else { + receiptMessageBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * optional .signalservice.ReceiptMessage receiptMessage = 5; + */ + public Builder mergeReceiptMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage value) { + if (receiptMessageBuilder_ == null) { + if (((bitField0_ & 0x00000010) == 0x00000010) && + receiptMessage_ != org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.getDefaultInstance()) { + receiptMessage_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.newBuilder(receiptMessage_).mergeFrom(value).buildPartial(); + } else { + receiptMessage_ = value; + } + onChanged(); + } else { + receiptMessageBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * optional .signalservice.ReceiptMessage receiptMessage = 5; + */ + public Builder clearReceiptMessage() { + if (receiptMessageBuilder_ == null) { + receiptMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.getDefaultInstance(); + onChanged(); + } else { + receiptMessageBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000010); + return this; + } + /** + * optional .signalservice.ReceiptMessage receiptMessage = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.Builder getReceiptMessageBuilder() { + bitField0_ |= 0x00000010; + onChanged(); + return getReceiptMessageFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.ReceiptMessage receiptMessage = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessageOrBuilder getReceiptMessageOrBuilder() { + if (receiptMessageBuilder_ != null) { + return receiptMessageBuilder_.getMessageOrBuilder(); + } else { + return receiptMessage_; + } + } + /** + * optional .signalservice.ReceiptMessage receiptMessage = 5; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage, org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessageOrBuilder> + getReceiptMessageFieldBuilder() { + if (receiptMessageBuilder_ == null) { + receiptMessageBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage, org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessageOrBuilder>( + receiptMessage_, + getParentForChildren(), + isClean()); + receiptMessage_ = null; + } + return receiptMessageBuilder_; + } + + // optional .signalservice.TypingMessage typingMessage = 6; + private org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage typingMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage, org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessageOrBuilder> typingMessageBuilder_; + /** + * optional .signalservice.TypingMessage typingMessage = 6; + */ + public boolean hasTypingMessage() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional .signalservice.TypingMessage typingMessage = 6; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage getTypingMessage() { + if (typingMessageBuilder_ == null) { + return typingMessage_; + } else { + return typingMessageBuilder_.getMessage(); + } + } + /** + * optional .signalservice.TypingMessage typingMessage = 6; + */ + public Builder setTypingMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage value) { + if (typingMessageBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + typingMessage_ = value; + onChanged(); + } else { + typingMessageBuilder_.setMessage(value); + } + bitField0_ |= 0x00000020; + return this; + } + /** + * optional .signalservice.TypingMessage typingMessage = 6; + */ + public Builder setTypingMessage( + org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.Builder builderForValue) { + if (typingMessageBuilder_ == null) { + typingMessage_ = builderForValue.build(); + onChanged(); + } else { + typingMessageBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000020; + return this; + } + /** + * optional .signalservice.TypingMessage typingMessage = 6; + */ + public Builder mergeTypingMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage value) { + if (typingMessageBuilder_ == null) { + if (((bitField0_ & 0x00000020) == 0x00000020) && + typingMessage_ != org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.getDefaultInstance()) { + typingMessage_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.newBuilder(typingMessage_).mergeFrom(value).buildPartial(); + } else { + typingMessage_ = value; + } + onChanged(); + } else { + typingMessageBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000020; + return this; + } + /** + * optional .signalservice.TypingMessage typingMessage = 6; + */ + public Builder clearTypingMessage() { + if (typingMessageBuilder_ == null) { + typingMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.getDefaultInstance(); + onChanged(); + } else { + typingMessageBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000020); + return this; + } + /** + * optional .signalservice.TypingMessage typingMessage = 6; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.Builder getTypingMessageBuilder() { + bitField0_ |= 0x00000020; + onChanged(); + return getTypingMessageFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.TypingMessage typingMessage = 6; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessageOrBuilder getTypingMessageOrBuilder() { + if (typingMessageBuilder_ != null) { + return typingMessageBuilder_.getMessageOrBuilder(); + } else { + return typingMessage_; + } + } + /** + * optional .signalservice.TypingMessage typingMessage = 6; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage, org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessageOrBuilder> + getTypingMessageFieldBuilder() { + if (typingMessageBuilder_ == null) { + typingMessageBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage, org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessageOrBuilder>( + typingMessage_, + getParentForChildren(), + isClean()); + typingMessage_ = null; + } + return typingMessageBuilder_; + } + + // optional .signalservice.PreKeyBundleMessage preKeyBundleMessage = 101; + private org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage preKeyBundleMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage, org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessageOrBuilder> preKeyBundleMessageBuilder_; + /** + * optional .signalservice.PreKeyBundleMessage preKeyBundleMessage = 101; + * + *
+       * Loki
+       * 
+ */ + public boolean hasPreKeyBundleMessage() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * optional .signalservice.PreKeyBundleMessage preKeyBundleMessage = 101; + * + *
+       * Loki
+       * 
+ */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage getPreKeyBundleMessage() { + if (preKeyBundleMessageBuilder_ == null) { + return preKeyBundleMessage_; + } else { + return preKeyBundleMessageBuilder_.getMessage(); + } + } + /** + * optional .signalservice.PreKeyBundleMessage preKeyBundleMessage = 101; + * + *
+       * Loki
+       * 
+ */ + public Builder setPreKeyBundleMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage value) { + if (preKeyBundleMessageBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + preKeyBundleMessage_ = value; + onChanged(); + } else { + preKeyBundleMessageBuilder_.setMessage(value); + } + bitField0_ |= 0x00000040; + return this; + } + /** + * optional .signalservice.PreKeyBundleMessage preKeyBundleMessage = 101; + * + *
+       * Loki
+       * 
+ */ + public Builder setPreKeyBundleMessage( + org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage.Builder builderForValue) { + if (preKeyBundleMessageBuilder_ == null) { + preKeyBundleMessage_ = builderForValue.build(); + onChanged(); + } else { + preKeyBundleMessageBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000040; + return this; + } + /** + * optional .signalservice.PreKeyBundleMessage preKeyBundleMessage = 101; + * + *
+       * Loki
+       * 
+ */ + public Builder mergePreKeyBundleMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage value) { + if (preKeyBundleMessageBuilder_ == null) { + if (((bitField0_ & 0x00000040) == 0x00000040) && + preKeyBundleMessage_ != org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage.getDefaultInstance()) { + preKeyBundleMessage_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage.newBuilder(preKeyBundleMessage_).mergeFrom(value).buildPartial(); + } else { + preKeyBundleMessage_ = value; + } + onChanged(); + } else { + preKeyBundleMessageBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000040; + return this; + } + /** + * optional .signalservice.PreKeyBundleMessage preKeyBundleMessage = 101; + * + *
+       * Loki
+       * 
+ */ + public Builder clearPreKeyBundleMessage() { + if (preKeyBundleMessageBuilder_ == null) { + preKeyBundleMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage.getDefaultInstance(); + onChanged(); + } else { + preKeyBundleMessageBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000040); + return this; + } + /** + * optional .signalservice.PreKeyBundleMessage preKeyBundleMessage = 101; + * + *
+       * Loki
+       * 
+ */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage.Builder getPreKeyBundleMessageBuilder() { + bitField0_ |= 0x00000040; + onChanged(); + return getPreKeyBundleMessageFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.PreKeyBundleMessage preKeyBundleMessage = 101; + * + *
+       * Loki
+       * 
+ */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessageOrBuilder getPreKeyBundleMessageOrBuilder() { + if (preKeyBundleMessageBuilder_ != null) { + return preKeyBundleMessageBuilder_.getMessageOrBuilder(); + } else { + return preKeyBundleMessage_; + } + } + /** + * optional .signalservice.PreKeyBundleMessage preKeyBundleMessage = 101; + * + *
+       * Loki
+       * 
+ */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage, org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessageOrBuilder> + getPreKeyBundleMessageFieldBuilder() { + if (preKeyBundleMessageBuilder_ == null) { + preKeyBundleMessageBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage, org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessageOrBuilder>( + preKeyBundleMessage_, + getParentForChildren(), + isClean()); + preKeyBundleMessage_ = null; + } + return preKeyBundleMessageBuilder_; + } + + // optional .signalservice.DeviceLinkMessage deviceLinkMessage = 103; + private org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage deviceLinkMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage, org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessageOrBuilder> deviceLinkMessageBuilder_; + /** + * optional .signalservice.DeviceLinkMessage deviceLinkMessage = 103; + * + *
+       * Loki
+       * 
+ */ + public boolean hasDeviceLinkMessage() { + return ((bitField0_ & 0x00000080) == 0x00000080); + } + /** + * optional .signalservice.DeviceLinkMessage deviceLinkMessage = 103; + * + *
+       * Loki
+       * 
+ */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage getDeviceLinkMessage() { + if (deviceLinkMessageBuilder_ == null) { + return deviceLinkMessage_; + } else { + return deviceLinkMessageBuilder_.getMessage(); + } + } + /** + * optional .signalservice.DeviceLinkMessage deviceLinkMessage = 103; + * + *
+       * Loki
+       * 
+ */ + public Builder setDeviceLinkMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage value) { + if (deviceLinkMessageBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + deviceLinkMessage_ = value; + onChanged(); + } else { + deviceLinkMessageBuilder_.setMessage(value); + } + bitField0_ |= 0x00000080; + return this; + } + /** + * optional .signalservice.DeviceLinkMessage deviceLinkMessage = 103; + * + *
+       * Loki
+       * 
+ */ + public Builder setDeviceLinkMessage( + org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage.Builder builderForValue) { + if (deviceLinkMessageBuilder_ == null) { + deviceLinkMessage_ = builderForValue.build(); + onChanged(); + } else { + deviceLinkMessageBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000080; + return this; + } + /** + * optional .signalservice.DeviceLinkMessage deviceLinkMessage = 103; + * + *
+       * Loki
+       * 
+ */ + public Builder mergeDeviceLinkMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage value) { + if (deviceLinkMessageBuilder_ == null) { + if (((bitField0_ & 0x00000080) == 0x00000080) && + deviceLinkMessage_ != org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage.getDefaultInstance()) { + deviceLinkMessage_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage.newBuilder(deviceLinkMessage_).mergeFrom(value).buildPartial(); + } else { + deviceLinkMessage_ = value; + } + onChanged(); + } else { + deviceLinkMessageBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000080; + return this; + } + /** + * optional .signalservice.DeviceLinkMessage deviceLinkMessage = 103; + * + *
+       * Loki
+       * 
+ */ + public Builder clearDeviceLinkMessage() { + if (deviceLinkMessageBuilder_ == null) { + deviceLinkMessage_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage.getDefaultInstance(); + onChanged(); + } else { + deviceLinkMessageBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000080); + return this; + } + /** + * optional .signalservice.DeviceLinkMessage deviceLinkMessage = 103; + * + *
+       * Loki
+       * 
+ */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage.Builder getDeviceLinkMessageBuilder() { + bitField0_ |= 0x00000080; + onChanged(); + return getDeviceLinkMessageFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.DeviceLinkMessage deviceLinkMessage = 103; + * + *
+       * Loki
+       * 
+ */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessageOrBuilder getDeviceLinkMessageOrBuilder() { + if (deviceLinkMessageBuilder_ != null) { + return deviceLinkMessageBuilder_.getMessageOrBuilder(); + } else { + return deviceLinkMessage_; + } + } + /** + * optional .signalservice.DeviceLinkMessage deviceLinkMessage = 103; + * + *
+       * Loki
+       * 
+ */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage, org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessageOrBuilder> + getDeviceLinkMessageFieldBuilder() { + if (deviceLinkMessageBuilder_ == null) { + deviceLinkMessageBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage, org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessageOrBuilder>( + deviceLinkMessage_, + getParentForChildren(), + isClean()); + deviceLinkMessage_ = null; + } + return deviceLinkMessageBuilder_; + } + + // @@protoc_insertion_point(builder_scope:signalservice.Content) + } + + static { + defaultInstance = new Content(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.Content) + } + + public interface DeviceLinkMessageOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional string primaryPublicKey = 1; + /** + * optional string primaryPublicKey = 1; + */ + boolean hasPrimaryPublicKey(); + /** + * optional string primaryPublicKey = 1; + */ + String getPrimaryPublicKey(); + /** + * optional string primaryPublicKey = 1; + */ + com.google.protobuf.ByteString + getPrimaryPublicKeyBytes(); + + // optional string secondaryPublicKey = 2; + /** + * optional string secondaryPublicKey = 2; + */ + boolean hasSecondaryPublicKey(); + /** + * optional string secondaryPublicKey = 2; + */ + String getSecondaryPublicKey(); + /** + * optional string secondaryPublicKey = 2; + */ + com.google.protobuf.ByteString + getSecondaryPublicKeyBytes(); + + // optional bytes requestSignature = 3; + /** + * optional bytes requestSignature = 3; + */ + boolean hasRequestSignature(); + /** + * optional bytes requestSignature = 3; + */ + com.google.protobuf.ByteString getRequestSignature(); + + // optional bytes authorizationSignature = 4; + /** + * optional bytes authorizationSignature = 4; + */ + boolean hasAuthorizationSignature(); + /** + * optional bytes authorizationSignature = 4; + */ + com.google.protobuf.ByteString getAuthorizationSignature(); + } + /** + * Protobuf type {@code signalservice.DeviceLinkMessage} + */ + public static final class DeviceLinkMessage extends + com.google.protobuf.GeneratedMessage + implements DeviceLinkMessageOrBuilder { + // Use DeviceLinkMessage.newBuilder() to construct. + private DeviceLinkMessage(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private DeviceLinkMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final DeviceLinkMessage defaultInstance; + public static DeviceLinkMessage getDefaultInstance() { + return defaultInstance; + } + + public DeviceLinkMessage getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private DeviceLinkMessage( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + primaryPublicKey_ = input.readBytes(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + secondaryPublicKey_ = input.readBytes(); + break; + } + case 26: { + bitField0_ |= 0x00000004; + requestSignature_ = input.readBytes(); + break; + } + case 34: { + bitField0_ |= 0x00000008; + authorizationSignature_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DeviceLinkMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DeviceLinkMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage.class, org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public DeviceLinkMessage parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new DeviceLinkMessage(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional string primaryPublicKey = 1; + public static final int PRIMARYPUBLICKEY_FIELD_NUMBER = 1; + private Object primaryPublicKey_; + /** + * optional string primaryPublicKey = 1; + */ + public boolean hasPrimaryPublicKey() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string primaryPublicKey = 1; + */ + public String getPrimaryPublicKey() { + Object ref = primaryPublicKey_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + primaryPublicKey_ = s; + } + return s; + } + } + /** + * optional string primaryPublicKey = 1; + */ + public com.google.protobuf.ByteString + getPrimaryPublicKeyBytes() { + Object ref = primaryPublicKey_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + primaryPublicKey_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional string secondaryPublicKey = 2; + public static final int SECONDARYPUBLICKEY_FIELD_NUMBER = 2; + private Object secondaryPublicKey_; + /** + * optional string secondaryPublicKey = 2; + */ + public boolean hasSecondaryPublicKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string secondaryPublicKey = 2; + */ + public String getSecondaryPublicKey() { + Object ref = secondaryPublicKey_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + secondaryPublicKey_ = s; + } + return s; + } + } + /** + * optional string secondaryPublicKey = 2; + */ + public com.google.protobuf.ByteString + getSecondaryPublicKeyBytes() { + Object ref = secondaryPublicKey_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + secondaryPublicKey_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional bytes requestSignature = 3; + public static final int REQUESTSIGNATURE_FIELD_NUMBER = 3; + private com.google.protobuf.ByteString requestSignature_; + /** + * optional bytes requestSignature = 3; + */ + public boolean hasRequestSignature() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes requestSignature = 3; + */ + public com.google.protobuf.ByteString getRequestSignature() { + return requestSignature_; + } + + // optional bytes authorizationSignature = 4; + public static final int AUTHORIZATIONSIGNATURE_FIELD_NUMBER = 4; + private com.google.protobuf.ByteString authorizationSignature_; + /** + * optional bytes authorizationSignature = 4; + */ + public boolean hasAuthorizationSignature() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional bytes authorizationSignature = 4; + */ + public com.google.protobuf.ByteString getAuthorizationSignature() { + return authorizationSignature_; + } + + private void initFields() { + primaryPublicKey_ = ""; + secondaryPublicKey_ = ""; + requestSignature_ = com.google.protobuf.ByteString.EMPTY; + authorizationSignature_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getPrimaryPublicKeyBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, getSecondaryPublicKeyBytes()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(3, requestSignature_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeBytes(4, authorizationSignature_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getPrimaryPublicKeyBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, getSecondaryPublicKeyBytes()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, requestSignature_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(4, authorizationSignature_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.DeviceLinkMessage} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DeviceLinkMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DeviceLinkMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage.class, org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + primaryPublicKey_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + secondaryPublicKey_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + requestSignature_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000004); + authorizationSignature_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DeviceLinkMessage_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage result = new org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.primaryPublicKey_ = primaryPublicKey_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.secondaryPublicKey_ = secondaryPublicKey_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.requestSignature_ = requestSignature_; + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000008; + } + result.authorizationSignature_ = authorizationSignature_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage.getDefaultInstance()) return this; + if (other.hasPrimaryPublicKey()) { + bitField0_ |= 0x00000001; + primaryPublicKey_ = other.primaryPublicKey_; + onChanged(); + } + if (other.hasSecondaryPublicKey()) { + bitField0_ |= 0x00000002; + secondaryPublicKey_ = other.secondaryPublicKey_; + onChanged(); + } + if (other.hasRequestSignature()) { + setRequestSignature(other.getRequestSignature()); + } + if (other.hasAuthorizationSignature()) { + setAuthorizationSignature(other.getAuthorizationSignature()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.DeviceLinkMessage) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional string primaryPublicKey = 1; + private Object primaryPublicKey_ = ""; + /** + * optional string primaryPublicKey = 1; + */ + public boolean hasPrimaryPublicKey() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string primaryPublicKey = 1; + */ + public String getPrimaryPublicKey() { + Object ref = primaryPublicKey_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + primaryPublicKey_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string primaryPublicKey = 1; + */ + public com.google.protobuf.ByteString + getPrimaryPublicKeyBytes() { + Object ref = primaryPublicKey_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + primaryPublicKey_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string primaryPublicKey = 1; + */ + public Builder setPrimaryPublicKey( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + primaryPublicKey_ = value; + onChanged(); + return this; + } + /** + * optional string primaryPublicKey = 1; + */ + public Builder clearPrimaryPublicKey() { + bitField0_ = (bitField0_ & ~0x00000001); + primaryPublicKey_ = getDefaultInstance().getPrimaryPublicKey(); + onChanged(); + return this; + } + /** + * optional string primaryPublicKey = 1; + */ + public Builder setPrimaryPublicKeyBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + primaryPublicKey_ = value; + onChanged(); + return this; + } + + // optional string secondaryPublicKey = 2; + private Object secondaryPublicKey_ = ""; + /** + * optional string secondaryPublicKey = 2; + */ + public boolean hasSecondaryPublicKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string secondaryPublicKey = 2; + */ + public String getSecondaryPublicKey() { + Object ref = secondaryPublicKey_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + secondaryPublicKey_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string secondaryPublicKey = 2; + */ + public com.google.protobuf.ByteString + getSecondaryPublicKeyBytes() { + Object ref = secondaryPublicKey_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + secondaryPublicKey_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string secondaryPublicKey = 2; + */ + public Builder setSecondaryPublicKey( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + secondaryPublicKey_ = value; + onChanged(); + return this; + } + /** + * optional string secondaryPublicKey = 2; + */ + public Builder clearSecondaryPublicKey() { + bitField0_ = (bitField0_ & ~0x00000002); + secondaryPublicKey_ = getDefaultInstance().getSecondaryPublicKey(); + onChanged(); + return this; + } + /** + * optional string secondaryPublicKey = 2; + */ + public Builder setSecondaryPublicKeyBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + secondaryPublicKey_ = value; + onChanged(); + return this; + } + + // optional bytes requestSignature = 3; + private com.google.protobuf.ByteString requestSignature_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes requestSignature = 3; + */ + public boolean hasRequestSignature() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes requestSignature = 3; + */ + public com.google.protobuf.ByteString getRequestSignature() { + return requestSignature_; + } + /** + * optional bytes requestSignature = 3; + */ + public Builder setRequestSignature(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + requestSignature_ = value; + onChanged(); + return this; + } + /** + * optional bytes requestSignature = 3; + */ + public Builder clearRequestSignature() { + bitField0_ = (bitField0_ & ~0x00000004); + requestSignature_ = getDefaultInstance().getRequestSignature(); + onChanged(); + return this; + } + + // optional bytes authorizationSignature = 4; + private com.google.protobuf.ByteString authorizationSignature_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes authorizationSignature = 4; + */ + public boolean hasAuthorizationSignature() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional bytes authorizationSignature = 4; + */ + public com.google.protobuf.ByteString getAuthorizationSignature() { + return authorizationSignature_; + } + /** + * optional bytes authorizationSignature = 4; + */ + public Builder setAuthorizationSignature(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + authorizationSignature_ = value; + onChanged(); + return this; + } + /** + * optional bytes authorizationSignature = 4; + */ + public Builder clearAuthorizationSignature() { + bitField0_ = (bitField0_ & ~0x00000008); + authorizationSignature_ = getDefaultInstance().getAuthorizationSignature(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.DeviceLinkMessage) + } + + static { + defaultInstance = new DeviceLinkMessage(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.DeviceLinkMessage) + } + + public interface PreKeyBundleMessageOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional bytes identityKey = 1; + /** + * optional bytes identityKey = 1; + */ + boolean hasIdentityKey(); + /** + * optional bytes identityKey = 1; + */ + com.google.protobuf.ByteString getIdentityKey(); + + // optional uint32 deviceId = 2; + /** + * optional uint32 deviceId = 2; + */ + boolean hasDeviceId(); + /** + * optional uint32 deviceId = 2; + */ + int getDeviceId(); + + // optional uint32 preKeyId = 3; + /** + * optional uint32 preKeyId = 3; + */ + boolean hasPreKeyId(); + /** + * optional uint32 preKeyId = 3; + */ + int getPreKeyId(); + + // optional uint32 signedKeyId = 4; + /** + * optional uint32 signedKeyId = 4; + */ + boolean hasSignedKeyId(); + /** + * optional uint32 signedKeyId = 4; + */ + int getSignedKeyId(); + + // optional bytes preKey = 5; + /** + * optional bytes preKey = 5; + */ + boolean hasPreKey(); + /** + * optional bytes preKey = 5; + */ + com.google.protobuf.ByteString getPreKey(); + + // optional bytes signedKey = 6; + /** + * optional bytes signedKey = 6; + */ + boolean hasSignedKey(); + /** + * optional bytes signedKey = 6; + */ + com.google.protobuf.ByteString getSignedKey(); + + // optional bytes signature = 7; + /** + * optional bytes signature = 7; + */ + boolean hasSignature(); + /** + * optional bytes signature = 7; + */ + com.google.protobuf.ByteString getSignature(); + } + /** + * Protobuf type {@code signalservice.PreKeyBundleMessage} + */ + public static final class PreKeyBundleMessage extends + com.google.protobuf.GeneratedMessage + implements PreKeyBundleMessageOrBuilder { + // Use PreKeyBundleMessage.newBuilder() to construct. + private PreKeyBundleMessage(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private PreKeyBundleMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final PreKeyBundleMessage defaultInstance; + public static PreKeyBundleMessage getDefaultInstance() { + return defaultInstance; + } + + public PreKeyBundleMessage getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private PreKeyBundleMessage( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + identityKey_ = input.readBytes(); + break; + } + case 16: { + bitField0_ |= 0x00000002; + deviceId_ = input.readUInt32(); + break; + } + case 24: { + bitField0_ |= 0x00000004; + preKeyId_ = input.readUInt32(); + break; + } + case 32: { + bitField0_ |= 0x00000008; + signedKeyId_ = input.readUInt32(); + break; + } + case 42: { + bitField0_ |= 0x00000010; + preKey_ = input.readBytes(); + break; + } + case 50: { + bitField0_ |= 0x00000020; + signedKey_ = input.readBytes(); + break; + } + case 58: { + bitField0_ |= 0x00000040; + signature_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_PreKeyBundleMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_PreKeyBundleMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage.class, org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public PreKeyBundleMessage parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new PreKeyBundleMessage(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional bytes identityKey = 1; + public static final int IDENTITYKEY_FIELD_NUMBER = 1; + private com.google.protobuf.ByteString identityKey_; + /** + * optional bytes identityKey = 1; + */ + public boolean hasIdentityKey() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes identityKey = 1; + */ + public com.google.protobuf.ByteString getIdentityKey() { + return identityKey_; + } + + // optional uint32 deviceId = 2; + public static final int DEVICEID_FIELD_NUMBER = 2; + private int deviceId_; + /** + * optional uint32 deviceId = 2; + */ + public boolean hasDeviceId() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional uint32 deviceId = 2; + */ + public int getDeviceId() { + return deviceId_; + } + + // optional uint32 preKeyId = 3; + public static final int PREKEYID_FIELD_NUMBER = 3; + private int preKeyId_; + /** + * optional uint32 preKeyId = 3; + */ + public boolean hasPreKeyId() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional uint32 preKeyId = 3; + */ + public int getPreKeyId() { + return preKeyId_; + } + + // optional uint32 signedKeyId = 4; + public static final int SIGNEDKEYID_FIELD_NUMBER = 4; + private int signedKeyId_; + /** + * optional uint32 signedKeyId = 4; + */ + public boolean hasSignedKeyId() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional uint32 signedKeyId = 4; + */ + public int getSignedKeyId() { + return signedKeyId_; + } + + // optional bytes preKey = 5; + public static final int PREKEY_FIELD_NUMBER = 5; + private com.google.protobuf.ByteString preKey_; + /** + * optional bytes preKey = 5; + */ + public boolean hasPreKey() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional bytes preKey = 5; + */ + public com.google.protobuf.ByteString getPreKey() { + return preKey_; + } + + // optional bytes signedKey = 6; + public static final int SIGNEDKEY_FIELD_NUMBER = 6; + private com.google.protobuf.ByteString signedKey_; + /** + * optional bytes signedKey = 6; + */ + public boolean hasSignedKey() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional bytes signedKey = 6; + */ + public com.google.protobuf.ByteString getSignedKey() { + return signedKey_; + } + + // optional bytes signature = 7; + public static final int SIGNATURE_FIELD_NUMBER = 7; + private com.google.protobuf.ByteString signature_; + /** + * optional bytes signature = 7; + */ + public boolean hasSignature() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * optional bytes signature = 7; + */ + public com.google.protobuf.ByteString getSignature() { + return signature_; + } + + private void initFields() { + identityKey_ = com.google.protobuf.ByteString.EMPTY; + deviceId_ = 0; + preKeyId_ = 0; + signedKeyId_ = 0; + preKey_ = com.google.protobuf.ByteString.EMPTY; + signedKey_ = com.google.protobuf.ByteString.EMPTY; + signature_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, identityKey_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeUInt32(2, deviceId_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeUInt32(3, preKeyId_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeUInt32(4, signedKeyId_); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + output.writeBytes(5, preKey_); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + output.writeBytes(6, signedKey_); + } + if (((bitField0_ & 0x00000040) == 0x00000040)) { + output.writeBytes(7, signature_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, identityKey_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(2, deviceId_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(3, preKeyId_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(4, signedKeyId_); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(5, preKey_); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(6, signedKey_); + } + if (((bitField0_ & 0x00000040) == 0x00000040)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(7, signature_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.PreKeyBundleMessage} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_PreKeyBundleMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_PreKeyBundleMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage.class, org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + identityKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + deviceId_ = 0; + bitField0_ = (bitField0_ & ~0x00000002); + preKeyId_ = 0; + bitField0_ = (bitField0_ & ~0x00000004); + signedKeyId_ = 0; + bitField0_ = (bitField0_ & ~0x00000008); + preKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000010); + signedKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000020); + signature_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000040); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_PreKeyBundleMessage_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage result = new org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.identityKey_ = identityKey_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.deviceId_ = deviceId_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.preKeyId_ = preKeyId_; + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000008; + } + result.signedKeyId_ = signedKeyId_; + if (((from_bitField0_ & 0x00000010) == 0x00000010)) { + to_bitField0_ |= 0x00000010; + } + result.preKey_ = preKey_; + if (((from_bitField0_ & 0x00000020) == 0x00000020)) { + to_bitField0_ |= 0x00000020; + } + result.signedKey_ = signedKey_; + if (((from_bitField0_ & 0x00000040) == 0x00000040)) { + to_bitField0_ |= 0x00000040; + } + result.signature_ = signature_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage.getDefaultInstance()) return this; + if (other.hasIdentityKey()) { + setIdentityKey(other.getIdentityKey()); + } + if (other.hasDeviceId()) { + setDeviceId(other.getDeviceId()); + } + if (other.hasPreKeyId()) { + setPreKeyId(other.getPreKeyId()); + } + if (other.hasSignedKeyId()) { + setSignedKeyId(other.getSignedKeyId()); + } + if (other.hasPreKey()) { + setPreKey(other.getPreKey()); + } + if (other.hasSignedKey()) { + setSignedKey(other.getSignedKey()); + } + if (other.hasSignature()) { + setSignature(other.getSignature()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.PreKeyBundleMessage) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional bytes identityKey = 1; + private com.google.protobuf.ByteString identityKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes identityKey = 1; + */ + public boolean hasIdentityKey() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes identityKey = 1; + */ + public com.google.protobuf.ByteString getIdentityKey() { + return identityKey_; + } + /** + * optional bytes identityKey = 1; + */ + public Builder setIdentityKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + identityKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes identityKey = 1; + */ + public Builder clearIdentityKey() { + bitField0_ = (bitField0_ & ~0x00000001); + identityKey_ = getDefaultInstance().getIdentityKey(); + onChanged(); + return this; + } + + // optional uint32 deviceId = 2; + private int deviceId_ ; + /** + * optional uint32 deviceId = 2; + */ + public boolean hasDeviceId() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional uint32 deviceId = 2; + */ + public int getDeviceId() { + return deviceId_; + } + /** + * optional uint32 deviceId = 2; + */ + public Builder setDeviceId(int value) { + bitField0_ |= 0x00000002; + deviceId_ = value; + onChanged(); + return this; + } + /** + * optional uint32 deviceId = 2; + */ + public Builder clearDeviceId() { + bitField0_ = (bitField0_ & ~0x00000002); + deviceId_ = 0; + onChanged(); + return this; + } + + // optional uint32 preKeyId = 3; + private int preKeyId_ ; + /** + * optional uint32 preKeyId = 3; + */ + public boolean hasPreKeyId() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional uint32 preKeyId = 3; + */ + public int getPreKeyId() { + return preKeyId_; + } + /** + * optional uint32 preKeyId = 3; + */ + public Builder setPreKeyId(int value) { + bitField0_ |= 0x00000004; + preKeyId_ = value; + onChanged(); + return this; + } + /** + * optional uint32 preKeyId = 3; + */ + public Builder clearPreKeyId() { + bitField0_ = (bitField0_ & ~0x00000004); + preKeyId_ = 0; + onChanged(); + return this; + } + + // optional uint32 signedKeyId = 4; + private int signedKeyId_ ; + /** + * optional uint32 signedKeyId = 4; + */ + public boolean hasSignedKeyId() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional uint32 signedKeyId = 4; + */ + public int getSignedKeyId() { + return signedKeyId_; + } + /** + * optional uint32 signedKeyId = 4; + */ + public Builder setSignedKeyId(int value) { + bitField0_ |= 0x00000008; + signedKeyId_ = value; + onChanged(); + return this; + } + /** + * optional uint32 signedKeyId = 4; + */ + public Builder clearSignedKeyId() { + bitField0_ = (bitField0_ & ~0x00000008); + signedKeyId_ = 0; + onChanged(); + return this; + } + + // optional bytes preKey = 5; + private com.google.protobuf.ByteString preKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes preKey = 5; + */ + public boolean hasPreKey() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional bytes preKey = 5; + */ + public com.google.protobuf.ByteString getPreKey() { + return preKey_; + } + /** + * optional bytes preKey = 5; + */ + public Builder setPreKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000010; + preKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes preKey = 5; + */ + public Builder clearPreKey() { + bitField0_ = (bitField0_ & ~0x00000010); + preKey_ = getDefaultInstance().getPreKey(); + onChanged(); + return this; + } + + // optional bytes signedKey = 6; + private com.google.protobuf.ByteString signedKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes signedKey = 6; + */ + public boolean hasSignedKey() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional bytes signedKey = 6; + */ + public com.google.protobuf.ByteString getSignedKey() { + return signedKey_; + } + /** + * optional bytes signedKey = 6; + */ + public Builder setSignedKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000020; + signedKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes signedKey = 6; + */ + public Builder clearSignedKey() { + bitField0_ = (bitField0_ & ~0x00000020); + signedKey_ = getDefaultInstance().getSignedKey(); + onChanged(); + return this; + } + + // optional bytes signature = 7; + private com.google.protobuf.ByteString signature_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes signature = 7; + */ + public boolean hasSignature() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * optional bytes signature = 7; + */ + public com.google.protobuf.ByteString getSignature() { + return signature_; + } + /** + * optional bytes signature = 7; + */ + public Builder setSignature(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000040; + signature_ = value; + onChanged(); + return this; + } + /** + * optional bytes signature = 7; + */ + public Builder clearSignature() { + bitField0_ = (bitField0_ & ~0x00000040); + signature_ = getDefaultInstance().getSignature(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.PreKeyBundleMessage) + } + + static { + defaultInstance = new PreKeyBundleMessage(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.PreKeyBundleMessage) + } + + public interface CallMessageOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional .signalservice.CallMessage.Offer offer = 1; + /** + * optional .signalservice.CallMessage.Offer offer = 1; + */ + boolean hasOffer(); + /** + * optional .signalservice.CallMessage.Offer offer = 1; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer getOffer(); + /** + * optional .signalservice.CallMessage.Offer offer = 1; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.OfferOrBuilder getOfferOrBuilder(); + + // optional .signalservice.CallMessage.Answer answer = 2; + /** + * optional .signalservice.CallMessage.Answer answer = 2; + */ + boolean hasAnswer(); + /** + * optional .signalservice.CallMessage.Answer answer = 2; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer getAnswer(); + /** + * optional .signalservice.CallMessage.Answer answer = 2; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.AnswerOrBuilder getAnswerOrBuilder(); + + // repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + /** + * repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + */ + java.util.List + getIceUpdateList(); + /** + * repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate getIceUpdate(int index); + /** + * repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + */ + int getIceUpdateCount(); + /** + * repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + */ + java.util.List + getIceUpdateOrBuilderList(); + /** + * repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdateOrBuilder getIceUpdateOrBuilder( + int index); + + // optional .signalservice.CallMessage.Hangup hangup = 4; + /** + * optional .signalservice.CallMessage.Hangup hangup = 4; + */ + boolean hasHangup(); + /** + * optional .signalservice.CallMessage.Hangup hangup = 4; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup getHangup(); + /** + * optional .signalservice.CallMessage.Hangup hangup = 4; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.HangupOrBuilder getHangupOrBuilder(); + + // optional .signalservice.CallMessage.Busy busy = 5; + /** + * optional .signalservice.CallMessage.Busy busy = 5; + */ + boolean hasBusy(); + /** + * optional .signalservice.CallMessage.Busy busy = 5; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy getBusy(); + /** + * optional .signalservice.CallMessage.Busy busy = 5; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.BusyOrBuilder getBusyOrBuilder(); + } + /** + * Protobuf type {@code signalservice.CallMessage} + */ + public static final class CallMessage extends + com.google.protobuf.GeneratedMessage + implements CallMessageOrBuilder { + // Use CallMessage.newBuilder() to construct. + private CallMessage(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private CallMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final CallMessage defaultInstance; + public static CallMessage getDefaultInstance() { + return defaultInstance; + } + + public CallMessage getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private CallMessage( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer.Builder subBuilder = null; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + subBuilder = offer_.toBuilder(); + } + offer_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(offer_); + offer_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000001; + break; + } + case 18: { + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer.Builder subBuilder = null; + if (((bitField0_ & 0x00000002) == 0x00000002)) { + subBuilder = answer_.toBuilder(); + } + answer_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(answer_); + answer_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000002; + break; + } + case 26: { + if (!((mutable_bitField0_ & 0x00000004) == 0x00000004)) { + iceUpdate_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000004; + } + iceUpdate_.add(input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate.PARSER, extensionRegistry)); + break; + } + case 34: { + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup.Builder subBuilder = null; + if (((bitField0_ & 0x00000004) == 0x00000004)) { + subBuilder = hangup_.toBuilder(); + } + hangup_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(hangup_); + hangup_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000004; + break; + } + case 42: { + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy.Builder subBuilder = null; + if (((bitField0_ & 0x00000008) == 0x00000008)) { + subBuilder = busy_.toBuilder(); + } + busy_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(busy_); + busy_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000008; + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000004) == 0x00000004)) { + iceUpdate_ = java.util.Collections.unmodifiableList(iceUpdate_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_CallMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_CallMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.class, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public CallMessage parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new CallMessage(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public interface OfferOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional uint64 id = 1; + /** + * optional uint64 id = 1; + */ + boolean hasId(); + /** + * optional uint64 id = 1; + */ + long getId(); + + // optional string description = 2; + /** + * optional string description = 2; + */ + boolean hasDescription(); + /** + * optional string description = 2; + */ + String getDescription(); + /** + * optional string description = 2; + */ + com.google.protobuf.ByteString + getDescriptionBytes(); + } + /** + * Protobuf type {@code signalservice.CallMessage.Offer} + */ + public static final class Offer extends + com.google.protobuf.GeneratedMessage + implements OfferOrBuilder { + // Use Offer.newBuilder() to construct. + private Offer(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Offer(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Offer defaultInstance; + public static Offer getDefaultInstance() { + return defaultInstance; + } + + public Offer getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Offer( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + id_ = input.readUInt64(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + description_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_CallMessage_Offer_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_CallMessage_Offer_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer.class, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Offer parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Offer(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional uint64 id = 1; + public static final int ID_FIELD_NUMBER = 1; + private long id_; + /** + * optional uint64 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint64 id = 1; + */ + public long getId() { + return id_; + } + + // optional string description = 2; + public static final int DESCRIPTION_FIELD_NUMBER = 2; + private Object description_; + /** + * optional string description = 2; + */ + public boolean hasDescription() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string description = 2; + */ + public String getDescription() { + Object ref = description_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + description_ = s; + } + return s; + } + } + /** + * optional string description = 2; + */ + public com.google.protobuf.ByteString + getDescriptionBytes() { + Object ref = description_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + description_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private void initFields() { + id_ = 0L; + description_ = ""; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt64(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, getDescriptionBytes()); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, getDescriptionBytes()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.CallMessage.Offer} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.OfferOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_CallMessage_Offer_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_CallMessage_Offer_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer.class, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + id_ = 0L; + bitField0_ = (bitField0_ & ~0x00000001); + description_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_CallMessage_Offer_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer result = new org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.id_ = id_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.description_ = description_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer.getDefaultInstance()) return this; + if (other.hasId()) { + setId(other.getId()); + } + if (other.hasDescription()) { + bitField0_ |= 0x00000002; + description_ = other.description_; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional uint64 id = 1; + private long id_ ; + /** + * optional uint64 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint64 id = 1; + */ + public long getId() { + return id_; + } + /** + * optional uint64 id = 1; + */ + public Builder setId(long value) { + bitField0_ |= 0x00000001; + id_ = value; + onChanged(); + return this; + } + /** + * optional uint64 id = 1; + */ + public Builder clearId() { + bitField0_ = (bitField0_ & ~0x00000001); + id_ = 0L; + onChanged(); + return this; + } + + // optional string description = 2; + private Object description_ = ""; + /** + * optional string description = 2; + */ + public boolean hasDescription() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string description = 2; + */ + public String getDescription() { + Object ref = description_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + description_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string description = 2; + */ + public com.google.protobuf.ByteString + getDescriptionBytes() { + Object ref = description_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + description_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string description = 2; + */ + public Builder setDescription( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + description_ = value; + onChanged(); + return this; + } + /** + * optional string description = 2; + */ + public Builder clearDescription() { + bitField0_ = (bitField0_ & ~0x00000002); + description_ = getDefaultInstance().getDescription(); + onChanged(); + return this; + } + /** + * optional string description = 2; + */ + public Builder setDescriptionBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + description_ = value; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.CallMessage.Offer) + } + + static { + defaultInstance = new Offer(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.CallMessage.Offer) + } + + public interface AnswerOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional uint64 id = 1; + /** + * optional uint64 id = 1; + */ + boolean hasId(); + /** + * optional uint64 id = 1; + */ + long getId(); + + // optional string description = 2; + /** + * optional string description = 2; + */ + boolean hasDescription(); + /** + * optional string description = 2; + */ + String getDescription(); + /** + * optional string description = 2; + */ + com.google.protobuf.ByteString + getDescriptionBytes(); + } + /** + * Protobuf type {@code signalservice.CallMessage.Answer} + */ + public static final class Answer extends + com.google.protobuf.GeneratedMessage + implements AnswerOrBuilder { + // Use Answer.newBuilder() to construct. + private Answer(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Answer(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Answer defaultInstance; + public static Answer getDefaultInstance() { + return defaultInstance; + } + + public Answer getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Answer( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + id_ = input.readUInt64(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + description_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_CallMessage_Answer_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_CallMessage_Answer_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer.class, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Answer parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Answer(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional uint64 id = 1; + public static final int ID_FIELD_NUMBER = 1; + private long id_; + /** + * optional uint64 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint64 id = 1; + */ + public long getId() { + return id_; + } + + // optional string description = 2; + public static final int DESCRIPTION_FIELD_NUMBER = 2; + private Object description_; + /** + * optional string description = 2; + */ + public boolean hasDescription() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string description = 2; + */ + public String getDescription() { + Object ref = description_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + description_ = s; + } + return s; + } + } + /** + * optional string description = 2; + */ + public com.google.protobuf.ByteString + getDescriptionBytes() { + Object ref = description_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + description_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private void initFields() { + id_ = 0L; + description_ = ""; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt64(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, getDescriptionBytes()); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, getDescriptionBytes()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.CallMessage.Answer} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.AnswerOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_CallMessage_Answer_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_CallMessage_Answer_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer.class, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + id_ = 0L; + bitField0_ = (bitField0_ & ~0x00000001); + description_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_CallMessage_Answer_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer result = new org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.id_ = id_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.description_ = description_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer.getDefaultInstance()) return this; + if (other.hasId()) { + setId(other.getId()); + } + if (other.hasDescription()) { + bitField0_ |= 0x00000002; + description_ = other.description_; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional uint64 id = 1; + private long id_ ; + /** + * optional uint64 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint64 id = 1; + */ + public long getId() { + return id_; + } + /** + * optional uint64 id = 1; + */ + public Builder setId(long value) { + bitField0_ |= 0x00000001; + id_ = value; + onChanged(); + return this; + } + /** + * optional uint64 id = 1; + */ + public Builder clearId() { + bitField0_ = (bitField0_ & ~0x00000001); + id_ = 0L; + onChanged(); + return this; + } + + // optional string description = 2; + private Object description_ = ""; + /** + * optional string description = 2; + */ + public boolean hasDescription() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string description = 2; + */ + public String getDescription() { + Object ref = description_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + description_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string description = 2; + */ + public com.google.protobuf.ByteString + getDescriptionBytes() { + Object ref = description_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + description_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string description = 2; + */ + public Builder setDescription( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + description_ = value; + onChanged(); + return this; + } + /** + * optional string description = 2; + */ + public Builder clearDescription() { + bitField0_ = (bitField0_ & ~0x00000002); + description_ = getDefaultInstance().getDescription(); + onChanged(); + return this; + } + /** + * optional string description = 2; + */ + public Builder setDescriptionBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + description_ = value; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.CallMessage.Answer) + } + + static { + defaultInstance = new Answer(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.CallMessage.Answer) + } + + public interface IceUpdateOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional uint64 id = 1; + /** + * optional uint64 id = 1; + */ + boolean hasId(); + /** + * optional uint64 id = 1; + */ + long getId(); + + // optional string sdpMid = 2; + /** + * optional string sdpMid = 2; + */ + boolean hasSdpMid(); + /** + * optional string sdpMid = 2; + */ + String getSdpMid(); + /** + * optional string sdpMid = 2; + */ + com.google.protobuf.ByteString + getSdpMidBytes(); + + // optional uint32 sdpMLineIndex = 3; + /** + * optional uint32 sdpMLineIndex = 3; + */ + boolean hasSdpMLineIndex(); + /** + * optional uint32 sdpMLineIndex = 3; + */ + int getSdpMLineIndex(); + + // optional string sdp = 4; + /** + * optional string sdp = 4; + */ + boolean hasSdp(); + /** + * optional string sdp = 4; + */ + String getSdp(); + /** + * optional string sdp = 4; + */ + com.google.protobuf.ByteString + getSdpBytes(); + } + /** + * Protobuf type {@code signalservice.CallMessage.IceUpdate} + */ + public static final class IceUpdate extends + com.google.protobuf.GeneratedMessage + implements IceUpdateOrBuilder { + // Use IceUpdate.newBuilder() to construct. + private IceUpdate(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private IceUpdate(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final IceUpdate defaultInstance; + public static IceUpdate getDefaultInstance() { + return defaultInstance; + } + + public IceUpdate getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private IceUpdate( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + id_ = input.readUInt64(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + sdpMid_ = input.readBytes(); + break; + } + case 24: { + bitField0_ |= 0x00000004; + sdpMLineIndex_ = input.readUInt32(); + break; + } + case 34: { + bitField0_ |= 0x00000008; + sdp_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_CallMessage_IceUpdate_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_CallMessage_IceUpdate_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate.class, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public IceUpdate parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new IceUpdate(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional uint64 id = 1; + public static final int ID_FIELD_NUMBER = 1; + private long id_; + /** + * optional uint64 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint64 id = 1; + */ + public long getId() { + return id_; + } + + // optional string sdpMid = 2; + public static final int SDPMID_FIELD_NUMBER = 2; + private Object sdpMid_; + /** + * optional string sdpMid = 2; + */ + public boolean hasSdpMid() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string sdpMid = 2; + */ + public String getSdpMid() { + Object ref = sdpMid_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + sdpMid_ = s; + } + return s; + } + } + /** + * optional string sdpMid = 2; + */ + public com.google.protobuf.ByteString + getSdpMidBytes() { + Object ref = sdpMid_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + sdpMid_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional uint32 sdpMLineIndex = 3; + public static final int SDPMLINEINDEX_FIELD_NUMBER = 3; + private int sdpMLineIndex_; + /** + * optional uint32 sdpMLineIndex = 3; + */ + public boolean hasSdpMLineIndex() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional uint32 sdpMLineIndex = 3; + */ + public int getSdpMLineIndex() { + return sdpMLineIndex_; + } + + // optional string sdp = 4; + public static final int SDP_FIELD_NUMBER = 4; + private Object sdp_; + /** + * optional string sdp = 4; + */ + public boolean hasSdp() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional string sdp = 4; + */ + public String getSdp() { + Object ref = sdp_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + sdp_ = s; + } + return s; + } + } + /** + * optional string sdp = 4; + */ + public com.google.protobuf.ByteString + getSdpBytes() { + Object ref = sdp_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + sdp_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private void initFields() { + id_ = 0L; + sdpMid_ = ""; + sdpMLineIndex_ = 0; + sdp_ = ""; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt64(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, getSdpMidBytes()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeUInt32(3, sdpMLineIndex_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeBytes(4, getSdpBytes()); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, getSdpMidBytes()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(3, sdpMLineIndex_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(4, getSdpBytes()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.CallMessage.IceUpdate} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdateOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_CallMessage_IceUpdate_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_CallMessage_IceUpdate_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate.class, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + id_ = 0L; + bitField0_ = (bitField0_ & ~0x00000001); + sdpMid_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + sdpMLineIndex_ = 0; + bitField0_ = (bitField0_ & ~0x00000004); + sdp_ = ""; + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_CallMessage_IceUpdate_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate result = new org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.id_ = id_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.sdpMid_ = sdpMid_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.sdpMLineIndex_ = sdpMLineIndex_; + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000008; + } + result.sdp_ = sdp_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate.getDefaultInstance()) return this; + if (other.hasId()) { + setId(other.getId()); + } + if (other.hasSdpMid()) { + bitField0_ |= 0x00000002; + sdpMid_ = other.sdpMid_; + onChanged(); + } + if (other.hasSdpMLineIndex()) { + setSdpMLineIndex(other.getSdpMLineIndex()); + } + if (other.hasSdp()) { + bitField0_ |= 0x00000008; + sdp_ = other.sdp_; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional uint64 id = 1; + private long id_ ; + /** + * optional uint64 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint64 id = 1; + */ + public long getId() { + return id_; + } + /** + * optional uint64 id = 1; + */ + public Builder setId(long value) { + bitField0_ |= 0x00000001; + id_ = value; + onChanged(); + return this; + } + /** + * optional uint64 id = 1; + */ + public Builder clearId() { + bitField0_ = (bitField0_ & ~0x00000001); + id_ = 0L; + onChanged(); + return this; + } + + // optional string sdpMid = 2; + private Object sdpMid_ = ""; + /** + * optional string sdpMid = 2; + */ + public boolean hasSdpMid() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string sdpMid = 2; + */ + public String getSdpMid() { + Object ref = sdpMid_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + sdpMid_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string sdpMid = 2; + */ + public com.google.protobuf.ByteString + getSdpMidBytes() { + Object ref = sdpMid_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + sdpMid_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string sdpMid = 2; + */ + public Builder setSdpMid( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + sdpMid_ = value; + onChanged(); + return this; + } + /** + * optional string sdpMid = 2; + */ + public Builder clearSdpMid() { + bitField0_ = (bitField0_ & ~0x00000002); + sdpMid_ = getDefaultInstance().getSdpMid(); + onChanged(); + return this; + } + /** + * optional string sdpMid = 2; + */ + public Builder setSdpMidBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + sdpMid_ = value; + onChanged(); + return this; + } + + // optional uint32 sdpMLineIndex = 3; + private int sdpMLineIndex_ ; + /** + * optional uint32 sdpMLineIndex = 3; + */ + public boolean hasSdpMLineIndex() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional uint32 sdpMLineIndex = 3; + */ + public int getSdpMLineIndex() { + return sdpMLineIndex_; + } + /** + * optional uint32 sdpMLineIndex = 3; + */ + public Builder setSdpMLineIndex(int value) { + bitField0_ |= 0x00000004; + sdpMLineIndex_ = value; + onChanged(); + return this; + } + /** + * optional uint32 sdpMLineIndex = 3; + */ + public Builder clearSdpMLineIndex() { + bitField0_ = (bitField0_ & ~0x00000004); + sdpMLineIndex_ = 0; + onChanged(); + return this; + } + + // optional string sdp = 4; + private Object sdp_ = ""; + /** + * optional string sdp = 4; + */ + public boolean hasSdp() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional string sdp = 4; + */ + public String getSdp() { + Object ref = sdp_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + sdp_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string sdp = 4; + */ + public com.google.protobuf.ByteString + getSdpBytes() { + Object ref = sdp_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + sdp_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string sdp = 4; + */ + public Builder setSdp( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + sdp_ = value; + onChanged(); + return this; + } + /** + * optional string sdp = 4; + */ + public Builder clearSdp() { + bitField0_ = (bitField0_ & ~0x00000008); + sdp_ = getDefaultInstance().getSdp(); + onChanged(); + return this; + } + /** + * optional string sdp = 4; + */ + public Builder setSdpBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + sdp_ = value; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.CallMessage.IceUpdate) + } + + static { + defaultInstance = new IceUpdate(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.CallMessage.IceUpdate) + } + + public interface BusyOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional uint64 id = 1; + /** + * optional uint64 id = 1; + */ + boolean hasId(); + /** + * optional uint64 id = 1; + */ + long getId(); + } + /** + * Protobuf type {@code signalservice.CallMessage.Busy} + */ + public static final class Busy extends + com.google.protobuf.GeneratedMessage + implements BusyOrBuilder { + // Use Busy.newBuilder() to construct. + private Busy(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Busy(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Busy defaultInstance; + public static Busy getDefaultInstance() { + return defaultInstance; + } + + public Busy getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Busy( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + id_ = input.readUInt64(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_CallMessage_Busy_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_CallMessage_Busy_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy.class, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Busy parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Busy(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional uint64 id = 1; + public static final int ID_FIELD_NUMBER = 1; + private long id_; + /** + * optional uint64 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint64 id = 1; + */ + public long getId() { + return id_; + } + + private void initFields() { + id_ = 0L; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt64(1, id_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(1, id_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.CallMessage.Busy} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.BusyOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_CallMessage_Busy_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_CallMessage_Busy_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy.class, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + id_ = 0L; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_CallMessage_Busy_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy result = new org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.id_ = id_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy.getDefaultInstance()) return this; + if (other.hasId()) { + setId(other.getId()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional uint64 id = 1; + private long id_ ; + /** + * optional uint64 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint64 id = 1; + */ + public long getId() { + return id_; + } + /** + * optional uint64 id = 1; + */ + public Builder setId(long value) { + bitField0_ |= 0x00000001; + id_ = value; + onChanged(); + return this; + } + /** + * optional uint64 id = 1; + */ + public Builder clearId() { + bitField0_ = (bitField0_ & ~0x00000001); + id_ = 0L; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.CallMessage.Busy) + } + + static { + defaultInstance = new Busy(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.CallMessage.Busy) + } + + public interface HangupOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional uint64 id = 1; + /** + * optional uint64 id = 1; + */ + boolean hasId(); + /** + * optional uint64 id = 1; + */ + long getId(); + } + /** + * Protobuf type {@code signalservice.CallMessage.Hangup} + */ + public static final class Hangup extends + com.google.protobuf.GeneratedMessage + implements HangupOrBuilder { + // Use Hangup.newBuilder() to construct. + private Hangup(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Hangup(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Hangup defaultInstance; + public static Hangup getDefaultInstance() { + return defaultInstance; + } + + public Hangup getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Hangup( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + id_ = input.readUInt64(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_CallMessage_Hangup_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_CallMessage_Hangup_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup.class, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Hangup parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Hangup(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional uint64 id = 1; + public static final int ID_FIELD_NUMBER = 1; + private long id_; + /** + * optional uint64 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint64 id = 1; + */ + public long getId() { + return id_; + } + + private void initFields() { + id_ = 0L; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt64(1, id_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(1, id_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.CallMessage.Hangup} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.HangupOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_CallMessage_Hangup_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_CallMessage_Hangup_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup.class, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + id_ = 0L; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_CallMessage_Hangup_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup result = new org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.id_ = id_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup.getDefaultInstance()) return this; + if (other.hasId()) { + setId(other.getId()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional uint64 id = 1; + private long id_ ; + /** + * optional uint64 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint64 id = 1; + */ + public long getId() { + return id_; + } + /** + * optional uint64 id = 1; + */ + public Builder setId(long value) { + bitField0_ |= 0x00000001; + id_ = value; + onChanged(); + return this; + } + /** + * optional uint64 id = 1; + */ + public Builder clearId() { + bitField0_ = (bitField0_ & ~0x00000001); + id_ = 0L; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.CallMessage.Hangup) + } + + static { + defaultInstance = new Hangup(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.CallMessage.Hangup) + } + + private int bitField0_; + // optional .signalservice.CallMessage.Offer offer = 1; + public static final int OFFER_FIELD_NUMBER = 1; + private org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer offer_; + /** + * optional .signalservice.CallMessage.Offer offer = 1; + */ + public boolean hasOffer() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional .signalservice.CallMessage.Offer offer = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer getOffer() { + return offer_; + } + /** + * optional .signalservice.CallMessage.Offer offer = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.OfferOrBuilder getOfferOrBuilder() { + return offer_; + } + + // optional .signalservice.CallMessage.Answer answer = 2; + public static final int ANSWER_FIELD_NUMBER = 2; + private org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer answer_; + /** + * optional .signalservice.CallMessage.Answer answer = 2; + */ + public boolean hasAnswer() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .signalservice.CallMessage.Answer answer = 2; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer getAnswer() { + return answer_; + } + /** + * optional .signalservice.CallMessage.Answer answer = 2; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.AnswerOrBuilder getAnswerOrBuilder() { + return answer_; + } + + // repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + public static final int ICEUPDATE_FIELD_NUMBER = 3; + private java.util.List iceUpdate_; + /** + * repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + */ + public java.util.List getIceUpdateList() { + return iceUpdate_; + } + /** + * repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + */ + public java.util.List + getIceUpdateOrBuilderList() { + return iceUpdate_; + } + /** + * repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + */ + public int getIceUpdateCount() { + return iceUpdate_.size(); + } + /** + * repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate getIceUpdate(int index) { + return iceUpdate_.get(index); + } + /** + * repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdateOrBuilder getIceUpdateOrBuilder( + int index) { + return iceUpdate_.get(index); + } + + // optional .signalservice.CallMessage.Hangup hangup = 4; + public static final int HANGUP_FIELD_NUMBER = 4; + private org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup hangup_; + /** + * optional .signalservice.CallMessage.Hangup hangup = 4; + */ + public boolean hasHangup() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .signalservice.CallMessage.Hangup hangup = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup getHangup() { + return hangup_; + } + /** + * optional .signalservice.CallMessage.Hangup hangup = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.HangupOrBuilder getHangupOrBuilder() { + return hangup_; + } + + // optional .signalservice.CallMessage.Busy busy = 5; + public static final int BUSY_FIELD_NUMBER = 5; + private org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy busy_; + /** + * optional .signalservice.CallMessage.Busy busy = 5; + */ + public boolean hasBusy() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional .signalservice.CallMessage.Busy busy = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy getBusy() { + return busy_; + } + /** + * optional .signalservice.CallMessage.Busy busy = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.BusyOrBuilder getBusyOrBuilder() { + return busy_; + } + + private void initFields() { + offer_ = org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer.getDefaultInstance(); + answer_ = org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer.getDefaultInstance(); + iceUpdate_ = java.util.Collections.emptyList(); + hangup_ = org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup.getDefaultInstance(); + busy_ = org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy.getDefaultInstance(); + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeMessage(1, offer_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeMessage(2, answer_); + } + for (int i = 0; i < iceUpdate_.size(); i++) { + output.writeMessage(3, iceUpdate_.get(i)); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeMessage(4, hangup_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeMessage(5, busy_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, offer_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, answer_); + } + for (int i = 0; i < iceUpdate_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, iceUpdate_.get(i)); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(4, hangup_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(5, busy_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.CallMessage} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_CallMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_CallMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.class, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getOfferFieldBuilder(); + getAnswerFieldBuilder(); + getIceUpdateFieldBuilder(); + getHangupFieldBuilder(); + getBusyFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + if (offerBuilder_ == null) { + offer_ = org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer.getDefaultInstance(); + } else { + offerBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + if (answerBuilder_ == null) { + answer_ = org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer.getDefaultInstance(); + } else { + answerBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + if (iceUpdateBuilder_ == null) { + iceUpdate_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); + } else { + iceUpdateBuilder_.clear(); + } + if (hangupBuilder_ == null) { + hangup_ = org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup.getDefaultInstance(); + } else { + hangupBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000008); + if (busyBuilder_ == null) { + busy_ = org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy.getDefaultInstance(); + } else { + busyBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000010); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_CallMessage_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage result = new org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + if (offerBuilder_ == null) { + result.offer_ = offer_; + } else { + result.offer_ = offerBuilder_.build(); + } + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + if (answerBuilder_ == null) { + result.answer_ = answer_; + } else { + result.answer_ = answerBuilder_.build(); + } + if (iceUpdateBuilder_ == null) { + if (((bitField0_ & 0x00000004) == 0x00000004)) { + iceUpdate_ = java.util.Collections.unmodifiableList(iceUpdate_); + bitField0_ = (bitField0_ & ~0x00000004); + } + result.iceUpdate_ = iceUpdate_; + } else { + result.iceUpdate_ = iceUpdateBuilder_.build(); + } + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000004; + } + if (hangupBuilder_ == null) { + result.hangup_ = hangup_; + } else { + result.hangup_ = hangupBuilder_.build(); + } + if (((from_bitField0_ & 0x00000010) == 0x00000010)) { + to_bitField0_ |= 0x00000008; + } + if (busyBuilder_ == null) { + result.busy_ = busy_; + } else { + result.busy_ = busyBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.getDefaultInstance()) return this; + if (other.hasOffer()) { + mergeOffer(other.getOffer()); + } + if (other.hasAnswer()) { + mergeAnswer(other.getAnswer()); + } + if (iceUpdateBuilder_ == null) { + if (!other.iceUpdate_.isEmpty()) { + if (iceUpdate_.isEmpty()) { + iceUpdate_ = other.iceUpdate_; + bitField0_ = (bitField0_ & ~0x00000004); + } else { + ensureIceUpdateIsMutable(); + iceUpdate_.addAll(other.iceUpdate_); + } + onChanged(); + } + } else { + if (!other.iceUpdate_.isEmpty()) { + if (iceUpdateBuilder_.isEmpty()) { + iceUpdateBuilder_.dispose(); + iceUpdateBuilder_ = null; + iceUpdate_ = other.iceUpdate_; + bitField0_ = (bitField0_ & ~0x00000004); + iceUpdateBuilder_ = + com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ? + getIceUpdateFieldBuilder() : null; + } else { + iceUpdateBuilder_.addAllMessages(other.iceUpdate_); + } + } + } + if (other.hasHangup()) { + mergeHangup(other.getHangup()); + } + if (other.hasBusy()) { + mergeBusy(other.getBusy()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional .signalservice.CallMessage.Offer offer = 1; + private org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer offer_ = org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.OfferOrBuilder> offerBuilder_; + /** + * optional .signalservice.CallMessage.Offer offer = 1; + */ + public boolean hasOffer() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional .signalservice.CallMessage.Offer offer = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer getOffer() { + if (offerBuilder_ == null) { + return offer_; + } else { + return offerBuilder_.getMessage(); + } + } + /** + * optional .signalservice.CallMessage.Offer offer = 1; + */ + public Builder setOffer(org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer value) { + if (offerBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + offer_ = value; + onChanged(); + } else { + offerBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * optional .signalservice.CallMessage.Offer offer = 1; + */ + public Builder setOffer( + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer.Builder builderForValue) { + if (offerBuilder_ == null) { + offer_ = builderForValue.build(); + onChanged(); + } else { + offerBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * optional .signalservice.CallMessage.Offer offer = 1; + */ + public Builder mergeOffer(org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer value) { + if (offerBuilder_ == null) { + if (((bitField0_ & 0x00000001) == 0x00000001) && + offer_ != org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer.getDefaultInstance()) { + offer_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer.newBuilder(offer_).mergeFrom(value).buildPartial(); + } else { + offer_ = value; + } + onChanged(); + } else { + offerBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * optional .signalservice.CallMessage.Offer offer = 1; + */ + public Builder clearOffer() { + if (offerBuilder_ == null) { + offer_ = org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer.getDefaultInstance(); + onChanged(); + } else { + offerBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + /** + * optional .signalservice.CallMessage.Offer offer = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer.Builder getOfferBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getOfferFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.CallMessage.Offer offer = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.OfferOrBuilder getOfferOrBuilder() { + if (offerBuilder_ != null) { + return offerBuilder_.getMessageOrBuilder(); + } else { + return offer_; + } + } + /** + * optional .signalservice.CallMessage.Offer offer = 1; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.OfferOrBuilder> + getOfferFieldBuilder() { + if (offerBuilder_ == null) { + offerBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Offer.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.OfferOrBuilder>( + offer_, + getParentForChildren(), + isClean()); + offer_ = null; + } + return offerBuilder_; + } + + // optional .signalservice.CallMessage.Answer answer = 2; + private org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer answer_ = org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.AnswerOrBuilder> answerBuilder_; + /** + * optional .signalservice.CallMessage.Answer answer = 2; + */ + public boolean hasAnswer() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .signalservice.CallMessage.Answer answer = 2; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer getAnswer() { + if (answerBuilder_ == null) { + return answer_; + } else { + return answerBuilder_.getMessage(); + } + } + /** + * optional .signalservice.CallMessage.Answer answer = 2; + */ + public Builder setAnswer(org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer value) { + if (answerBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + answer_ = value; + onChanged(); + } else { + answerBuilder_.setMessage(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .signalservice.CallMessage.Answer answer = 2; + */ + public Builder setAnswer( + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer.Builder builderForValue) { + if (answerBuilder_ == null) { + answer_ = builderForValue.build(); + onChanged(); + } else { + answerBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .signalservice.CallMessage.Answer answer = 2; + */ + public Builder mergeAnswer(org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer value) { + if (answerBuilder_ == null) { + if (((bitField0_ & 0x00000002) == 0x00000002) && + answer_ != org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer.getDefaultInstance()) { + answer_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer.newBuilder(answer_).mergeFrom(value).buildPartial(); + } else { + answer_ = value; + } + onChanged(); + } else { + answerBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .signalservice.CallMessage.Answer answer = 2; + */ + public Builder clearAnswer() { + if (answerBuilder_ == null) { + answer_ = org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer.getDefaultInstance(); + onChanged(); + } else { + answerBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + /** + * optional .signalservice.CallMessage.Answer answer = 2; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer.Builder getAnswerBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getAnswerFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.CallMessage.Answer answer = 2; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.AnswerOrBuilder getAnswerOrBuilder() { + if (answerBuilder_ != null) { + return answerBuilder_.getMessageOrBuilder(); + } else { + return answer_; + } + } + /** + * optional .signalservice.CallMessage.Answer answer = 2; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.AnswerOrBuilder> + getAnswerFieldBuilder() { + if (answerBuilder_ == null) { + answerBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Answer.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.AnswerOrBuilder>( + answer_, + getParentForChildren(), + isClean()); + answer_ = null; + } + return answerBuilder_; + } + + // repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + private java.util.List iceUpdate_ = + java.util.Collections.emptyList(); + private void ensureIceUpdateIsMutable() { + if (!((bitField0_ & 0x00000004) == 0x00000004)) { + iceUpdate_ = new java.util.ArrayList(iceUpdate_); + bitField0_ |= 0x00000004; + } + } + + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdateOrBuilder> iceUpdateBuilder_; + + /** + * repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + */ + public java.util.List getIceUpdateList() { + if (iceUpdateBuilder_ == null) { + return java.util.Collections.unmodifiableList(iceUpdate_); + } else { + return iceUpdateBuilder_.getMessageList(); + } + } + /** + * repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + */ + public int getIceUpdateCount() { + if (iceUpdateBuilder_ == null) { + return iceUpdate_.size(); + } else { + return iceUpdateBuilder_.getCount(); + } + } + /** + * repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate getIceUpdate(int index) { + if (iceUpdateBuilder_ == null) { + return iceUpdate_.get(index); + } else { + return iceUpdateBuilder_.getMessage(index); + } + } + /** + * repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + */ + public Builder setIceUpdate( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate value) { + if (iceUpdateBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureIceUpdateIsMutable(); + iceUpdate_.set(index, value); + onChanged(); + } else { + iceUpdateBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + */ + public Builder setIceUpdate( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate.Builder builderForValue) { + if (iceUpdateBuilder_ == null) { + ensureIceUpdateIsMutable(); + iceUpdate_.set(index, builderForValue.build()); + onChanged(); + } else { + iceUpdateBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + */ + public Builder addIceUpdate(org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate value) { + if (iceUpdateBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureIceUpdateIsMutable(); + iceUpdate_.add(value); + onChanged(); + } else { + iceUpdateBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + */ + public Builder addIceUpdate( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate value) { + if (iceUpdateBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureIceUpdateIsMutable(); + iceUpdate_.add(index, value); + onChanged(); + } else { + iceUpdateBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + */ + public Builder addIceUpdate( + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate.Builder builderForValue) { + if (iceUpdateBuilder_ == null) { + ensureIceUpdateIsMutable(); + iceUpdate_.add(builderForValue.build()); + onChanged(); + } else { + iceUpdateBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + */ + public Builder addIceUpdate( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate.Builder builderForValue) { + if (iceUpdateBuilder_ == null) { + ensureIceUpdateIsMutable(); + iceUpdate_.add(index, builderForValue.build()); + onChanged(); + } else { + iceUpdateBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + */ + public Builder addAllIceUpdate( + Iterable values) { + if (iceUpdateBuilder_ == null) { + ensureIceUpdateIsMutable(); + super.addAll(values, iceUpdate_); + onChanged(); + } else { + iceUpdateBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + */ + public Builder clearIceUpdate() { + if (iceUpdateBuilder_ == null) { + iceUpdate_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); + onChanged(); + } else { + iceUpdateBuilder_.clear(); + } + return this; + } + /** + * repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + */ + public Builder removeIceUpdate(int index) { + if (iceUpdateBuilder_ == null) { + ensureIceUpdateIsMutable(); + iceUpdate_.remove(index); + onChanged(); + } else { + iceUpdateBuilder_.remove(index); + } + return this; + } + /** + * repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate.Builder getIceUpdateBuilder( + int index) { + return getIceUpdateFieldBuilder().getBuilder(index); + } + /** + * repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdateOrBuilder getIceUpdateOrBuilder( + int index) { + if (iceUpdateBuilder_ == null) { + return iceUpdate_.get(index); } else { + return iceUpdateBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + */ + public java.util.List + getIceUpdateOrBuilderList() { + if (iceUpdateBuilder_ != null) { + return iceUpdateBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(iceUpdate_); + } + } + /** + * repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate.Builder addIceUpdateBuilder() { + return getIceUpdateFieldBuilder().addBuilder( + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate.getDefaultInstance()); + } + /** + * repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate.Builder addIceUpdateBuilder( + int index) { + return getIceUpdateFieldBuilder().addBuilder( + index, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate.getDefaultInstance()); + } + /** + * repeated .signalservice.CallMessage.IceUpdate iceUpdate = 3; + */ + public java.util.List + getIceUpdateBuilderList() { + return getIceUpdateFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdateOrBuilder> + getIceUpdateFieldBuilder() { + if (iceUpdateBuilder_ == null) { + iceUpdateBuilder_ = new com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdate.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.IceUpdateOrBuilder>( + iceUpdate_, + ((bitField0_ & 0x00000004) == 0x00000004), + getParentForChildren(), + isClean()); + iceUpdate_ = null; + } + return iceUpdateBuilder_; + } + + // optional .signalservice.CallMessage.Hangup hangup = 4; + private org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup hangup_ = org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.HangupOrBuilder> hangupBuilder_; + /** + * optional .signalservice.CallMessage.Hangup hangup = 4; + */ + public boolean hasHangup() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional .signalservice.CallMessage.Hangup hangup = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup getHangup() { + if (hangupBuilder_ == null) { + return hangup_; + } else { + return hangupBuilder_.getMessage(); + } + } + /** + * optional .signalservice.CallMessage.Hangup hangup = 4; + */ + public Builder setHangup(org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup value) { + if (hangupBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + hangup_ = value; + onChanged(); + } else { + hangupBuilder_.setMessage(value); + } + bitField0_ |= 0x00000008; + return this; + } + /** + * optional .signalservice.CallMessage.Hangup hangup = 4; + */ + public Builder setHangup( + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup.Builder builderForValue) { + if (hangupBuilder_ == null) { + hangup_ = builderForValue.build(); + onChanged(); + } else { + hangupBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000008; + return this; + } + /** + * optional .signalservice.CallMessage.Hangup hangup = 4; + */ + public Builder mergeHangup(org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup value) { + if (hangupBuilder_ == null) { + if (((bitField0_ & 0x00000008) == 0x00000008) && + hangup_ != org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup.getDefaultInstance()) { + hangup_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup.newBuilder(hangup_).mergeFrom(value).buildPartial(); + } else { + hangup_ = value; + } + onChanged(); + } else { + hangupBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000008; + return this; + } + /** + * optional .signalservice.CallMessage.Hangup hangup = 4; + */ + public Builder clearHangup() { + if (hangupBuilder_ == null) { + hangup_ = org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup.getDefaultInstance(); + onChanged(); + } else { + hangupBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + /** + * optional .signalservice.CallMessage.Hangup hangup = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup.Builder getHangupBuilder() { + bitField0_ |= 0x00000008; + onChanged(); + return getHangupFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.CallMessage.Hangup hangup = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.HangupOrBuilder getHangupOrBuilder() { + if (hangupBuilder_ != null) { + return hangupBuilder_.getMessageOrBuilder(); + } else { + return hangup_; + } + } + /** + * optional .signalservice.CallMessage.Hangup hangup = 4; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.HangupOrBuilder> + getHangupFieldBuilder() { + if (hangupBuilder_ == null) { + hangupBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Hangup.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.HangupOrBuilder>( + hangup_, + getParentForChildren(), + isClean()); + hangup_ = null; + } + return hangupBuilder_; + } + + // optional .signalservice.CallMessage.Busy busy = 5; + private org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy busy_ = org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.BusyOrBuilder> busyBuilder_; + /** + * optional .signalservice.CallMessage.Busy busy = 5; + */ + public boolean hasBusy() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional .signalservice.CallMessage.Busy busy = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy getBusy() { + if (busyBuilder_ == null) { + return busy_; + } else { + return busyBuilder_.getMessage(); + } + } + /** + * optional .signalservice.CallMessage.Busy busy = 5; + */ + public Builder setBusy(org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy value) { + if (busyBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + busy_ = value; + onChanged(); + } else { + busyBuilder_.setMessage(value); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * optional .signalservice.CallMessage.Busy busy = 5; + */ + public Builder setBusy( + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy.Builder builderForValue) { + if (busyBuilder_ == null) { + busy_ = builderForValue.build(); + onChanged(); + } else { + busyBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * optional .signalservice.CallMessage.Busy busy = 5; + */ + public Builder mergeBusy(org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy value) { + if (busyBuilder_ == null) { + if (((bitField0_ & 0x00000010) == 0x00000010) && + busy_ != org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy.getDefaultInstance()) { + busy_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy.newBuilder(busy_).mergeFrom(value).buildPartial(); + } else { + busy_ = value; + } + onChanged(); + } else { + busyBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * optional .signalservice.CallMessage.Busy busy = 5; + */ + public Builder clearBusy() { + if (busyBuilder_ == null) { + busy_ = org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy.getDefaultInstance(); + onChanged(); + } else { + busyBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000010); + return this; + } + /** + * optional .signalservice.CallMessage.Busy busy = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy.Builder getBusyBuilder() { + bitField0_ |= 0x00000010; + onChanged(); + return getBusyFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.CallMessage.Busy busy = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.BusyOrBuilder getBusyOrBuilder() { + if (busyBuilder_ != null) { + return busyBuilder_.getMessageOrBuilder(); + } else { + return busy_; + } + } + /** + * optional .signalservice.CallMessage.Busy busy = 5; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.BusyOrBuilder> + getBusyFieldBuilder() { + if (busyBuilder_ == null) { + busyBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.Busy.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.CallMessage.BusyOrBuilder>( + busy_, + getParentForChildren(), + isClean()); + busy_ = null; + } + return busyBuilder_; + } + + // @@protoc_insertion_point(builder_scope:signalservice.CallMessage) + } + + static { + defaultInstance = new CallMessage(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.CallMessage) + } + + public interface ClosedGroupCiphertextMessageWrapperOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional bytes ciphertext = 1; + /** + * optional bytes ciphertext = 1; + * + *
+     * @required
+     * 
+ */ + boolean hasCiphertext(); + /** + * optional bytes ciphertext = 1; + * + *
+     * @required
+     * 
+ */ + com.google.protobuf.ByteString getCiphertext(); + + // optional bytes ephemeralPublicKey = 2; + /** + * optional bytes ephemeralPublicKey = 2; + * + *
+     * @required
+     * 
+ */ + boolean hasEphemeralPublicKey(); + /** + * optional bytes ephemeralPublicKey = 2; + * + *
+     * @required
+     * 
+ */ + com.google.protobuf.ByteString getEphemeralPublicKey(); + } + /** + * Protobuf type {@code signalservice.ClosedGroupCiphertextMessageWrapper} + */ + public static final class ClosedGroupCiphertextMessageWrapper extends + com.google.protobuf.GeneratedMessage + implements ClosedGroupCiphertextMessageWrapperOrBuilder { + // Use ClosedGroupCiphertextMessageWrapper.newBuilder() to construct. + private ClosedGroupCiphertextMessageWrapper(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private ClosedGroupCiphertextMessageWrapper(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final ClosedGroupCiphertextMessageWrapper defaultInstance; + public static ClosedGroupCiphertextMessageWrapper getDefaultInstance() { + return defaultInstance; + } + + public ClosedGroupCiphertextMessageWrapper getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private ClosedGroupCiphertextMessageWrapper( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + ciphertext_ = input.readBytes(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + ephemeralPublicKey_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ClosedGroupCiphertextMessageWrapper_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ClosedGroupCiphertextMessageWrapper_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupCiphertextMessageWrapper.class, org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupCiphertextMessageWrapper.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public ClosedGroupCiphertextMessageWrapper parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new ClosedGroupCiphertextMessageWrapper(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional bytes ciphertext = 1; + public static final int CIPHERTEXT_FIELD_NUMBER = 1; + private com.google.protobuf.ByteString ciphertext_; + /** + * optional bytes ciphertext = 1; + * + *
+     * @required
+     * 
+ */ + public boolean hasCiphertext() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes ciphertext = 1; + * + *
+     * @required
+     * 
+ */ + public com.google.protobuf.ByteString getCiphertext() { + return ciphertext_; + } + + // optional bytes ephemeralPublicKey = 2; + public static final int EPHEMERALPUBLICKEY_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString ephemeralPublicKey_; + /** + * optional bytes ephemeralPublicKey = 2; + * + *
+     * @required
+     * 
+ */ + public boolean hasEphemeralPublicKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes ephemeralPublicKey = 2; + * + *
+     * @required
+     * 
+ */ + public com.google.protobuf.ByteString getEphemeralPublicKey() { + return ephemeralPublicKey_; + } + + private void initFields() { + ciphertext_ = com.google.protobuf.ByteString.EMPTY; + ephemeralPublicKey_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, ciphertext_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, ephemeralPublicKey_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, ciphertext_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, ephemeralPublicKey_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupCiphertextMessageWrapper parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupCiphertextMessageWrapper parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupCiphertextMessageWrapper parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupCiphertextMessageWrapper parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupCiphertextMessageWrapper parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupCiphertextMessageWrapper parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupCiphertextMessageWrapper parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupCiphertextMessageWrapper parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupCiphertextMessageWrapper parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupCiphertextMessageWrapper parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupCiphertextMessageWrapper prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.ClosedGroupCiphertextMessageWrapper} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupCiphertextMessageWrapperOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ClosedGroupCiphertextMessageWrapper_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ClosedGroupCiphertextMessageWrapper_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupCiphertextMessageWrapper.class, org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupCiphertextMessageWrapper.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupCiphertextMessageWrapper.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + ciphertext_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + ephemeralPublicKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ClosedGroupCiphertextMessageWrapper_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupCiphertextMessageWrapper getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupCiphertextMessageWrapper.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupCiphertextMessageWrapper build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupCiphertextMessageWrapper result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupCiphertextMessageWrapper buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupCiphertextMessageWrapper result = new org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupCiphertextMessageWrapper(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.ciphertext_ = ciphertext_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.ephemeralPublicKey_ = ephemeralPublicKey_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupCiphertextMessageWrapper) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupCiphertextMessageWrapper)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupCiphertextMessageWrapper other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupCiphertextMessageWrapper.getDefaultInstance()) return this; + if (other.hasCiphertext()) { + setCiphertext(other.getCiphertext()); + } + if (other.hasEphemeralPublicKey()) { + setEphemeralPublicKey(other.getEphemeralPublicKey()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupCiphertextMessageWrapper parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupCiphertextMessageWrapper) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional bytes ciphertext = 1; + private com.google.protobuf.ByteString ciphertext_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes ciphertext = 1; + * + *
+       * @required
+       * 
+ */ + public boolean hasCiphertext() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes ciphertext = 1; + * + *
+       * @required
+       * 
+ */ + public com.google.protobuf.ByteString getCiphertext() { + return ciphertext_; + } + /** + * optional bytes ciphertext = 1; + * + *
+       * @required
+       * 
+ */ + public Builder setCiphertext(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + ciphertext_ = value; + onChanged(); + return this; + } + /** + * optional bytes ciphertext = 1; + * + *
+       * @required
+       * 
+ */ + public Builder clearCiphertext() { + bitField0_ = (bitField0_ & ~0x00000001); + ciphertext_ = getDefaultInstance().getCiphertext(); + onChanged(); + return this; + } + + // optional bytes ephemeralPublicKey = 2; + private com.google.protobuf.ByteString ephemeralPublicKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes ephemeralPublicKey = 2; + * + *
+       * @required
+       * 
+ */ + public boolean hasEphemeralPublicKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes ephemeralPublicKey = 2; + * + *
+       * @required
+       * 
+ */ + public com.google.protobuf.ByteString getEphemeralPublicKey() { + return ephemeralPublicKey_; + } + /** + * optional bytes ephemeralPublicKey = 2; + * + *
+       * @required
+       * 
+ */ + public Builder setEphemeralPublicKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + ephemeralPublicKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes ephemeralPublicKey = 2; + * + *
+       * @required
+       * 
+ */ + public Builder clearEphemeralPublicKey() { + bitField0_ = (bitField0_ & ~0x00000002); + ephemeralPublicKey_ = getDefaultInstance().getEphemeralPublicKey(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.ClosedGroupCiphertextMessageWrapper) + } + + static { + defaultInstance = new ClosedGroupCiphertextMessageWrapper(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.ClosedGroupCiphertextMessageWrapper) + } + + public interface DataMessageOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional string body = 1; + /** + * optional string body = 1; + */ + boolean hasBody(); + /** + * optional string body = 1; + */ + String getBody(); + /** + * optional string body = 1; + */ + com.google.protobuf.ByteString + getBodyBytes(); + + // repeated .signalservice.AttachmentPointer attachments = 2; + /** + * repeated .signalservice.AttachmentPointer attachments = 2; + */ + java.util.List + getAttachmentsList(); + /** + * repeated .signalservice.AttachmentPointer attachments = 2; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer getAttachments(int index); + /** + * repeated .signalservice.AttachmentPointer attachments = 2; + */ + int getAttachmentsCount(); + /** + * repeated .signalservice.AttachmentPointer attachments = 2; + */ + java.util.List + getAttachmentsOrBuilderList(); + /** + * repeated .signalservice.AttachmentPointer attachments = 2; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder getAttachmentsOrBuilder( + int index); + + // optional .signalservice.GroupContext group = 3; + /** + * optional .signalservice.GroupContext group = 3; + */ + boolean hasGroup(); + /** + * optional .signalservice.GroupContext group = 3; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext getGroup(); + /** + * optional .signalservice.GroupContext group = 3; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContextOrBuilder getGroupOrBuilder(); + + // optional uint32 flags = 4; + /** + * optional uint32 flags = 4; + */ + boolean hasFlags(); + /** + * optional uint32 flags = 4; + */ + int getFlags(); + + // optional uint32 expireTimer = 5; + /** + * optional uint32 expireTimer = 5; + */ + boolean hasExpireTimer(); + /** + * optional uint32 expireTimer = 5; + */ + int getExpireTimer(); + + // optional bytes profileKey = 6; + /** + * optional bytes profileKey = 6; + */ + boolean hasProfileKey(); + /** + * optional bytes profileKey = 6; + */ + com.google.protobuf.ByteString getProfileKey(); + + // optional uint64 timestamp = 7; + /** + * optional uint64 timestamp = 7; + */ + boolean hasTimestamp(); + /** + * optional uint64 timestamp = 7; + */ + long getTimestamp(); + + // optional .signalservice.DataMessage.Quote quote = 8; + /** + * optional .signalservice.DataMessage.Quote quote = 8; + */ + boolean hasQuote(); + /** + * optional .signalservice.DataMessage.Quote quote = 8; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote getQuote(); + /** + * optional .signalservice.DataMessage.Quote quote = 8; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.QuoteOrBuilder getQuoteOrBuilder(); + + // repeated .signalservice.DataMessage.Contact contact = 9; + /** + * repeated .signalservice.DataMessage.Contact contact = 9; + */ + java.util.List + getContactList(); + /** + * repeated .signalservice.DataMessage.Contact contact = 9; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact getContact(int index); + /** + * repeated .signalservice.DataMessage.Contact contact = 9; + */ + int getContactCount(); + /** + * repeated .signalservice.DataMessage.Contact contact = 9; + */ + java.util.List + getContactOrBuilderList(); + /** + * repeated .signalservice.DataMessage.Contact contact = 9; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.ContactOrBuilder getContactOrBuilder( + int index); + + // repeated .signalservice.DataMessage.Preview preview = 10; + /** + * repeated .signalservice.DataMessage.Preview preview = 10; + */ + java.util.List + getPreviewList(); + /** + * repeated .signalservice.DataMessage.Preview preview = 10; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview getPreview(int index); + /** + * repeated .signalservice.DataMessage.Preview preview = 10; + */ + int getPreviewCount(); + /** + * repeated .signalservice.DataMessage.Preview preview = 10; + */ + java.util.List + getPreviewOrBuilderList(); + /** + * repeated .signalservice.DataMessage.Preview preview = 10; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.PreviewOrBuilder getPreviewOrBuilder( + int index); + + // optional .signalservice.DataMessage.Sticker sticker = 11; + /** + * optional .signalservice.DataMessage.Sticker sticker = 11; + */ + boolean hasSticker(); + /** + * optional .signalservice.DataMessage.Sticker sticker = 11; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker getSticker(); + /** + * optional .signalservice.DataMessage.Sticker sticker = 11; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.StickerOrBuilder getStickerOrBuilder(); + + // optional .signalservice.LokiUserProfile profile = 101; + /** + * optional .signalservice.LokiUserProfile profile = 101; + * + *
+     * Loki - The profile of the current user
+     * 
+ */ + boolean hasProfile(); + /** + * optional .signalservice.LokiUserProfile profile = 101; + * + *
+     * Loki - The profile of the current user
+     * 
+ */ + org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile getProfile(); + /** + * optional .signalservice.LokiUserProfile profile = 101; + * + *
+     * Loki - The profile of the current user
+     * 
+ */ + org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfileOrBuilder getProfileOrBuilder(); + + // optional .signalservice.ClosedGroupUpdate closedGroupUpdate = 103; + /** + * optional .signalservice.ClosedGroupUpdate closedGroupUpdate = 103; + * + *
+     * Loki
+     * 
+ */ + boolean hasClosedGroupUpdate(); + /** + * optional .signalservice.ClosedGroupUpdate closedGroupUpdate = 103; + * + *
+     * Loki
+     * 
+ */ + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate getClosedGroupUpdate(); + /** + * optional .signalservice.ClosedGroupUpdate closedGroupUpdate = 103; + * + *
+     * Loki
+     * 
+ */ + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdateOrBuilder getClosedGroupUpdateOrBuilder(); + } + /** + * Protobuf type {@code signalservice.DataMessage} + */ + public static final class DataMessage extends + com.google.protobuf.GeneratedMessage + implements DataMessageOrBuilder { + // Use DataMessage.newBuilder() to construct. + private DataMessage(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private DataMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final DataMessage defaultInstance; + public static DataMessage getDefaultInstance() { + return defaultInstance; + } + + public DataMessage getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private DataMessage( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + body_ = input.readBytes(); + break; + } + case 18: { + if (!((mutable_bitField0_ & 0x00000002) == 0x00000002)) { + attachments_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000002; + } + attachments_.add(input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.PARSER, extensionRegistry)); + break; + } + case 26: { + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.Builder subBuilder = null; + if (((bitField0_ & 0x00000002) == 0x00000002)) { + subBuilder = group_.toBuilder(); + } + group_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(group_); + group_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000002; + break; + } + case 32: { + bitField0_ |= 0x00000004; + flags_ = input.readUInt32(); + break; + } + case 40: { + bitField0_ |= 0x00000008; + expireTimer_ = input.readUInt32(); + break; + } + case 50: { + bitField0_ |= 0x00000010; + profileKey_ = input.readBytes(); + break; + } + case 56: { + bitField0_ |= 0x00000020; + timestamp_ = input.readUInt64(); + break; + } + case 66: { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.Builder subBuilder = null; + if (((bitField0_ & 0x00000040) == 0x00000040)) { + subBuilder = quote_.toBuilder(); + } + quote_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(quote_); + quote_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000040; + break; + } + case 74: { + if (!((mutable_bitField0_ & 0x00000100) == 0x00000100)) { + contact_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000100; + } + contact_.add(input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PARSER, extensionRegistry)); + break; + } + case 82: { + if (!((mutable_bitField0_ & 0x00000200) == 0x00000200)) { + preview_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000200; + } + preview_.add(input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview.PARSER, extensionRegistry)); + break; + } + case 90: { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker.Builder subBuilder = null; + if (((bitField0_ & 0x00000080) == 0x00000080)) { + subBuilder = sticker_.toBuilder(); + } + sticker_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(sticker_); + sticker_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000080; + break; + } + case 810: { + org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile.Builder subBuilder = null; + if (((bitField0_ & 0x00000100) == 0x00000100)) { + subBuilder = profile_.toBuilder(); + } + profile_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(profile_); + profile_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000100; + break; + } + case 826: { + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.Builder subBuilder = null; + if (((bitField0_ & 0x00000200) == 0x00000200)) { + subBuilder = closedGroupUpdate_.toBuilder(); + } + closedGroupUpdate_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(closedGroupUpdate_); + closedGroupUpdate_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000200; + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000002) == 0x00000002)) { + attachments_ = java.util.Collections.unmodifiableList(attachments_); + } + if (((mutable_bitField0_ & 0x00000100) == 0x00000100)) { + contact_ = java.util.Collections.unmodifiableList(contact_); + } + if (((mutable_bitField0_ & 0x00000200) == 0x00000200)) { + preview_ = java.util.Collections.unmodifiableList(preview_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.class, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public DataMessage parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new DataMessage(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + /** + * Protobuf enum {@code signalservice.DataMessage.Flags} + */ + public enum Flags + implements com.google.protobuf.ProtocolMessageEnum { + /** + * END_SESSION = 1; + */ + END_SESSION(0, 1), + /** + * EXPIRATION_TIMER_UPDATE = 2; + */ + EXPIRATION_TIMER_UPDATE(1, 2), + /** + * PROFILE_KEY_UPDATE = 4; + */ + PROFILE_KEY_UPDATE(2, 4), + /** + * DEVICE_UNLINKING_REQUEST = 128; + */ + DEVICE_UNLINKING_REQUEST(3, 128), + ; + + /** + * END_SESSION = 1; + */ + public static final int END_SESSION_VALUE = 1; + /** + * EXPIRATION_TIMER_UPDATE = 2; + */ + public static final int EXPIRATION_TIMER_UPDATE_VALUE = 2; + /** + * PROFILE_KEY_UPDATE = 4; + */ + public static final int PROFILE_KEY_UPDATE_VALUE = 4; + /** + * DEVICE_UNLINKING_REQUEST = 128; + */ + public static final int DEVICE_UNLINKING_REQUEST_VALUE = 128; + + + public final int getNumber() { return value; } + + public static Flags valueOf(int value) { + switch (value) { + case 1: return END_SESSION; + case 2: return EXPIRATION_TIMER_UPDATE; + case 4: return PROFILE_KEY_UPDATE; + case 128: return DEVICE_UNLINKING_REQUEST; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static com.google.protobuf.Internal.EnumLiteMap + internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Flags findValueByNumber(int number) { + return Flags.valueOf(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(index); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.getDescriptor().getEnumTypes().get(0); + } + + private static final Flags[] VALUES = values(); + + public static Flags valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int index; + private final int value; + + private Flags(int index, int value) { + this.index = index; + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:signalservice.DataMessage.Flags) + } + + public interface QuoteOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional uint64 id = 1; + /** + * optional uint64 id = 1; + */ + boolean hasId(); + /** + * optional uint64 id = 1; + */ + long getId(); + + // optional string author = 2; + /** + * optional string author = 2; + */ + boolean hasAuthor(); + /** + * optional string author = 2; + */ + String getAuthor(); + /** + * optional string author = 2; + */ + com.google.protobuf.ByteString + getAuthorBytes(); + + // optional string text = 3; + /** + * optional string text = 3; + */ + boolean hasText(); + /** + * optional string text = 3; + */ + String getText(); + /** + * optional string text = 3; + */ + com.google.protobuf.ByteString + getTextBytes(); + + // repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + /** + * repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + */ + java.util.List + getAttachmentsList(); + /** + * repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment getAttachments(int index); + /** + * repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + */ + int getAttachmentsCount(); + /** + * repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + */ + java.util.List + getAttachmentsOrBuilderList(); + /** + * repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachmentOrBuilder getAttachmentsOrBuilder( + int index); + } + /** + * Protobuf type {@code signalservice.DataMessage.Quote} + */ + public static final class Quote extends + com.google.protobuf.GeneratedMessage + implements QuoteOrBuilder { + // Use Quote.newBuilder() to construct. + private Quote(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Quote(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Quote defaultInstance; + public static Quote getDefaultInstance() { + return defaultInstance; + } + + public Quote getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Quote( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + id_ = input.readUInt64(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + author_ = input.readBytes(); + break; + } + case 26: { + bitField0_ |= 0x00000004; + text_ = input.readBytes(); + break; + } + case 34: { + if (!((mutable_bitField0_ & 0x00000008) == 0x00000008)) { + attachments_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000008; + } + attachments_.add(input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment.PARSER, extensionRegistry)); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000008) == 0x00000008)) { + attachments_ = java.util.Collections.unmodifiableList(attachments_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Quote_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Quote_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.class, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Quote parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Quote(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public interface QuotedAttachmentOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional string contentType = 1; + /** + * optional string contentType = 1; + */ + boolean hasContentType(); + /** + * optional string contentType = 1; + */ + String getContentType(); + /** + * optional string contentType = 1; + */ + com.google.protobuf.ByteString + getContentTypeBytes(); + + // optional string fileName = 2; + /** + * optional string fileName = 2; + */ + boolean hasFileName(); + /** + * optional string fileName = 2; + */ + String getFileName(); + /** + * optional string fileName = 2; + */ + com.google.protobuf.ByteString + getFileNameBytes(); + + // optional .signalservice.AttachmentPointer thumbnail = 3; + /** + * optional .signalservice.AttachmentPointer thumbnail = 3; + */ + boolean hasThumbnail(); + /** + * optional .signalservice.AttachmentPointer thumbnail = 3; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer getThumbnail(); + /** + * optional .signalservice.AttachmentPointer thumbnail = 3; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder getThumbnailOrBuilder(); + } + /** + * Protobuf type {@code signalservice.DataMessage.Quote.QuotedAttachment} + */ + public static final class QuotedAttachment extends + com.google.protobuf.GeneratedMessage + implements QuotedAttachmentOrBuilder { + // Use QuotedAttachment.newBuilder() to construct. + private QuotedAttachment(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private QuotedAttachment(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final QuotedAttachment defaultInstance; + public static QuotedAttachment getDefaultInstance() { + return defaultInstance; + } + + public QuotedAttachment getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private QuotedAttachment( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + contentType_ = input.readBytes(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + fileName_ = input.readBytes(); + break; + } + case 26: { + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder subBuilder = null; + if (((bitField0_ & 0x00000004) == 0x00000004)) { + subBuilder = thumbnail_.toBuilder(); + } + thumbnail_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(thumbnail_); + thumbnail_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000004; + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Quote_QuotedAttachment_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Quote_QuotedAttachment_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment.class, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public QuotedAttachment parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new QuotedAttachment(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional string contentType = 1; + public static final int CONTENTTYPE_FIELD_NUMBER = 1; + private Object contentType_; + /** + * optional string contentType = 1; + */ + public boolean hasContentType() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string contentType = 1; + */ + public String getContentType() { + Object ref = contentType_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + contentType_ = s; + } + return s; + } + } + /** + * optional string contentType = 1; + */ + public com.google.protobuf.ByteString + getContentTypeBytes() { + Object ref = contentType_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + contentType_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional string fileName = 2; + public static final int FILENAME_FIELD_NUMBER = 2; + private Object fileName_; + /** + * optional string fileName = 2; + */ + public boolean hasFileName() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string fileName = 2; + */ + public String getFileName() { + Object ref = fileName_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + fileName_ = s; + } + return s; + } + } + /** + * optional string fileName = 2; + */ + public com.google.protobuf.ByteString + getFileNameBytes() { + Object ref = fileName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + fileName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional .signalservice.AttachmentPointer thumbnail = 3; + public static final int THUMBNAIL_FIELD_NUMBER = 3; + private org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer thumbnail_; + /** + * optional .signalservice.AttachmentPointer thumbnail = 3; + */ + public boolean hasThumbnail() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .signalservice.AttachmentPointer thumbnail = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer getThumbnail() { + return thumbnail_; + } + /** + * optional .signalservice.AttachmentPointer thumbnail = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder getThumbnailOrBuilder() { + return thumbnail_; + } + + private void initFields() { + contentType_ = ""; + fileName_ = ""; + thumbnail_ = org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance(); + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getContentTypeBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, getFileNameBytes()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeMessage(3, thumbnail_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getContentTypeBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, getFileNameBytes()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, thumbnail_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.DataMessage.Quote.QuotedAttachment} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachmentOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Quote_QuotedAttachment_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Quote_QuotedAttachment_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment.class, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getThumbnailFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + contentType_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + fileName_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + if (thumbnailBuilder_ == null) { + thumbnail_ = org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance(); + } else { + thumbnailBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Quote_QuotedAttachment_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment result = new org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.contentType_ = contentType_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.fileName_ = fileName_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + if (thumbnailBuilder_ == null) { + result.thumbnail_ = thumbnail_; + } else { + result.thumbnail_ = thumbnailBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment.getDefaultInstance()) return this; + if (other.hasContentType()) { + bitField0_ |= 0x00000001; + contentType_ = other.contentType_; + onChanged(); + } + if (other.hasFileName()) { + bitField0_ |= 0x00000002; + fileName_ = other.fileName_; + onChanged(); + } + if (other.hasThumbnail()) { + mergeThumbnail(other.getThumbnail()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional string contentType = 1; + private Object contentType_ = ""; + /** + * optional string contentType = 1; + */ + public boolean hasContentType() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string contentType = 1; + */ + public String getContentType() { + Object ref = contentType_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + contentType_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string contentType = 1; + */ + public com.google.protobuf.ByteString + getContentTypeBytes() { + Object ref = contentType_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + contentType_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string contentType = 1; + */ + public Builder setContentType( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + contentType_ = value; + onChanged(); + return this; + } + /** + * optional string contentType = 1; + */ + public Builder clearContentType() { + bitField0_ = (bitField0_ & ~0x00000001); + contentType_ = getDefaultInstance().getContentType(); + onChanged(); + return this; + } + /** + * optional string contentType = 1; + */ + public Builder setContentTypeBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + contentType_ = value; + onChanged(); + return this; + } + + // optional string fileName = 2; + private Object fileName_ = ""; + /** + * optional string fileName = 2; + */ + public boolean hasFileName() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string fileName = 2; + */ + public String getFileName() { + Object ref = fileName_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + fileName_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string fileName = 2; + */ + public com.google.protobuf.ByteString + getFileNameBytes() { + Object ref = fileName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + fileName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string fileName = 2; + */ + public Builder setFileName( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + fileName_ = value; + onChanged(); + return this; + } + /** + * optional string fileName = 2; + */ + public Builder clearFileName() { + bitField0_ = (bitField0_ & ~0x00000002); + fileName_ = getDefaultInstance().getFileName(); + onChanged(); + return this; + } + /** + * optional string fileName = 2; + */ + public Builder setFileNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + fileName_ = value; + onChanged(); + return this; + } + + // optional .signalservice.AttachmentPointer thumbnail = 3; + private org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer thumbnail_ = org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder> thumbnailBuilder_; + /** + * optional .signalservice.AttachmentPointer thumbnail = 3; + */ + public boolean hasThumbnail() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .signalservice.AttachmentPointer thumbnail = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer getThumbnail() { + if (thumbnailBuilder_ == null) { + return thumbnail_; + } else { + return thumbnailBuilder_.getMessage(); + } + } + /** + * optional .signalservice.AttachmentPointer thumbnail = 3; + */ + public Builder setThumbnail(org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer value) { + if (thumbnailBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + thumbnail_ = value; + onChanged(); + } else { + thumbnailBuilder_.setMessage(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .signalservice.AttachmentPointer thumbnail = 3; + */ + public Builder setThumbnail( + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder builderForValue) { + if (thumbnailBuilder_ == null) { + thumbnail_ = builderForValue.build(); + onChanged(); + } else { + thumbnailBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .signalservice.AttachmentPointer thumbnail = 3; + */ + public Builder mergeThumbnail(org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer value) { + if (thumbnailBuilder_ == null) { + if (((bitField0_ & 0x00000004) == 0x00000004) && + thumbnail_ != org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance()) { + thumbnail_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.newBuilder(thumbnail_).mergeFrom(value).buildPartial(); + } else { + thumbnail_ = value; + } + onChanged(); + } else { + thumbnailBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .signalservice.AttachmentPointer thumbnail = 3; + */ + public Builder clearThumbnail() { + if (thumbnailBuilder_ == null) { + thumbnail_ = org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance(); + onChanged(); + } else { + thumbnailBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + /** + * optional .signalservice.AttachmentPointer thumbnail = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder getThumbnailBuilder() { + bitField0_ |= 0x00000004; + onChanged(); + return getThumbnailFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.AttachmentPointer thumbnail = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder getThumbnailOrBuilder() { + if (thumbnailBuilder_ != null) { + return thumbnailBuilder_.getMessageOrBuilder(); + } else { + return thumbnail_; + } + } + /** + * optional .signalservice.AttachmentPointer thumbnail = 3; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder> + getThumbnailFieldBuilder() { + if (thumbnailBuilder_ == null) { + thumbnailBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder>( + thumbnail_, + getParentForChildren(), + isClean()); + thumbnail_ = null; + } + return thumbnailBuilder_; + } + + // @@protoc_insertion_point(builder_scope:signalservice.DataMessage.Quote.QuotedAttachment) + } + + static { + defaultInstance = new QuotedAttachment(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.DataMessage.Quote.QuotedAttachment) + } + + private int bitField0_; + // optional uint64 id = 1; + public static final int ID_FIELD_NUMBER = 1; + private long id_; + /** + * optional uint64 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint64 id = 1; + */ + public long getId() { + return id_; + } + + // optional string author = 2; + public static final int AUTHOR_FIELD_NUMBER = 2; + private Object author_; + /** + * optional string author = 2; + */ + public boolean hasAuthor() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string author = 2; + */ + public String getAuthor() { + Object ref = author_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + author_ = s; + } + return s; + } + } + /** + * optional string author = 2; + */ + public com.google.protobuf.ByteString + getAuthorBytes() { + Object ref = author_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + author_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional string text = 3; + public static final int TEXT_FIELD_NUMBER = 3; + private Object text_; + /** + * optional string text = 3; + */ + public boolean hasText() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional string text = 3; + */ + public String getText() { + Object ref = text_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + text_ = s; + } + return s; + } + } + /** + * optional string text = 3; + */ + public com.google.protobuf.ByteString + getTextBytes() { + Object ref = text_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + text_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + public static final int ATTACHMENTS_FIELD_NUMBER = 4; + private java.util.List attachments_; + /** + * repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + */ + public java.util.List getAttachmentsList() { + return attachments_; + } + /** + * repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + */ + public java.util.List + getAttachmentsOrBuilderList() { + return attachments_; + } + /** + * repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + */ + public int getAttachmentsCount() { + return attachments_.size(); + } + /** + * repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment getAttachments(int index) { + return attachments_.get(index); + } + /** + * repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachmentOrBuilder getAttachmentsOrBuilder( + int index) { + return attachments_.get(index); + } + + private void initFields() { + id_ = 0L; + author_ = ""; + text_ = ""; + attachments_ = java.util.Collections.emptyList(); + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt64(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, getAuthorBytes()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(3, getTextBytes()); + } + for (int i = 0; i < attachments_.size(); i++) { + output.writeMessage(4, attachments_.get(i)); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, getAuthorBytes()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, getTextBytes()); + } + for (int i = 0; i < attachments_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(4, attachments_.get(i)); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.DataMessage.Quote} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.QuoteOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Quote_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Quote_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.class, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getAttachmentsFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + id_ = 0L; + bitField0_ = (bitField0_ & ~0x00000001); + author_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + text_ = ""; + bitField0_ = (bitField0_ & ~0x00000004); + if (attachmentsBuilder_ == null) { + attachments_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000008); + } else { + attachmentsBuilder_.clear(); + } + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Quote_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote result = new org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.id_ = id_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.author_ = author_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.text_ = text_; + if (attachmentsBuilder_ == null) { + if (((bitField0_ & 0x00000008) == 0x00000008)) { + attachments_ = java.util.Collections.unmodifiableList(attachments_); + bitField0_ = (bitField0_ & ~0x00000008); + } + result.attachments_ = attachments_; + } else { + result.attachments_ = attachmentsBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.getDefaultInstance()) return this; + if (other.hasId()) { + setId(other.getId()); + } + if (other.hasAuthor()) { + bitField0_ |= 0x00000002; + author_ = other.author_; + onChanged(); + } + if (other.hasText()) { + bitField0_ |= 0x00000004; + text_ = other.text_; + onChanged(); + } + if (attachmentsBuilder_ == null) { + if (!other.attachments_.isEmpty()) { + if (attachments_.isEmpty()) { + attachments_ = other.attachments_; + bitField0_ = (bitField0_ & ~0x00000008); + } else { + ensureAttachmentsIsMutable(); + attachments_.addAll(other.attachments_); + } + onChanged(); + } + } else { + if (!other.attachments_.isEmpty()) { + if (attachmentsBuilder_.isEmpty()) { + attachmentsBuilder_.dispose(); + attachmentsBuilder_ = null; + attachments_ = other.attachments_; + bitField0_ = (bitField0_ & ~0x00000008); + attachmentsBuilder_ = + com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ? + getAttachmentsFieldBuilder() : null; + } else { + attachmentsBuilder_.addAllMessages(other.attachments_); + } + } + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional uint64 id = 1; + private long id_ ; + /** + * optional uint64 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint64 id = 1; + */ + public long getId() { + return id_; + } + /** + * optional uint64 id = 1; + */ + public Builder setId(long value) { + bitField0_ |= 0x00000001; + id_ = value; + onChanged(); + return this; + } + /** + * optional uint64 id = 1; + */ + public Builder clearId() { + bitField0_ = (bitField0_ & ~0x00000001); + id_ = 0L; + onChanged(); + return this; + } + + // optional string author = 2; + private Object author_ = ""; + /** + * optional string author = 2; + */ + public boolean hasAuthor() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string author = 2; + */ + public String getAuthor() { + Object ref = author_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + author_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string author = 2; + */ + public com.google.protobuf.ByteString + getAuthorBytes() { + Object ref = author_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + author_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string author = 2; + */ + public Builder setAuthor( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + author_ = value; + onChanged(); + return this; + } + /** + * optional string author = 2; + */ + public Builder clearAuthor() { + bitField0_ = (bitField0_ & ~0x00000002); + author_ = getDefaultInstance().getAuthor(); + onChanged(); + return this; + } + /** + * optional string author = 2; + */ + public Builder setAuthorBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + author_ = value; + onChanged(); + return this; + } + + // optional string text = 3; + private Object text_ = ""; + /** + * optional string text = 3; + */ + public boolean hasText() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional string text = 3; + */ + public String getText() { + Object ref = text_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + text_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string text = 3; + */ + public com.google.protobuf.ByteString + getTextBytes() { + Object ref = text_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + text_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string text = 3; + */ + public Builder setText( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + text_ = value; + onChanged(); + return this; + } + /** + * optional string text = 3; + */ + public Builder clearText() { + bitField0_ = (bitField0_ & ~0x00000004); + text_ = getDefaultInstance().getText(); + onChanged(); + return this; + } + /** + * optional string text = 3; + */ + public Builder setTextBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + text_ = value; + onChanged(); + return this; + } + + // repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + private java.util.List attachments_ = + java.util.Collections.emptyList(); + private void ensureAttachmentsIsMutable() { + if (!((bitField0_ & 0x00000008) == 0x00000008)) { + attachments_ = new java.util.ArrayList(attachments_); + bitField0_ |= 0x00000008; + } + } + + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachmentOrBuilder> attachmentsBuilder_; + + /** + * repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + */ + public java.util.List getAttachmentsList() { + if (attachmentsBuilder_ == null) { + return java.util.Collections.unmodifiableList(attachments_); + } else { + return attachmentsBuilder_.getMessageList(); + } + } + /** + * repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + */ + public int getAttachmentsCount() { + if (attachmentsBuilder_ == null) { + return attachments_.size(); + } else { + return attachmentsBuilder_.getCount(); + } + } + /** + * repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment getAttachments(int index) { + if (attachmentsBuilder_ == null) { + return attachments_.get(index); + } else { + return attachmentsBuilder_.getMessage(index); + } + } + /** + * repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + */ + public Builder setAttachments( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment value) { + if (attachmentsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureAttachmentsIsMutable(); + attachments_.set(index, value); + onChanged(); + } else { + attachmentsBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + */ + public Builder setAttachments( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment.Builder builderForValue) { + if (attachmentsBuilder_ == null) { + ensureAttachmentsIsMutable(); + attachments_.set(index, builderForValue.build()); + onChanged(); + } else { + attachmentsBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + */ + public Builder addAttachments(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment value) { + if (attachmentsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureAttachmentsIsMutable(); + attachments_.add(value); + onChanged(); + } else { + attachmentsBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + */ + public Builder addAttachments( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment value) { + if (attachmentsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureAttachmentsIsMutable(); + attachments_.add(index, value); + onChanged(); + } else { + attachmentsBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + */ + public Builder addAttachments( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment.Builder builderForValue) { + if (attachmentsBuilder_ == null) { + ensureAttachmentsIsMutable(); + attachments_.add(builderForValue.build()); + onChanged(); + } else { + attachmentsBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + */ + public Builder addAttachments( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment.Builder builderForValue) { + if (attachmentsBuilder_ == null) { + ensureAttachmentsIsMutable(); + attachments_.add(index, builderForValue.build()); + onChanged(); + } else { + attachmentsBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + */ + public Builder addAllAttachments( + Iterable values) { + if (attachmentsBuilder_ == null) { + ensureAttachmentsIsMutable(); + super.addAll(values, attachments_); + onChanged(); + } else { + attachmentsBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + */ + public Builder clearAttachments() { + if (attachmentsBuilder_ == null) { + attachments_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000008); + onChanged(); + } else { + attachmentsBuilder_.clear(); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + */ + public Builder removeAttachments(int index) { + if (attachmentsBuilder_ == null) { + ensureAttachmentsIsMutable(); + attachments_.remove(index); + onChanged(); + } else { + attachmentsBuilder_.remove(index); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment.Builder getAttachmentsBuilder( + int index) { + return getAttachmentsFieldBuilder().getBuilder(index); + } + /** + * repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachmentOrBuilder getAttachmentsOrBuilder( + int index) { + if (attachmentsBuilder_ == null) { + return attachments_.get(index); } else { + return attachmentsBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + */ + public java.util.List + getAttachmentsOrBuilderList() { + if (attachmentsBuilder_ != null) { + return attachmentsBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(attachments_); + } + } + /** + * repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment.Builder addAttachmentsBuilder() { + return getAttachmentsFieldBuilder().addBuilder( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment.getDefaultInstance()); + } + /** + * repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment.Builder addAttachmentsBuilder( + int index) { + return getAttachmentsFieldBuilder().addBuilder( + index, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment.getDefaultInstance()); + } + /** + * repeated .signalservice.DataMessage.Quote.QuotedAttachment attachments = 4; + */ + public java.util.List + getAttachmentsBuilderList() { + return getAttachmentsFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachmentOrBuilder> + getAttachmentsFieldBuilder() { + if (attachmentsBuilder_ == null) { + attachmentsBuilder_ = new com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachment.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.QuotedAttachmentOrBuilder>( + attachments_, + ((bitField0_ & 0x00000008) == 0x00000008), + getParentForChildren(), + isClean()); + attachments_ = null; + } + return attachmentsBuilder_; + } + + // @@protoc_insertion_point(builder_scope:signalservice.DataMessage.Quote) + } + + static { + defaultInstance = new Quote(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.DataMessage.Quote) + } + + public interface ContactOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional .signalservice.DataMessage.Contact.Name name = 1; + /** + * optional .signalservice.DataMessage.Contact.Name name = 1; + */ + boolean hasName(); + /** + * optional .signalservice.DataMessage.Contact.Name name = 1; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name getName(); + /** + * optional .signalservice.DataMessage.Contact.Name name = 1; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.NameOrBuilder getNameOrBuilder(); + + // repeated .signalservice.DataMessage.Contact.Phone number = 3; + /** + * repeated .signalservice.DataMessage.Contact.Phone number = 3; + */ + java.util.List + getNumberList(); + /** + * repeated .signalservice.DataMessage.Contact.Phone number = 3; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone getNumber(int index); + /** + * repeated .signalservice.DataMessage.Contact.Phone number = 3; + */ + int getNumberCount(); + /** + * repeated .signalservice.DataMessage.Contact.Phone number = 3; + */ + java.util.List + getNumberOrBuilderList(); + /** + * repeated .signalservice.DataMessage.Contact.Phone number = 3; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PhoneOrBuilder getNumberOrBuilder( + int index); + + // repeated .signalservice.DataMessage.Contact.Email email = 4; + /** + * repeated .signalservice.DataMessage.Contact.Email email = 4; + */ + java.util.List + getEmailList(); + /** + * repeated .signalservice.DataMessage.Contact.Email email = 4; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email getEmail(int index); + /** + * repeated .signalservice.DataMessage.Contact.Email email = 4; + */ + int getEmailCount(); + /** + * repeated .signalservice.DataMessage.Contact.Email email = 4; + */ + java.util.List + getEmailOrBuilderList(); + /** + * repeated .signalservice.DataMessage.Contact.Email email = 4; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.EmailOrBuilder getEmailOrBuilder( + int index); + + // repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + /** + * repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + */ + java.util.List + getAddressList(); + /** + * repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress getAddress(int index); + /** + * repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + */ + int getAddressCount(); + /** + * repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + */ + java.util.List + getAddressOrBuilderList(); + /** + * repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddressOrBuilder getAddressOrBuilder( + int index); + + // optional .signalservice.DataMessage.Contact.Avatar avatar = 6; + /** + * optional .signalservice.DataMessage.Contact.Avatar avatar = 6; + */ + boolean hasAvatar(); + /** + * optional .signalservice.DataMessage.Contact.Avatar avatar = 6; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar getAvatar(); + /** + * optional .signalservice.DataMessage.Contact.Avatar avatar = 6; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.AvatarOrBuilder getAvatarOrBuilder(); + + // optional string organization = 7; + /** + * optional string organization = 7; + */ + boolean hasOrganization(); + /** + * optional string organization = 7; + */ + String getOrganization(); + /** + * optional string organization = 7; + */ + com.google.protobuf.ByteString + getOrganizationBytes(); + } + /** + * Protobuf type {@code signalservice.DataMessage.Contact} + */ + public static final class Contact extends + com.google.protobuf.GeneratedMessage + implements ContactOrBuilder { + // Use Contact.newBuilder() to construct. + private Contact(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Contact(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Contact defaultInstance; + public static Contact getDefaultInstance() { + return defaultInstance; + } + + public Contact getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Contact( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name.Builder subBuilder = null; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + subBuilder = name_.toBuilder(); + } + name_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(name_); + name_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000001; + break; + } + case 26: { + if (!((mutable_bitField0_ & 0x00000002) == 0x00000002)) { + number_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000002; + } + number_.add(input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.PARSER, extensionRegistry)); + break; + } + case 34: { + if (!((mutable_bitField0_ & 0x00000004) == 0x00000004)) { + email_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000004; + } + email_.add(input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.PARSER, extensionRegistry)); + break; + } + case 42: { + if (!((mutable_bitField0_ & 0x00000008) == 0x00000008)) { + address_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000008; + } + address_.add(input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.PARSER, extensionRegistry)); + break; + } + case 50: { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar.Builder subBuilder = null; + if (((bitField0_ & 0x00000002) == 0x00000002)) { + subBuilder = avatar_.toBuilder(); + } + avatar_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(avatar_); + avatar_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000002; + break; + } + case 58: { + bitField0_ |= 0x00000004; + organization_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000002) == 0x00000002)) { + number_ = java.util.Collections.unmodifiableList(number_); + } + if (((mutable_bitField0_ & 0x00000004) == 0x00000004)) { + email_ = java.util.Collections.unmodifiableList(email_); + } + if (((mutable_bitField0_ & 0x00000008) == 0x00000008)) { + address_ = java.util.Collections.unmodifiableList(address_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Contact_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Contact_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.class, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Contact parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Contact(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public interface NameOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional string givenName = 1; + /** + * optional string givenName = 1; + */ + boolean hasGivenName(); + /** + * optional string givenName = 1; + */ + String getGivenName(); + /** + * optional string givenName = 1; + */ + com.google.protobuf.ByteString + getGivenNameBytes(); + + // optional string familyName = 2; + /** + * optional string familyName = 2; + */ + boolean hasFamilyName(); + /** + * optional string familyName = 2; + */ + String getFamilyName(); + /** + * optional string familyName = 2; + */ + com.google.protobuf.ByteString + getFamilyNameBytes(); + + // optional string prefix = 3; + /** + * optional string prefix = 3; + */ + boolean hasPrefix(); + /** + * optional string prefix = 3; + */ + String getPrefix(); + /** + * optional string prefix = 3; + */ + com.google.protobuf.ByteString + getPrefixBytes(); + + // optional string suffix = 4; + /** + * optional string suffix = 4; + */ + boolean hasSuffix(); + /** + * optional string suffix = 4; + */ + String getSuffix(); + /** + * optional string suffix = 4; + */ + com.google.protobuf.ByteString + getSuffixBytes(); + + // optional string middleName = 5; + /** + * optional string middleName = 5; + */ + boolean hasMiddleName(); + /** + * optional string middleName = 5; + */ + String getMiddleName(); + /** + * optional string middleName = 5; + */ + com.google.protobuf.ByteString + getMiddleNameBytes(); + + // optional string displayName = 6; + /** + * optional string displayName = 6; + */ + boolean hasDisplayName(); + /** + * optional string displayName = 6; + */ + String getDisplayName(); + /** + * optional string displayName = 6; + */ + com.google.protobuf.ByteString + getDisplayNameBytes(); + } + /** + * Protobuf type {@code signalservice.DataMessage.Contact.Name} + */ + public static final class Name extends + com.google.protobuf.GeneratedMessage + implements NameOrBuilder { + // Use Name.newBuilder() to construct. + private Name(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Name(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Name defaultInstance; + public static Name getDefaultInstance() { + return defaultInstance; + } + + public Name getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Name( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + givenName_ = input.readBytes(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + familyName_ = input.readBytes(); + break; + } + case 26: { + bitField0_ |= 0x00000004; + prefix_ = input.readBytes(); + break; + } + case 34: { + bitField0_ |= 0x00000008; + suffix_ = input.readBytes(); + break; + } + case 42: { + bitField0_ |= 0x00000010; + middleName_ = input.readBytes(); + break; + } + case 50: { + bitField0_ |= 0x00000020; + displayName_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Contact_Name_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Contact_Name_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name.class, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Name parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Name(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional string givenName = 1; + public static final int GIVENNAME_FIELD_NUMBER = 1; + private Object givenName_; + /** + * optional string givenName = 1; + */ + public boolean hasGivenName() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string givenName = 1; + */ + public String getGivenName() { + Object ref = givenName_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + givenName_ = s; + } + return s; + } + } + /** + * optional string givenName = 1; + */ + public com.google.protobuf.ByteString + getGivenNameBytes() { + Object ref = givenName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + givenName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional string familyName = 2; + public static final int FAMILYNAME_FIELD_NUMBER = 2; + private Object familyName_; + /** + * optional string familyName = 2; + */ + public boolean hasFamilyName() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string familyName = 2; + */ + public String getFamilyName() { + Object ref = familyName_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + familyName_ = s; + } + return s; + } + } + /** + * optional string familyName = 2; + */ + public com.google.protobuf.ByteString + getFamilyNameBytes() { + Object ref = familyName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + familyName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional string prefix = 3; + public static final int PREFIX_FIELD_NUMBER = 3; + private Object prefix_; + /** + * optional string prefix = 3; + */ + public boolean hasPrefix() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional string prefix = 3; + */ + public String getPrefix() { + Object ref = prefix_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + prefix_ = s; + } + return s; + } + } + /** + * optional string prefix = 3; + */ + public com.google.protobuf.ByteString + getPrefixBytes() { + Object ref = prefix_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + prefix_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional string suffix = 4; + public static final int SUFFIX_FIELD_NUMBER = 4; + private Object suffix_; + /** + * optional string suffix = 4; + */ + public boolean hasSuffix() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional string suffix = 4; + */ + public String getSuffix() { + Object ref = suffix_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + suffix_ = s; + } + return s; + } + } + /** + * optional string suffix = 4; + */ + public com.google.protobuf.ByteString + getSuffixBytes() { + Object ref = suffix_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + suffix_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional string middleName = 5; + public static final int MIDDLENAME_FIELD_NUMBER = 5; + private Object middleName_; + /** + * optional string middleName = 5; + */ + public boolean hasMiddleName() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional string middleName = 5; + */ + public String getMiddleName() { + Object ref = middleName_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + middleName_ = s; + } + return s; + } + } + /** + * optional string middleName = 5; + */ + public com.google.protobuf.ByteString + getMiddleNameBytes() { + Object ref = middleName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + middleName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional string displayName = 6; + public static final int DISPLAYNAME_FIELD_NUMBER = 6; + private Object displayName_; + /** + * optional string displayName = 6; + */ + public boolean hasDisplayName() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional string displayName = 6; + */ + public String getDisplayName() { + Object ref = displayName_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + displayName_ = s; + } + return s; + } + } + /** + * optional string displayName = 6; + */ + public com.google.protobuf.ByteString + getDisplayNameBytes() { + Object ref = displayName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + displayName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private void initFields() { + givenName_ = ""; + familyName_ = ""; + prefix_ = ""; + suffix_ = ""; + middleName_ = ""; + displayName_ = ""; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getGivenNameBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, getFamilyNameBytes()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(3, getPrefixBytes()); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeBytes(4, getSuffixBytes()); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + output.writeBytes(5, getMiddleNameBytes()); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + output.writeBytes(6, getDisplayNameBytes()); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getGivenNameBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, getFamilyNameBytes()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, getPrefixBytes()); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(4, getSuffixBytes()); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(5, getMiddleNameBytes()); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(6, getDisplayNameBytes()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.DataMessage.Contact.Name} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.NameOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Contact_Name_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Contact_Name_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name.class, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + givenName_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + familyName_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + prefix_ = ""; + bitField0_ = (bitField0_ & ~0x00000004); + suffix_ = ""; + bitField0_ = (bitField0_ & ~0x00000008); + middleName_ = ""; + bitField0_ = (bitField0_ & ~0x00000010); + displayName_ = ""; + bitField0_ = (bitField0_ & ~0x00000020); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Contact_Name_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name result = new org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.givenName_ = givenName_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.familyName_ = familyName_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.prefix_ = prefix_; + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000008; + } + result.suffix_ = suffix_; + if (((from_bitField0_ & 0x00000010) == 0x00000010)) { + to_bitField0_ |= 0x00000010; + } + result.middleName_ = middleName_; + if (((from_bitField0_ & 0x00000020) == 0x00000020)) { + to_bitField0_ |= 0x00000020; + } + result.displayName_ = displayName_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name.getDefaultInstance()) return this; + if (other.hasGivenName()) { + bitField0_ |= 0x00000001; + givenName_ = other.givenName_; + onChanged(); + } + if (other.hasFamilyName()) { + bitField0_ |= 0x00000002; + familyName_ = other.familyName_; + onChanged(); + } + if (other.hasPrefix()) { + bitField0_ |= 0x00000004; + prefix_ = other.prefix_; + onChanged(); + } + if (other.hasSuffix()) { + bitField0_ |= 0x00000008; + suffix_ = other.suffix_; + onChanged(); + } + if (other.hasMiddleName()) { + bitField0_ |= 0x00000010; + middleName_ = other.middleName_; + onChanged(); + } + if (other.hasDisplayName()) { + bitField0_ |= 0x00000020; + displayName_ = other.displayName_; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional string givenName = 1; + private Object givenName_ = ""; + /** + * optional string givenName = 1; + */ + public boolean hasGivenName() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string givenName = 1; + */ + public String getGivenName() { + Object ref = givenName_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + givenName_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string givenName = 1; + */ + public com.google.protobuf.ByteString + getGivenNameBytes() { + Object ref = givenName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + givenName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string givenName = 1; + */ + public Builder setGivenName( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + givenName_ = value; + onChanged(); + return this; + } + /** + * optional string givenName = 1; + */ + public Builder clearGivenName() { + bitField0_ = (bitField0_ & ~0x00000001); + givenName_ = getDefaultInstance().getGivenName(); + onChanged(); + return this; + } + /** + * optional string givenName = 1; + */ + public Builder setGivenNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + givenName_ = value; + onChanged(); + return this; + } + + // optional string familyName = 2; + private Object familyName_ = ""; + /** + * optional string familyName = 2; + */ + public boolean hasFamilyName() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string familyName = 2; + */ + public String getFamilyName() { + Object ref = familyName_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + familyName_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string familyName = 2; + */ + public com.google.protobuf.ByteString + getFamilyNameBytes() { + Object ref = familyName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + familyName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string familyName = 2; + */ + public Builder setFamilyName( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + familyName_ = value; + onChanged(); + return this; + } + /** + * optional string familyName = 2; + */ + public Builder clearFamilyName() { + bitField0_ = (bitField0_ & ~0x00000002); + familyName_ = getDefaultInstance().getFamilyName(); + onChanged(); + return this; + } + /** + * optional string familyName = 2; + */ + public Builder setFamilyNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + familyName_ = value; + onChanged(); + return this; + } + + // optional string prefix = 3; + private Object prefix_ = ""; + /** + * optional string prefix = 3; + */ + public boolean hasPrefix() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional string prefix = 3; + */ + public String getPrefix() { + Object ref = prefix_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + prefix_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string prefix = 3; + */ + public com.google.protobuf.ByteString + getPrefixBytes() { + Object ref = prefix_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + prefix_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string prefix = 3; + */ + public Builder setPrefix( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + prefix_ = value; + onChanged(); + return this; + } + /** + * optional string prefix = 3; + */ + public Builder clearPrefix() { + bitField0_ = (bitField0_ & ~0x00000004); + prefix_ = getDefaultInstance().getPrefix(); + onChanged(); + return this; + } + /** + * optional string prefix = 3; + */ + public Builder setPrefixBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + prefix_ = value; + onChanged(); + return this; + } + + // optional string suffix = 4; + private Object suffix_ = ""; + /** + * optional string suffix = 4; + */ + public boolean hasSuffix() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional string suffix = 4; + */ + public String getSuffix() { + Object ref = suffix_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + suffix_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string suffix = 4; + */ + public com.google.protobuf.ByteString + getSuffixBytes() { + Object ref = suffix_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + suffix_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string suffix = 4; + */ + public Builder setSuffix( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + suffix_ = value; + onChanged(); + return this; + } + /** + * optional string suffix = 4; + */ + public Builder clearSuffix() { + bitField0_ = (bitField0_ & ~0x00000008); + suffix_ = getDefaultInstance().getSuffix(); + onChanged(); + return this; + } + /** + * optional string suffix = 4; + */ + public Builder setSuffixBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + suffix_ = value; + onChanged(); + return this; + } + + // optional string middleName = 5; + private Object middleName_ = ""; + /** + * optional string middleName = 5; + */ + public boolean hasMiddleName() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional string middleName = 5; + */ + public String getMiddleName() { + Object ref = middleName_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + middleName_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string middleName = 5; + */ + public com.google.protobuf.ByteString + getMiddleNameBytes() { + Object ref = middleName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + middleName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string middleName = 5; + */ + public Builder setMiddleName( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000010; + middleName_ = value; + onChanged(); + return this; + } + /** + * optional string middleName = 5; + */ + public Builder clearMiddleName() { + bitField0_ = (bitField0_ & ~0x00000010); + middleName_ = getDefaultInstance().getMiddleName(); + onChanged(); + return this; + } + /** + * optional string middleName = 5; + */ + public Builder setMiddleNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000010; + middleName_ = value; + onChanged(); + return this; + } + + // optional string displayName = 6; + private Object displayName_ = ""; + /** + * optional string displayName = 6; + */ + public boolean hasDisplayName() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional string displayName = 6; + */ + public String getDisplayName() { + Object ref = displayName_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + displayName_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string displayName = 6; + */ + public com.google.protobuf.ByteString + getDisplayNameBytes() { + Object ref = displayName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + displayName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string displayName = 6; + */ + public Builder setDisplayName( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000020; + displayName_ = value; + onChanged(); + return this; + } + /** + * optional string displayName = 6; + */ + public Builder clearDisplayName() { + bitField0_ = (bitField0_ & ~0x00000020); + displayName_ = getDefaultInstance().getDisplayName(); + onChanged(); + return this; + } + /** + * optional string displayName = 6; + */ + public Builder setDisplayNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000020; + displayName_ = value; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.DataMessage.Contact.Name) + } + + static { + defaultInstance = new Name(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.DataMessage.Contact.Name) + } + + public interface PhoneOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional string value = 1; + /** + * optional string value = 1; + */ + boolean hasValue(); + /** + * optional string value = 1; + */ + String getValue(); + /** + * optional string value = 1; + */ + com.google.protobuf.ByteString + getValueBytes(); + + // optional .signalservice.DataMessage.Contact.Phone.Type type = 2; + /** + * optional .signalservice.DataMessage.Contact.Phone.Type type = 2; + */ + boolean hasType(); + /** + * optional .signalservice.DataMessage.Contact.Phone.Type type = 2; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.Type getType(); + + // optional string label = 3; + /** + * optional string label = 3; + */ + boolean hasLabel(); + /** + * optional string label = 3; + */ + String getLabel(); + /** + * optional string label = 3; + */ + com.google.protobuf.ByteString + getLabelBytes(); + } + /** + * Protobuf type {@code signalservice.DataMessage.Contact.Phone} + */ + public static final class Phone extends + com.google.protobuf.GeneratedMessage + implements PhoneOrBuilder { + // Use Phone.newBuilder() to construct. + private Phone(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Phone(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Phone defaultInstance; + public static Phone getDefaultInstance() { + return defaultInstance; + } + + public Phone getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Phone( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + value_ = input.readBytes(); + break; + } + case 16: { + int rawValue = input.readEnum(); + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.Type value = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.Type.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(2, rawValue); + } else { + bitField0_ |= 0x00000002; + type_ = value; + } + break; + } + case 26: { + bitField0_ |= 0x00000004; + label_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Contact_Phone_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Contact_Phone_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.class, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Phone parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Phone(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + /** + * Protobuf enum {@code signalservice.DataMessage.Contact.Phone.Type} + */ + public enum Type + implements com.google.protobuf.ProtocolMessageEnum { + /** + * HOME = 1; + */ + HOME(0, 1), + /** + * MOBILE = 2; + */ + MOBILE(1, 2), + /** + * WORK = 3; + */ + WORK(2, 3), + /** + * CUSTOM = 4; + */ + CUSTOM(3, 4), + ; + + /** + * HOME = 1; + */ + public static final int HOME_VALUE = 1; + /** + * MOBILE = 2; + */ + public static final int MOBILE_VALUE = 2; + /** + * WORK = 3; + */ + public static final int WORK_VALUE = 3; + /** + * CUSTOM = 4; + */ + public static final int CUSTOM_VALUE = 4; + + + public final int getNumber() { return value; } + + public static Type valueOf(int value) { + switch (value) { + case 1: return HOME; + case 2: return MOBILE; + case 3: return WORK; + case 4: return CUSTOM; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static com.google.protobuf.Internal.EnumLiteMap + internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Type findValueByNumber(int number) { + return Type.valueOf(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(index); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.getDescriptor().getEnumTypes().get(0); + } + + private static final Type[] VALUES = values(); + + public static Type valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int index; + private final int value; + + private Type(int index, int value) { + this.index = index; + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:signalservice.DataMessage.Contact.Phone.Type) + } + + private int bitField0_; + // optional string value = 1; + public static final int VALUE_FIELD_NUMBER = 1; + private Object value_; + /** + * optional string value = 1; + */ + public boolean hasValue() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string value = 1; + */ + public String getValue() { + Object ref = value_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + value_ = s; + } + return s; + } + } + /** + * optional string value = 1; + */ + public com.google.protobuf.ByteString + getValueBytes() { + Object ref = value_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + value_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional .signalservice.DataMessage.Contact.Phone.Type type = 2; + public static final int TYPE_FIELD_NUMBER = 2; + private org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.Type type_; + /** + * optional .signalservice.DataMessage.Contact.Phone.Type type = 2; + */ + public boolean hasType() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .signalservice.DataMessage.Contact.Phone.Type type = 2; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.Type getType() { + return type_; + } + + // optional string label = 3; + public static final int LABEL_FIELD_NUMBER = 3; + private Object label_; + /** + * optional string label = 3; + */ + public boolean hasLabel() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional string label = 3; + */ + public String getLabel() { + Object ref = label_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + label_ = s; + } + return s; + } + } + /** + * optional string label = 3; + */ + public com.google.protobuf.ByteString + getLabelBytes() { + Object ref = label_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + label_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private void initFields() { + value_ = ""; + type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.Type.HOME; + label_ = ""; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getValueBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeEnum(2, type_.getNumber()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(3, getLabelBytes()); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getValueBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(2, type_.getNumber()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, getLabelBytes()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.DataMessage.Contact.Phone} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PhoneOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Contact_Phone_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Contact_Phone_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.class, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + value_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.Type.HOME; + bitField0_ = (bitField0_ & ~0x00000002); + label_ = ""; + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Contact_Phone_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone result = new org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.value_ = value_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.type_ = type_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.label_ = label_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.getDefaultInstance()) return this; + if (other.hasValue()) { + bitField0_ |= 0x00000001; + value_ = other.value_; + onChanged(); + } + if (other.hasType()) { + setType(other.getType()); + } + if (other.hasLabel()) { + bitField0_ |= 0x00000004; + label_ = other.label_; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional string value = 1; + private Object value_ = ""; + /** + * optional string value = 1; + */ + public boolean hasValue() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string value = 1; + */ + public String getValue() { + Object ref = value_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + value_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string value = 1; + */ + public com.google.protobuf.ByteString + getValueBytes() { + Object ref = value_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + value_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string value = 1; + */ + public Builder setValue( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + value_ = value; + onChanged(); + return this; + } + /** + * optional string value = 1; + */ + public Builder clearValue() { + bitField0_ = (bitField0_ & ~0x00000001); + value_ = getDefaultInstance().getValue(); + onChanged(); + return this; + } + /** + * optional string value = 1; + */ + public Builder setValueBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + value_ = value; + onChanged(); + return this; + } + + // optional .signalservice.DataMessage.Contact.Phone.Type type = 2; + private org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.Type type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.Type.HOME; + /** + * optional .signalservice.DataMessage.Contact.Phone.Type type = 2; + */ + public boolean hasType() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .signalservice.DataMessage.Contact.Phone.Type type = 2; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.Type getType() { + return type_; + } + /** + * optional .signalservice.DataMessage.Contact.Phone.Type type = 2; + */ + public Builder setType(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.Type value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + type_ = value; + onChanged(); + return this; + } + /** + * optional .signalservice.DataMessage.Contact.Phone.Type type = 2; + */ + public Builder clearType() { + bitField0_ = (bitField0_ & ~0x00000002); + type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.Type.HOME; + onChanged(); + return this; + } + + // optional string label = 3; + private Object label_ = ""; + /** + * optional string label = 3; + */ + public boolean hasLabel() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional string label = 3; + */ + public String getLabel() { + Object ref = label_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + label_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string label = 3; + */ + public com.google.protobuf.ByteString + getLabelBytes() { + Object ref = label_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + label_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string label = 3; + */ + public Builder setLabel( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + label_ = value; + onChanged(); + return this; + } + /** + * optional string label = 3; + */ + public Builder clearLabel() { + bitField0_ = (bitField0_ & ~0x00000004); + label_ = getDefaultInstance().getLabel(); + onChanged(); + return this; + } + /** + * optional string label = 3; + */ + public Builder setLabelBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + label_ = value; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.DataMessage.Contact.Phone) + } + + static { + defaultInstance = new Phone(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.DataMessage.Contact.Phone) + } + + public interface EmailOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional string value = 1; + /** + * optional string value = 1; + */ + boolean hasValue(); + /** + * optional string value = 1; + */ + String getValue(); + /** + * optional string value = 1; + */ + com.google.protobuf.ByteString + getValueBytes(); + + // optional .signalservice.DataMessage.Contact.Email.Type type = 2; + /** + * optional .signalservice.DataMessage.Contact.Email.Type type = 2; + */ + boolean hasType(); + /** + * optional .signalservice.DataMessage.Contact.Email.Type type = 2; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.Type getType(); + + // optional string label = 3; + /** + * optional string label = 3; + */ + boolean hasLabel(); + /** + * optional string label = 3; + */ + String getLabel(); + /** + * optional string label = 3; + */ + com.google.protobuf.ByteString + getLabelBytes(); + } + /** + * Protobuf type {@code signalservice.DataMessage.Contact.Email} + */ + public static final class Email extends + com.google.protobuf.GeneratedMessage + implements EmailOrBuilder { + // Use Email.newBuilder() to construct. + private Email(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Email(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Email defaultInstance; + public static Email getDefaultInstance() { + return defaultInstance; + } + + public Email getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Email( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + value_ = input.readBytes(); + break; + } + case 16: { + int rawValue = input.readEnum(); + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.Type value = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.Type.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(2, rawValue); + } else { + bitField0_ |= 0x00000002; + type_ = value; + } + break; + } + case 26: { + bitField0_ |= 0x00000004; + label_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Contact_Email_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Contact_Email_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.class, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Email parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Email(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + /** + * Protobuf enum {@code signalservice.DataMessage.Contact.Email.Type} + */ + public enum Type + implements com.google.protobuf.ProtocolMessageEnum { + /** + * HOME = 1; + */ + HOME(0, 1), + /** + * MOBILE = 2; + */ + MOBILE(1, 2), + /** + * WORK = 3; + */ + WORK(2, 3), + /** + * CUSTOM = 4; + */ + CUSTOM(3, 4), + ; + + /** + * HOME = 1; + */ + public static final int HOME_VALUE = 1; + /** + * MOBILE = 2; + */ + public static final int MOBILE_VALUE = 2; + /** + * WORK = 3; + */ + public static final int WORK_VALUE = 3; + /** + * CUSTOM = 4; + */ + public static final int CUSTOM_VALUE = 4; + + + public final int getNumber() { return value; } + + public static Type valueOf(int value) { + switch (value) { + case 1: return HOME; + case 2: return MOBILE; + case 3: return WORK; + case 4: return CUSTOM; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static com.google.protobuf.Internal.EnumLiteMap + internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Type findValueByNumber(int number) { + return Type.valueOf(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(index); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.getDescriptor().getEnumTypes().get(0); + } + + private static final Type[] VALUES = values(); + + public static Type valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int index; + private final int value; + + private Type(int index, int value) { + this.index = index; + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:signalservice.DataMessage.Contact.Email.Type) + } + + private int bitField0_; + // optional string value = 1; + public static final int VALUE_FIELD_NUMBER = 1; + private Object value_; + /** + * optional string value = 1; + */ + public boolean hasValue() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string value = 1; + */ + public String getValue() { + Object ref = value_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + value_ = s; + } + return s; + } + } + /** + * optional string value = 1; + */ + public com.google.protobuf.ByteString + getValueBytes() { + Object ref = value_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + value_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional .signalservice.DataMessage.Contact.Email.Type type = 2; + public static final int TYPE_FIELD_NUMBER = 2; + private org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.Type type_; + /** + * optional .signalservice.DataMessage.Contact.Email.Type type = 2; + */ + public boolean hasType() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .signalservice.DataMessage.Contact.Email.Type type = 2; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.Type getType() { + return type_; + } + + // optional string label = 3; + public static final int LABEL_FIELD_NUMBER = 3; + private Object label_; + /** + * optional string label = 3; + */ + public boolean hasLabel() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional string label = 3; + */ + public String getLabel() { + Object ref = label_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + label_ = s; + } + return s; + } + } + /** + * optional string label = 3; + */ + public com.google.protobuf.ByteString + getLabelBytes() { + Object ref = label_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + label_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private void initFields() { + value_ = ""; + type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.Type.HOME; + label_ = ""; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getValueBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeEnum(2, type_.getNumber()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(3, getLabelBytes()); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getValueBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(2, type_.getNumber()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, getLabelBytes()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.DataMessage.Contact.Email} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.EmailOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Contact_Email_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Contact_Email_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.class, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + value_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.Type.HOME; + bitField0_ = (bitField0_ & ~0x00000002); + label_ = ""; + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Contact_Email_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email result = new org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.value_ = value_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.type_ = type_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.label_ = label_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.getDefaultInstance()) return this; + if (other.hasValue()) { + bitField0_ |= 0x00000001; + value_ = other.value_; + onChanged(); + } + if (other.hasType()) { + setType(other.getType()); + } + if (other.hasLabel()) { + bitField0_ |= 0x00000004; + label_ = other.label_; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional string value = 1; + private Object value_ = ""; + /** + * optional string value = 1; + */ + public boolean hasValue() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string value = 1; + */ + public String getValue() { + Object ref = value_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + value_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string value = 1; + */ + public com.google.protobuf.ByteString + getValueBytes() { + Object ref = value_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + value_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string value = 1; + */ + public Builder setValue( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + value_ = value; + onChanged(); + return this; + } + /** + * optional string value = 1; + */ + public Builder clearValue() { + bitField0_ = (bitField0_ & ~0x00000001); + value_ = getDefaultInstance().getValue(); + onChanged(); + return this; + } + /** + * optional string value = 1; + */ + public Builder setValueBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + value_ = value; + onChanged(); + return this; + } + + // optional .signalservice.DataMessage.Contact.Email.Type type = 2; + private org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.Type type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.Type.HOME; + /** + * optional .signalservice.DataMessage.Contact.Email.Type type = 2; + */ + public boolean hasType() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .signalservice.DataMessage.Contact.Email.Type type = 2; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.Type getType() { + return type_; + } + /** + * optional .signalservice.DataMessage.Contact.Email.Type type = 2; + */ + public Builder setType(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.Type value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + type_ = value; + onChanged(); + return this; + } + /** + * optional .signalservice.DataMessage.Contact.Email.Type type = 2; + */ + public Builder clearType() { + bitField0_ = (bitField0_ & ~0x00000002); + type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.Type.HOME; + onChanged(); + return this; + } + + // optional string label = 3; + private Object label_ = ""; + /** + * optional string label = 3; + */ + public boolean hasLabel() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional string label = 3; + */ + public String getLabel() { + Object ref = label_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + label_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string label = 3; + */ + public com.google.protobuf.ByteString + getLabelBytes() { + Object ref = label_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + label_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string label = 3; + */ + public Builder setLabel( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + label_ = value; + onChanged(); + return this; + } + /** + * optional string label = 3; + */ + public Builder clearLabel() { + bitField0_ = (bitField0_ & ~0x00000004); + label_ = getDefaultInstance().getLabel(); + onChanged(); + return this; + } + /** + * optional string label = 3; + */ + public Builder setLabelBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + label_ = value; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.DataMessage.Contact.Email) + } + + static { + defaultInstance = new Email(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.DataMessage.Contact.Email) + } + + public interface PostalAddressOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional .signalservice.DataMessage.Contact.PostalAddress.Type type = 1; + /** + * optional .signalservice.DataMessage.Contact.PostalAddress.Type type = 1; + */ + boolean hasType(); + /** + * optional .signalservice.DataMessage.Contact.PostalAddress.Type type = 1; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.Type getType(); + + // optional string label = 2; + /** + * optional string label = 2; + */ + boolean hasLabel(); + /** + * optional string label = 2; + */ + String getLabel(); + /** + * optional string label = 2; + */ + com.google.protobuf.ByteString + getLabelBytes(); + + // optional string street = 3; + /** + * optional string street = 3; + */ + boolean hasStreet(); + /** + * optional string street = 3; + */ + String getStreet(); + /** + * optional string street = 3; + */ + com.google.protobuf.ByteString + getStreetBytes(); + + // optional string pobox = 4; + /** + * optional string pobox = 4; + */ + boolean hasPobox(); + /** + * optional string pobox = 4; + */ + String getPobox(); + /** + * optional string pobox = 4; + */ + com.google.protobuf.ByteString + getPoboxBytes(); + + // optional string neighborhood = 5; + /** + * optional string neighborhood = 5; + */ + boolean hasNeighborhood(); + /** + * optional string neighborhood = 5; + */ + String getNeighborhood(); + /** + * optional string neighborhood = 5; + */ + com.google.protobuf.ByteString + getNeighborhoodBytes(); + + // optional string city = 6; + /** + * optional string city = 6; + */ + boolean hasCity(); + /** + * optional string city = 6; + */ + String getCity(); + /** + * optional string city = 6; + */ + com.google.protobuf.ByteString + getCityBytes(); + + // optional string region = 7; + /** + * optional string region = 7; + */ + boolean hasRegion(); + /** + * optional string region = 7; + */ + String getRegion(); + /** + * optional string region = 7; + */ + com.google.protobuf.ByteString + getRegionBytes(); + + // optional string postcode = 8; + /** + * optional string postcode = 8; + */ + boolean hasPostcode(); + /** + * optional string postcode = 8; + */ + String getPostcode(); + /** + * optional string postcode = 8; + */ + com.google.protobuf.ByteString + getPostcodeBytes(); + + // optional string country = 9; + /** + * optional string country = 9; + */ + boolean hasCountry(); + /** + * optional string country = 9; + */ + String getCountry(); + /** + * optional string country = 9; + */ + com.google.protobuf.ByteString + getCountryBytes(); + } + /** + * Protobuf type {@code signalservice.DataMessage.Contact.PostalAddress} + */ + public static final class PostalAddress extends + com.google.protobuf.GeneratedMessage + implements PostalAddressOrBuilder { + // Use PostalAddress.newBuilder() to construct. + private PostalAddress(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private PostalAddress(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final PostalAddress defaultInstance; + public static PostalAddress getDefaultInstance() { + return defaultInstance; + } + + public PostalAddress getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private PostalAddress( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + int rawValue = input.readEnum(); + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.Type value = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.Type.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(1, rawValue); + } else { + bitField0_ |= 0x00000001; + type_ = value; + } + break; + } + case 18: { + bitField0_ |= 0x00000002; + label_ = input.readBytes(); + break; + } + case 26: { + bitField0_ |= 0x00000004; + street_ = input.readBytes(); + break; + } + case 34: { + bitField0_ |= 0x00000008; + pobox_ = input.readBytes(); + break; + } + case 42: { + bitField0_ |= 0x00000010; + neighborhood_ = input.readBytes(); + break; + } + case 50: { + bitField0_ |= 0x00000020; + city_ = input.readBytes(); + break; + } + case 58: { + bitField0_ |= 0x00000040; + region_ = input.readBytes(); + break; + } + case 66: { + bitField0_ |= 0x00000080; + postcode_ = input.readBytes(); + break; + } + case 74: { + bitField0_ |= 0x00000100; + country_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Contact_PostalAddress_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Contact_PostalAddress_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.class, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public PostalAddress parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new PostalAddress(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + /** + * Protobuf enum {@code signalservice.DataMessage.Contact.PostalAddress.Type} + */ + public enum Type + implements com.google.protobuf.ProtocolMessageEnum { + /** + * HOME = 1; + */ + HOME(0, 1), + /** + * WORK = 2; + */ + WORK(1, 2), + /** + * CUSTOM = 3; + */ + CUSTOM(2, 3), + ; + + /** + * HOME = 1; + */ + public static final int HOME_VALUE = 1; + /** + * WORK = 2; + */ + public static final int WORK_VALUE = 2; + /** + * CUSTOM = 3; + */ + public static final int CUSTOM_VALUE = 3; + + + public final int getNumber() { return value; } + + public static Type valueOf(int value) { + switch (value) { + case 1: return HOME; + case 2: return WORK; + case 3: return CUSTOM; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static com.google.protobuf.Internal.EnumLiteMap + internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Type findValueByNumber(int number) { + return Type.valueOf(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(index); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.getDescriptor().getEnumTypes().get(0); + } + + private static final Type[] VALUES = values(); + + public static Type valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int index; + private final int value; + + private Type(int index, int value) { + this.index = index; + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:signalservice.DataMessage.Contact.PostalAddress.Type) + } + + private int bitField0_; + // optional .signalservice.DataMessage.Contact.PostalAddress.Type type = 1; + public static final int TYPE_FIELD_NUMBER = 1; + private org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.Type type_; + /** + * optional .signalservice.DataMessage.Contact.PostalAddress.Type type = 1; + */ + public boolean hasType() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional .signalservice.DataMessage.Contact.PostalAddress.Type type = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.Type getType() { + return type_; + } + + // optional string label = 2; + public static final int LABEL_FIELD_NUMBER = 2; + private Object label_; + /** + * optional string label = 2; + */ + public boolean hasLabel() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string label = 2; + */ + public String getLabel() { + Object ref = label_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + label_ = s; + } + return s; + } + } + /** + * optional string label = 2; + */ + public com.google.protobuf.ByteString + getLabelBytes() { + Object ref = label_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + label_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional string street = 3; + public static final int STREET_FIELD_NUMBER = 3; + private Object street_; + /** + * optional string street = 3; + */ + public boolean hasStreet() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional string street = 3; + */ + public String getStreet() { + Object ref = street_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + street_ = s; + } + return s; + } + } + /** + * optional string street = 3; + */ + public com.google.protobuf.ByteString + getStreetBytes() { + Object ref = street_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + street_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional string pobox = 4; + public static final int POBOX_FIELD_NUMBER = 4; + private Object pobox_; + /** + * optional string pobox = 4; + */ + public boolean hasPobox() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional string pobox = 4; + */ + public String getPobox() { + Object ref = pobox_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + pobox_ = s; + } + return s; + } + } + /** + * optional string pobox = 4; + */ + public com.google.protobuf.ByteString + getPoboxBytes() { + Object ref = pobox_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + pobox_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional string neighborhood = 5; + public static final int NEIGHBORHOOD_FIELD_NUMBER = 5; + private Object neighborhood_; + /** + * optional string neighborhood = 5; + */ + public boolean hasNeighborhood() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional string neighborhood = 5; + */ + public String getNeighborhood() { + Object ref = neighborhood_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + neighborhood_ = s; + } + return s; + } + } + /** + * optional string neighborhood = 5; + */ + public com.google.protobuf.ByteString + getNeighborhoodBytes() { + Object ref = neighborhood_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + neighborhood_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional string city = 6; + public static final int CITY_FIELD_NUMBER = 6; + private Object city_; + /** + * optional string city = 6; + */ + public boolean hasCity() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional string city = 6; + */ + public String getCity() { + Object ref = city_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + city_ = s; + } + return s; + } + } + /** + * optional string city = 6; + */ + public com.google.protobuf.ByteString + getCityBytes() { + Object ref = city_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + city_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional string region = 7; + public static final int REGION_FIELD_NUMBER = 7; + private Object region_; + /** + * optional string region = 7; + */ + public boolean hasRegion() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * optional string region = 7; + */ + public String getRegion() { + Object ref = region_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + region_ = s; + } + return s; + } + } + /** + * optional string region = 7; + */ + public com.google.protobuf.ByteString + getRegionBytes() { + Object ref = region_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + region_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional string postcode = 8; + public static final int POSTCODE_FIELD_NUMBER = 8; + private Object postcode_; + /** + * optional string postcode = 8; + */ + public boolean hasPostcode() { + return ((bitField0_ & 0x00000080) == 0x00000080); + } + /** + * optional string postcode = 8; + */ + public String getPostcode() { + Object ref = postcode_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + postcode_ = s; + } + return s; + } + } + /** + * optional string postcode = 8; + */ + public com.google.protobuf.ByteString + getPostcodeBytes() { + Object ref = postcode_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + postcode_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional string country = 9; + public static final int COUNTRY_FIELD_NUMBER = 9; + private Object country_; + /** + * optional string country = 9; + */ + public boolean hasCountry() { + return ((bitField0_ & 0x00000100) == 0x00000100); + } + /** + * optional string country = 9; + */ + public String getCountry() { + Object ref = country_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + country_ = s; + } + return s; + } + } + /** + * optional string country = 9; + */ + public com.google.protobuf.ByteString + getCountryBytes() { + Object ref = country_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + country_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private void initFields() { + type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.Type.HOME; + label_ = ""; + street_ = ""; + pobox_ = ""; + neighborhood_ = ""; + city_ = ""; + region_ = ""; + postcode_ = ""; + country_ = ""; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeEnum(1, type_.getNumber()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, getLabelBytes()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(3, getStreetBytes()); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeBytes(4, getPoboxBytes()); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + output.writeBytes(5, getNeighborhoodBytes()); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + output.writeBytes(6, getCityBytes()); + } + if (((bitField0_ & 0x00000040) == 0x00000040)) { + output.writeBytes(7, getRegionBytes()); + } + if (((bitField0_ & 0x00000080) == 0x00000080)) { + output.writeBytes(8, getPostcodeBytes()); + } + if (((bitField0_ & 0x00000100) == 0x00000100)) { + output.writeBytes(9, getCountryBytes()); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(1, type_.getNumber()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, getLabelBytes()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, getStreetBytes()); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(4, getPoboxBytes()); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(5, getNeighborhoodBytes()); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(6, getCityBytes()); + } + if (((bitField0_ & 0x00000040) == 0x00000040)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(7, getRegionBytes()); + } + if (((bitField0_ & 0x00000080) == 0x00000080)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(8, getPostcodeBytes()); + } + if (((bitField0_ & 0x00000100) == 0x00000100)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(9, getCountryBytes()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.DataMessage.Contact.PostalAddress} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddressOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Contact_PostalAddress_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Contact_PostalAddress_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.class, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.Type.HOME; + bitField0_ = (bitField0_ & ~0x00000001); + label_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + street_ = ""; + bitField0_ = (bitField0_ & ~0x00000004); + pobox_ = ""; + bitField0_ = (bitField0_ & ~0x00000008); + neighborhood_ = ""; + bitField0_ = (bitField0_ & ~0x00000010); + city_ = ""; + bitField0_ = (bitField0_ & ~0x00000020); + region_ = ""; + bitField0_ = (bitField0_ & ~0x00000040); + postcode_ = ""; + bitField0_ = (bitField0_ & ~0x00000080); + country_ = ""; + bitField0_ = (bitField0_ & ~0x00000100); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Contact_PostalAddress_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress result = new org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.type_ = type_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.label_ = label_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.street_ = street_; + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000008; + } + result.pobox_ = pobox_; + if (((from_bitField0_ & 0x00000010) == 0x00000010)) { + to_bitField0_ |= 0x00000010; + } + result.neighborhood_ = neighborhood_; + if (((from_bitField0_ & 0x00000020) == 0x00000020)) { + to_bitField0_ |= 0x00000020; + } + result.city_ = city_; + if (((from_bitField0_ & 0x00000040) == 0x00000040)) { + to_bitField0_ |= 0x00000040; + } + result.region_ = region_; + if (((from_bitField0_ & 0x00000080) == 0x00000080)) { + to_bitField0_ |= 0x00000080; + } + result.postcode_ = postcode_; + if (((from_bitField0_ & 0x00000100) == 0x00000100)) { + to_bitField0_ |= 0x00000100; + } + result.country_ = country_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.getDefaultInstance()) return this; + if (other.hasType()) { + setType(other.getType()); + } + if (other.hasLabel()) { + bitField0_ |= 0x00000002; + label_ = other.label_; + onChanged(); + } + if (other.hasStreet()) { + bitField0_ |= 0x00000004; + street_ = other.street_; + onChanged(); + } + if (other.hasPobox()) { + bitField0_ |= 0x00000008; + pobox_ = other.pobox_; + onChanged(); + } + if (other.hasNeighborhood()) { + bitField0_ |= 0x00000010; + neighborhood_ = other.neighborhood_; + onChanged(); + } + if (other.hasCity()) { + bitField0_ |= 0x00000020; + city_ = other.city_; + onChanged(); + } + if (other.hasRegion()) { + bitField0_ |= 0x00000040; + region_ = other.region_; + onChanged(); + } + if (other.hasPostcode()) { + bitField0_ |= 0x00000080; + postcode_ = other.postcode_; + onChanged(); + } + if (other.hasCountry()) { + bitField0_ |= 0x00000100; + country_ = other.country_; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional .signalservice.DataMessage.Contact.PostalAddress.Type type = 1; + private org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.Type type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.Type.HOME; + /** + * optional .signalservice.DataMessage.Contact.PostalAddress.Type type = 1; + */ + public boolean hasType() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional .signalservice.DataMessage.Contact.PostalAddress.Type type = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.Type getType() { + return type_; + } + /** + * optional .signalservice.DataMessage.Contact.PostalAddress.Type type = 1; + */ + public Builder setType(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.Type value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + type_ = value; + onChanged(); + return this; + } + /** + * optional .signalservice.DataMessage.Contact.PostalAddress.Type type = 1; + */ + public Builder clearType() { + bitField0_ = (bitField0_ & ~0x00000001); + type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.Type.HOME; + onChanged(); + return this; + } + + // optional string label = 2; + private Object label_ = ""; + /** + * optional string label = 2; + */ + public boolean hasLabel() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string label = 2; + */ + public String getLabel() { + Object ref = label_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + label_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string label = 2; + */ + public com.google.protobuf.ByteString + getLabelBytes() { + Object ref = label_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + label_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string label = 2; + */ + public Builder setLabel( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + label_ = value; + onChanged(); + return this; + } + /** + * optional string label = 2; + */ + public Builder clearLabel() { + bitField0_ = (bitField0_ & ~0x00000002); + label_ = getDefaultInstance().getLabel(); + onChanged(); + return this; + } + /** + * optional string label = 2; + */ + public Builder setLabelBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + label_ = value; + onChanged(); + return this; + } + + // optional string street = 3; + private Object street_ = ""; + /** + * optional string street = 3; + */ + public boolean hasStreet() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional string street = 3; + */ + public String getStreet() { + Object ref = street_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + street_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string street = 3; + */ + public com.google.protobuf.ByteString + getStreetBytes() { + Object ref = street_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + street_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string street = 3; + */ + public Builder setStreet( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + street_ = value; + onChanged(); + return this; + } + /** + * optional string street = 3; + */ + public Builder clearStreet() { + bitField0_ = (bitField0_ & ~0x00000004); + street_ = getDefaultInstance().getStreet(); + onChanged(); + return this; + } + /** + * optional string street = 3; + */ + public Builder setStreetBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + street_ = value; + onChanged(); + return this; + } + + // optional string pobox = 4; + private Object pobox_ = ""; + /** + * optional string pobox = 4; + */ + public boolean hasPobox() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional string pobox = 4; + */ + public String getPobox() { + Object ref = pobox_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + pobox_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string pobox = 4; + */ + public com.google.protobuf.ByteString + getPoboxBytes() { + Object ref = pobox_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + pobox_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string pobox = 4; + */ + public Builder setPobox( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + pobox_ = value; + onChanged(); + return this; + } + /** + * optional string pobox = 4; + */ + public Builder clearPobox() { + bitField0_ = (bitField0_ & ~0x00000008); + pobox_ = getDefaultInstance().getPobox(); + onChanged(); + return this; + } + /** + * optional string pobox = 4; + */ + public Builder setPoboxBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + pobox_ = value; + onChanged(); + return this; + } + + // optional string neighborhood = 5; + private Object neighborhood_ = ""; + /** + * optional string neighborhood = 5; + */ + public boolean hasNeighborhood() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional string neighborhood = 5; + */ + public String getNeighborhood() { + Object ref = neighborhood_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + neighborhood_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string neighborhood = 5; + */ + public com.google.protobuf.ByteString + getNeighborhoodBytes() { + Object ref = neighborhood_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + neighborhood_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string neighborhood = 5; + */ + public Builder setNeighborhood( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000010; + neighborhood_ = value; + onChanged(); + return this; + } + /** + * optional string neighborhood = 5; + */ + public Builder clearNeighborhood() { + bitField0_ = (bitField0_ & ~0x00000010); + neighborhood_ = getDefaultInstance().getNeighborhood(); + onChanged(); + return this; + } + /** + * optional string neighborhood = 5; + */ + public Builder setNeighborhoodBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000010; + neighborhood_ = value; + onChanged(); + return this; + } + + // optional string city = 6; + private Object city_ = ""; + /** + * optional string city = 6; + */ + public boolean hasCity() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional string city = 6; + */ + public String getCity() { + Object ref = city_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + city_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string city = 6; + */ + public com.google.protobuf.ByteString + getCityBytes() { + Object ref = city_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + city_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string city = 6; + */ + public Builder setCity( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000020; + city_ = value; + onChanged(); + return this; + } + /** + * optional string city = 6; + */ + public Builder clearCity() { + bitField0_ = (bitField0_ & ~0x00000020); + city_ = getDefaultInstance().getCity(); + onChanged(); + return this; + } + /** + * optional string city = 6; + */ + public Builder setCityBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000020; + city_ = value; + onChanged(); + return this; + } + + // optional string region = 7; + private Object region_ = ""; + /** + * optional string region = 7; + */ + public boolean hasRegion() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * optional string region = 7; + */ + public String getRegion() { + Object ref = region_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + region_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string region = 7; + */ + public com.google.protobuf.ByteString + getRegionBytes() { + Object ref = region_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + region_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string region = 7; + */ + public Builder setRegion( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000040; + region_ = value; + onChanged(); + return this; + } + /** + * optional string region = 7; + */ + public Builder clearRegion() { + bitField0_ = (bitField0_ & ~0x00000040); + region_ = getDefaultInstance().getRegion(); + onChanged(); + return this; + } + /** + * optional string region = 7; + */ + public Builder setRegionBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000040; + region_ = value; + onChanged(); + return this; + } + + // optional string postcode = 8; + private Object postcode_ = ""; + /** + * optional string postcode = 8; + */ + public boolean hasPostcode() { + return ((bitField0_ & 0x00000080) == 0x00000080); + } + /** + * optional string postcode = 8; + */ + public String getPostcode() { + Object ref = postcode_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + postcode_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string postcode = 8; + */ + public com.google.protobuf.ByteString + getPostcodeBytes() { + Object ref = postcode_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + postcode_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string postcode = 8; + */ + public Builder setPostcode( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000080; + postcode_ = value; + onChanged(); + return this; + } + /** + * optional string postcode = 8; + */ + public Builder clearPostcode() { + bitField0_ = (bitField0_ & ~0x00000080); + postcode_ = getDefaultInstance().getPostcode(); + onChanged(); + return this; + } + /** + * optional string postcode = 8; + */ + public Builder setPostcodeBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000080; + postcode_ = value; + onChanged(); + return this; + } + + // optional string country = 9; + private Object country_ = ""; + /** + * optional string country = 9; + */ + public boolean hasCountry() { + return ((bitField0_ & 0x00000100) == 0x00000100); + } + /** + * optional string country = 9; + */ + public String getCountry() { + Object ref = country_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + country_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string country = 9; + */ + public com.google.protobuf.ByteString + getCountryBytes() { + Object ref = country_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + country_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string country = 9; + */ + public Builder setCountry( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000100; + country_ = value; + onChanged(); + return this; + } + /** + * optional string country = 9; + */ + public Builder clearCountry() { + bitField0_ = (bitField0_ & ~0x00000100); + country_ = getDefaultInstance().getCountry(); + onChanged(); + return this; + } + /** + * optional string country = 9; + */ + public Builder setCountryBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000100; + country_ = value; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.DataMessage.Contact.PostalAddress) + } + + static { + defaultInstance = new PostalAddress(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.DataMessage.Contact.PostalAddress) + } + + public interface AvatarOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional .signalservice.AttachmentPointer avatar = 1; + /** + * optional .signalservice.AttachmentPointer avatar = 1; + */ + boolean hasAvatar(); + /** + * optional .signalservice.AttachmentPointer avatar = 1; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer getAvatar(); + /** + * optional .signalservice.AttachmentPointer avatar = 1; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder getAvatarOrBuilder(); + + // optional bool isProfile = 2; + /** + * optional bool isProfile = 2; + */ + boolean hasIsProfile(); + /** + * optional bool isProfile = 2; + */ + boolean getIsProfile(); + } + /** + * Protobuf type {@code signalservice.DataMessage.Contact.Avatar} + */ + public static final class Avatar extends + com.google.protobuf.GeneratedMessage + implements AvatarOrBuilder { + // Use Avatar.newBuilder() to construct. + private Avatar(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Avatar(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Avatar defaultInstance; + public static Avatar getDefaultInstance() { + return defaultInstance; + } + + public Avatar getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Avatar( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder subBuilder = null; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + subBuilder = avatar_.toBuilder(); + } + avatar_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(avatar_); + avatar_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000001; + break; + } + case 16: { + bitField0_ |= 0x00000002; + isProfile_ = input.readBool(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Contact_Avatar_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Contact_Avatar_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar.class, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Avatar parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Avatar(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional .signalservice.AttachmentPointer avatar = 1; + public static final int AVATAR_FIELD_NUMBER = 1; + private org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer avatar_; + /** + * optional .signalservice.AttachmentPointer avatar = 1; + */ + public boolean hasAvatar() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional .signalservice.AttachmentPointer avatar = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer getAvatar() { + return avatar_; + } + /** + * optional .signalservice.AttachmentPointer avatar = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder getAvatarOrBuilder() { + return avatar_; + } + + // optional bool isProfile = 2; + public static final int ISPROFILE_FIELD_NUMBER = 2; + private boolean isProfile_; + /** + * optional bool isProfile = 2; + */ + public boolean hasIsProfile() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bool isProfile = 2; + */ + public boolean getIsProfile() { + return isProfile_; + } + + private void initFields() { + avatar_ = org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance(); + isProfile_ = false; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeMessage(1, avatar_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBool(2, isProfile_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, avatar_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(2, isProfile_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.DataMessage.Contact.Avatar} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.AvatarOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Contact_Avatar_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Contact_Avatar_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar.class, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getAvatarFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + if (avatarBuilder_ == null) { + avatar_ = org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance(); + } else { + avatarBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + isProfile_ = false; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Contact_Avatar_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar result = new org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + if (avatarBuilder_ == null) { + result.avatar_ = avatar_; + } else { + result.avatar_ = avatarBuilder_.build(); + } + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.isProfile_ = isProfile_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar.getDefaultInstance()) return this; + if (other.hasAvatar()) { + mergeAvatar(other.getAvatar()); + } + if (other.hasIsProfile()) { + setIsProfile(other.getIsProfile()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional .signalservice.AttachmentPointer avatar = 1; + private org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer avatar_ = org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder> avatarBuilder_; + /** + * optional .signalservice.AttachmentPointer avatar = 1; + */ + public boolean hasAvatar() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional .signalservice.AttachmentPointer avatar = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer getAvatar() { + if (avatarBuilder_ == null) { + return avatar_; + } else { + return avatarBuilder_.getMessage(); + } + } + /** + * optional .signalservice.AttachmentPointer avatar = 1; + */ + public Builder setAvatar(org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer value) { + if (avatarBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + avatar_ = value; + onChanged(); + } else { + avatarBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * optional .signalservice.AttachmentPointer avatar = 1; + */ + public Builder setAvatar( + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder builderForValue) { + if (avatarBuilder_ == null) { + avatar_ = builderForValue.build(); + onChanged(); + } else { + avatarBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * optional .signalservice.AttachmentPointer avatar = 1; + */ + public Builder mergeAvatar(org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer value) { + if (avatarBuilder_ == null) { + if (((bitField0_ & 0x00000001) == 0x00000001) && + avatar_ != org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance()) { + avatar_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.newBuilder(avatar_).mergeFrom(value).buildPartial(); + } else { + avatar_ = value; + } + onChanged(); + } else { + avatarBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * optional .signalservice.AttachmentPointer avatar = 1; + */ + public Builder clearAvatar() { + if (avatarBuilder_ == null) { + avatar_ = org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance(); + onChanged(); + } else { + avatarBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + /** + * optional .signalservice.AttachmentPointer avatar = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder getAvatarBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getAvatarFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.AttachmentPointer avatar = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder getAvatarOrBuilder() { + if (avatarBuilder_ != null) { + return avatarBuilder_.getMessageOrBuilder(); + } else { + return avatar_; + } + } + /** + * optional .signalservice.AttachmentPointer avatar = 1; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder> + getAvatarFieldBuilder() { + if (avatarBuilder_ == null) { + avatarBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder>( + avatar_, + getParentForChildren(), + isClean()); + avatar_ = null; + } + return avatarBuilder_; + } + + // optional bool isProfile = 2; + private boolean isProfile_ ; + /** + * optional bool isProfile = 2; + */ + public boolean hasIsProfile() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bool isProfile = 2; + */ + public boolean getIsProfile() { + return isProfile_; + } + /** + * optional bool isProfile = 2; + */ + public Builder setIsProfile(boolean value) { + bitField0_ |= 0x00000002; + isProfile_ = value; + onChanged(); + return this; + } + /** + * optional bool isProfile = 2; + */ + public Builder clearIsProfile() { + bitField0_ = (bitField0_ & ~0x00000002); + isProfile_ = false; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.DataMessage.Contact.Avatar) + } + + static { + defaultInstance = new Avatar(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.DataMessage.Contact.Avatar) + } + + private int bitField0_; + // optional .signalservice.DataMessage.Contact.Name name = 1; + public static final int NAME_FIELD_NUMBER = 1; + private org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name name_; + /** + * optional .signalservice.DataMessage.Contact.Name name = 1; + */ + public boolean hasName() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional .signalservice.DataMessage.Contact.Name name = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name getName() { + return name_; + } + /** + * optional .signalservice.DataMessage.Contact.Name name = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.NameOrBuilder getNameOrBuilder() { + return name_; + } + + // repeated .signalservice.DataMessage.Contact.Phone number = 3; + public static final int NUMBER_FIELD_NUMBER = 3; + private java.util.List number_; + /** + * repeated .signalservice.DataMessage.Contact.Phone number = 3; + */ + public java.util.List getNumberList() { + return number_; + } + /** + * repeated .signalservice.DataMessage.Contact.Phone number = 3; + */ + public java.util.List + getNumberOrBuilderList() { + return number_; + } + /** + * repeated .signalservice.DataMessage.Contact.Phone number = 3; + */ + public int getNumberCount() { + return number_.size(); + } + /** + * repeated .signalservice.DataMessage.Contact.Phone number = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone getNumber(int index) { + return number_.get(index); + } + /** + * repeated .signalservice.DataMessage.Contact.Phone number = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PhoneOrBuilder getNumberOrBuilder( + int index) { + return number_.get(index); + } + + // repeated .signalservice.DataMessage.Contact.Email email = 4; + public static final int EMAIL_FIELD_NUMBER = 4; + private java.util.List email_; + /** + * repeated .signalservice.DataMessage.Contact.Email email = 4; + */ + public java.util.List getEmailList() { + return email_; + } + /** + * repeated .signalservice.DataMessage.Contact.Email email = 4; + */ + public java.util.List + getEmailOrBuilderList() { + return email_; + } + /** + * repeated .signalservice.DataMessage.Contact.Email email = 4; + */ + public int getEmailCount() { + return email_.size(); + } + /** + * repeated .signalservice.DataMessage.Contact.Email email = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email getEmail(int index) { + return email_.get(index); + } + /** + * repeated .signalservice.DataMessage.Contact.Email email = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.EmailOrBuilder getEmailOrBuilder( + int index) { + return email_.get(index); + } + + // repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + public static final int ADDRESS_FIELD_NUMBER = 5; + private java.util.List address_; + /** + * repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + */ + public java.util.List getAddressList() { + return address_; + } + /** + * repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + */ + public java.util.List + getAddressOrBuilderList() { + return address_; + } + /** + * repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + */ + public int getAddressCount() { + return address_.size(); + } + /** + * repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress getAddress(int index) { + return address_.get(index); + } + /** + * repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddressOrBuilder getAddressOrBuilder( + int index) { + return address_.get(index); + } + + // optional .signalservice.DataMessage.Contact.Avatar avatar = 6; + public static final int AVATAR_FIELD_NUMBER = 6; + private org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar avatar_; + /** + * optional .signalservice.DataMessage.Contact.Avatar avatar = 6; + */ + public boolean hasAvatar() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .signalservice.DataMessage.Contact.Avatar avatar = 6; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar getAvatar() { + return avatar_; + } + /** + * optional .signalservice.DataMessage.Contact.Avatar avatar = 6; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.AvatarOrBuilder getAvatarOrBuilder() { + return avatar_; + } + + // optional string organization = 7; + public static final int ORGANIZATION_FIELD_NUMBER = 7; + private Object organization_; + /** + * optional string organization = 7; + */ + public boolean hasOrganization() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional string organization = 7; + */ + public String getOrganization() { + Object ref = organization_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + organization_ = s; + } + return s; + } + } + /** + * optional string organization = 7; + */ + public com.google.protobuf.ByteString + getOrganizationBytes() { + Object ref = organization_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + organization_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private void initFields() { + name_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name.getDefaultInstance(); + number_ = java.util.Collections.emptyList(); + email_ = java.util.Collections.emptyList(); + address_ = java.util.Collections.emptyList(); + avatar_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar.getDefaultInstance(); + organization_ = ""; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeMessage(1, name_); + } + for (int i = 0; i < number_.size(); i++) { + output.writeMessage(3, number_.get(i)); + } + for (int i = 0; i < email_.size(); i++) { + output.writeMessage(4, email_.get(i)); + } + for (int i = 0; i < address_.size(); i++) { + output.writeMessage(5, address_.get(i)); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeMessage(6, avatar_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(7, getOrganizationBytes()); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, name_); + } + for (int i = 0; i < number_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, number_.get(i)); + } + for (int i = 0; i < email_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(4, email_.get(i)); + } + for (int i = 0; i < address_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(5, address_.get(i)); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(6, avatar_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(7, getOrganizationBytes()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.DataMessage.Contact} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.ContactOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Contact_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Contact_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.class, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getNameFieldBuilder(); + getNumberFieldBuilder(); + getEmailFieldBuilder(); + getAddressFieldBuilder(); + getAvatarFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + if (nameBuilder_ == null) { + name_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name.getDefaultInstance(); + } else { + nameBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + if (numberBuilder_ == null) { + number_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); + } else { + numberBuilder_.clear(); + } + if (emailBuilder_ == null) { + email_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); + } else { + emailBuilder_.clear(); + } + if (addressBuilder_ == null) { + address_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000008); + } else { + addressBuilder_.clear(); + } + if (avatarBuilder_ == null) { + avatar_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar.getDefaultInstance(); + } else { + avatarBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000010); + organization_ = ""; + bitField0_ = (bitField0_ & ~0x00000020); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Contact_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact result = new org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + if (nameBuilder_ == null) { + result.name_ = name_; + } else { + result.name_ = nameBuilder_.build(); + } + if (numberBuilder_ == null) { + if (((bitField0_ & 0x00000002) == 0x00000002)) { + number_ = java.util.Collections.unmodifiableList(number_); + bitField0_ = (bitField0_ & ~0x00000002); + } + result.number_ = number_; + } else { + result.number_ = numberBuilder_.build(); + } + if (emailBuilder_ == null) { + if (((bitField0_ & 0x00000004) == 0x00000004)) { + email_ = java.util.Collections.unmodifiableList(email_); + bitField0_ = (bitField0_ & ~0x00000004); + } + result.email_ = email_; + } else { + result.email_ = emailBuilder_.build(); + } + if (addressBuilder_ == null) { + if (((bitField0_ & 0x00000008) == 0x00000008)) { + address_ = java.util.Collections.unmodifiableList(address_); + bitField0_ = (bitField0_ & ~0x00000008); + } + result.address_ = address_; + } else { + result.address_ = addressBuilder_.build(); + } + if (((from_bitField0_ & 0x00000010) == 0x00000010)) { + to_bitField0_ |= 0x00000002; + } + if (avatarBuilder_ == null) { + result.avatar_ = avatar_; + } else { + result.avatar_ = avatarBuilder_.build(); + } + if (((from_bitField0_ & 0x00000020) == 0x00000020)) { + to_bitField0_ |= 0x00000004; + } + result.organization_ = organization_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.getDefaultInstance()) return this; + if (other.hasName()) { + mergeName(other.getName()); + } + if (numberBuilder_ == null) { + if (!other.number_.isEmpty()) { + if (number_.isEmpty()) { + number_ = other.number_; + bitField0_ = (bitField0_ & ~0x00000002); + } else { + ensureNumberIsMutable(); + number_.addAll(other.number_); + } + onChanged(); + } + } else { + if (!other.number_.isEmpty()) { + if (numberBuilder_.isEmpty()) { + numberBuilder_.dispose(); + numberBuilder_ = null; + number_ = other.number_; + bitField0_ = (bitField0_ & ~0x00000002); + numberBuilder_ = + com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ? + getNumberFieldBuilder() : null; + } else { + numberBuilder_.addAllMessages(other.number_); + } + } + } + if (emailBuilder_ == null) { + if (!other.email_.isEmpty()) { + if (email_.isEmpty()) { + email_ = other.email_; + bitField0_ = (bitField0_ & ~0x00000004); + } else { + ensureEmailIsMutable(); + email_.addAll(other.email_); + } + onChanged(); + } + } else { + if (!other.email_.isEmpty()) { + if (emailBuilder_.isEmpty()) { + emailBuilder_.dispose(); + emailBuilder_ = null; + email_ = other.email_; + bitField0_ = (bitField0_ & ~0x00000004); + emailBuilder_ = + com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ? + getEmailFieldBuilder() : null; + } else { + emailBuilder_.addAllMessages(other.email_); + } + } + } + if (addressBuilder_ == null) { + if (!other.address_.isEmpty()) { + if (address_.isEmpty()) { + address_ = other.address_; + bitField0_ = (bitField0_ & ~0x00000008); + } else { + ensureAddressIsMutable(); + address_.addAll(other.address_); + } + onChanged(); + } + } else { + if (!other.address_.isEmpty()) { + if (addressBuilder_.isEmpty()) { + addressBuilder_.dispose(); + addressBuilder_ = null; + address_ = other.address_; + bitField0_ = (bitField0_ & ~0x00000008); + addressBuilder_ = + com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ? + getAddressFieldBuilder() : null; + } else { + addressBuilder_.addAllMessages(other.address_); + } + } + } + if (other.hasAvatar()) { + mergeAvatar(other.getAvatar()); + } + if (other.hasOrganization()) { + bitField0_ |= 0x00000020; + organization_ = other.organization_; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional .signalservice.DataMessage.Contact.Name name = 1; + private org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name name_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.NameOrBuilder> nameBuilder_; + /** + * optional .signalservice.DataMessage.Contact.Name name = 1; + */ + public boolean hasName() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional .signalservice.DataMessage.Contact.Name name = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name getName() { + if (nameBuilder_ == null) { + return name_; + } else { + return nameBuilder_.getMessage(); + } + } + /** + * optional .signalservice.DataMessage.Contact.Name name = 1; + */ + public Builder setName(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name value) { + if (nameBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + name_ = value; + onChanged(); + } else { + nameBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * optional .signalservice.DataMessage.Contact.Name name = 1; + */ + public Builder setName( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name.Builder builderForValue) { + if (nameBuilder_ == null) { + name_ = builderForValue.build(); + onChanged(); + } else { + nameBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * optional .signalservice.DataMessage.Contact.Name name = 1; + */ + public Builder mergeName(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name value) { + if (nameBuilder_ == null) { + if (((bitField0_ & 0x00000001) == 0x00000001) && + name_ != org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name.getDefaultInstance()) { + name_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name.newBuilder(name_).mergeFrom(value).buildPartial(); + } else { + name_ = value; + } + onChanged(); + } else { + nameBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * optional .signalservice.DataMessage.Contact.Name name = 1; + */ + public Builder clearName() { + if (nameBuilder_ == null) { + name_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name.getDefaultInstance(); + onChanged(); + } else { + nameBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + /** + * optional .signalservice.DataMessage.Contact.Name name = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name.Builder getNameBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getNameFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.DataMessage.Contact.Name name = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.NameOrBuilder getNameOrBuilder() { + if (nameBuilder_ != null) { + return nameBuilder_.getMessageOrBuilder(); + } else { + return name_; + } + } + /** + * optional .signalservice.DataMessage.Contact.Name name = 1; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.NameOrBuilder> + getNameFieldBuilder() { + if (nameBuilder_ == null) { + nameBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Name.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.NameOrBuilder>( + name_, + getParentForChildren(), + isClean()); + name_ = null; + } + return nameBuilder_; + } + + // repeated .signalservice.DataMessage.Contact.Phone number = 3; + private java.util.List number_ = + java.util.Collections.emptyList(); + private void ensureNumberIsMutable() { + if (!((bitField0_ & 0x00000002) == 0x00000002)) { + number_ = new java.util.ArrayList(number_); + bitField0_ |= 0x00000002; + } + } + + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PhoneOrBuilder> numberBuilder_; + + /** + * repeated .signalservice.DataMessage.Contact.Phone number = 3; + */ + public java.util.List getNumberList() { + if (numberBuilder_ == null) { + return java.util.Collections.unmodifiableList(number_); + } else { + return numberBuilder_.getMessageList(); + } + } + /** + * repeated .signalservice.DataMessage.Contact.Phone number = 3; + */ + public int getNumberCount() { + if (numberBuilder_ == null) { + return number_.size(); + } else { + return numberBuilder_.getCount(); + } + } + /** + * repeated .signalservice.DataMessage.Contact.Phone number = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone getNumber(int index) { + if (numberBuilder_ == null) { + return number_.get(index); + } else { + return numberBuilder_.getMessage(index); + } + } + /** + * repeated .signalservice.DataMessage.Contact.Phone number = 3; + */ + public Builder setNumber( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone value) { + if (numberBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureNumberIsMutable(); + number_.set(index, value); + onChanged(); + } else { + numberBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact.Phone number = 3; + */ + public Builder setNumber( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.Builder builderForValue) { + if (numberBuilder_ == null) { + ensureNumberIsMutable(); + number_.set(index, builderForValue.build()); + onChanged(); + } else { + numberBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact.Phone number = 3; + */ + public Builder addNumber(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone value) { + if (numberBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureNumberIsMutable(); + number_.add(value); + onChanged(); + } else { + numberBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact.Phone number = 3; + */ + public Builder addNumber( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone value) { + if (numberBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureNumberIsMutable(); + number_.add(index, value); + onChanged(); + } else { + numberBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact.Phone number = 3; + */ + public Builder addNumber( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.Builder builderForValue) { + if (numberBuilder_ == null) { + ensureNumberIsMutable(); + number_.add(builderForValue.build()); + onChanged(); + } else { + numberBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact.Phone number = 3; + */ + public Builder addNumber( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.Builder builderForValue) { + if (numberBuilder_ == null) { + ensureNumberIsMutable(); + number_.add(index, builderForValue.build()); + onChanged(); + } else { + numberBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact.Phone number = 3; + */ + public Builder addAllNumber( + Iterable values) { + if (numberBuilder_ == null) { + ensureNumberIsMutable(); + super.addAll(values, number_); + onChanged(); + } else { + numberBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact.Phone number = 3; + */ + public Builder clearNumber() { + if (numberBuilder_ == null) { + number_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + } else { + numberBuilder_.clear(); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact.Phone number = 3; + */ + public Builder removeNumber(int index) { + if (numberBuilder_ == null) { + ensureNumberIsMutable(); + number_.remove(index); + onChanged(); + } else { + numberBuilder_.remove(index); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact.Phone number = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.Builder getNumberBuilder( + int index) { + return getNumberFieldBuilder().getBuilder(index); + } + /** + * repeated .signalservice.DataMessage.Contact.Phone number = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PhoneOrBuilder getNumberOrBuilder( + int index) { + if (numberBuilder_ == null) { + return number_.get(index); } else { + return numberBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .signalservice.DataMessage.Contact.Phone number = 3; + */ + public java.util.List + getNumberOrBuilderList() { + if (numberBuilder_ != null) { + return numberBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(number_); + } + } + /** + * repeated .signalservice.DataMessage.Contact.Phone number = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.Builder addNumberBuilder() { + return getNumberFieldBuilder().addBuilder( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.getDefaultInstance()); + } + /** + * repeated .signalservice.DataMessage.Contact.Phone number = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.Builder addNumberBuilder( + int index) { + return getNumberFieldBuilder().addBuilder( + index, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.getDefaultInstance()); + } + /** + * repeated .signalservice.DataMessage.Contact.Phone number = 3; + */ + public java.util.List + getNumberBuilderList() { + return getNumberFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PhoneOrBuilder> + getNumberFieldBuilder() { + if (numberBuilder_ == null) { + numberBuilder_ = new com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Phone.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PhoneOrBuilder>( + number_, + ((bitField0_ & 0x00000002) == 0x00000002), + getParentForChildren(), + isClean()); + number_ = null; + } + return numberBuilder_; + } + + // repeated .signalservice.DataMessage.Contact.Email email = 4; + private java.util.List email_ = + java.util.Collections.emptyList(); + private void ensureEmailIsMutable() { + if (!((bitField0_ & 0x00000004) == 0x00000004)) { + email_ = new java.util.ArrayList(email_); + bitField0_ |= 0x00000004; + } + } + + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.EmailOrBuilder> emailBuilder_; + + /** + * repeated .signalservice.DataMessage.Contact.Email email = 4; + */ + public java.util.List getEmailList() { + if (emailBuilder_ == null) { + return java.util.Collections.unmodifiableList(email_); + } else { + return emailBuilder_.getMessageList(); + } + } + /** + * repeated .signalservice.DataMessage.Contact.Email email = 4; + */ + public int getEmailCount() { + if (emailBuilder_ == null) { + return email_.size(); + } else { + return emailBuilder_.getCount(); + } + } + /** + * repeated .signalservice.DataMessage.Contact.Email email = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email getEmail(int index) { + if (emailBuilder_ == null) { + return email_.get(index); + } else { + return emailBuilder_.getMessage(index); + } + } + /** + * repeated .signalservice.DataMessage.Contact.Email email = 4; + */ + public Builder setEmail( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email value) { + if (emailBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureEmailIsMutable(); + email_.set(index, value); + onChanged(); + } else { + emailBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact.Email email = 4; + */ + public Builder setEmail( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.Builder builderForValue) { + if (emailBuilder_ == null) { + ensureEmailIsMutable(); + email_.set(index, builderForValue.build()); + onChanged(); + } else { + emailBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact.Email email = 4; + */ + public Builder addEmail(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email value) { + if (emailBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureEmailIsMutable(); + email_.add(value); + onChanged(); + } else { + emailBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact.Email email = 4; + */ + public Builder addEmail( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email value) { + if (emailBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureEmailIsMutable(); + email_.add(index, value); + onChanged(); + } else { + emailBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact.Email email = 4; + */ + public Builder addEmail( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.Builder builderForValue) { + if (emailBuilder_ == null) { + ensureEmailIsMutable(); + email_.add(builderForValue.build()); + onChanged(); + } else { + emailBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact.Email email = 4; + */ + public Builder addEmail( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.Builder builderForValue) { + if (emailBuilder_ == null) { + ensureEmailIsMutable(); + email_.add(index, builderForValue.build()); + onChanged(); + } else { + emailBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact.Email email = 4; + */ + public Builder addAllEmail( + Iterable values) { + if (emailBuilder_ == null) { + ensureEmailIsMutable(); + super.addAll(values, email_); + onChanged(); + } else { + emailBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact.Email email = 4; + */ + public Builder clearEmail() { + if (emailBuilder_ == null) { + email_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); + onChanged(); + } else { + emailBuilder_.clear(); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact.Email email = 4; + */ + public Builder removeEmail(int index) { + if (emailBuilder_ == null) { + ensureEmailIsMutable(); + email_.remove(index); + onChanged(); + } else { + emailBuilder_.remove(index); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact.Email email = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.Builder getEmailBuilder( + int index) { + return getEmailFieldBuilder().getBuilder(index); + } + /** + * repeated .signalservice.DataMessage.Contact.Email email = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.EmailOrBuilder getEmailOrBuilder( + int index) { + if (emailBuilder_ == null) { + return email_.get(index); } else { + return emailBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .signalservice.DataMessage.Contact.Email email = 4; + */ + public java.util.List + getEmailOrBuilderList() { + if (emailBuilder_ != null) { + return emailBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(email_); + } + } + /** + * repeated .signalservice.DataMessage.Contact.Email email = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.Builder addEmailBuilder() { + return getEmailFieldBuilder().addBuilder( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.getDefaultInstance()); + } + /** + * repeated .signalservice.DataMessage.Contact.Email email = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.Builder addEmailBuilder( + int index) { + return getEmailFieldBuilder().addBuilder( + index, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.getDefaultInstance()); + } + /** + * repeated .signalservice.DataMessage.Contact.Email email = 4; + */ + public java.util.List + getEmailBuilderList() { + return getEmailFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.EmailOrBuilder> + getEmailFieldBuilder() { + if (emailBuilder_ == null) { + emailBuilder_ = new com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Email.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.EmailOrBuilder>( + email_, + ((bitField0_ & 0x00000004) == 0x00000004), + getParentForChildren(), + isClean()); + email_ = null; + } + return emailBuilder_; + } + + // repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + private java.util.List address_ = + java.util.Collections.emptyList(); + private void ensureAddressIsMutable() { + if (!((bitField0_ & 0x00000008) == 0x00000008)) { + address_ = new java.util.ArrayList(address_); + bitField0_ |= 0x00000008; + } + } + + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddressOrBuilder> addressBuilder_; + + /** + * repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + */ + public java.util.List getAddressList() { + if (addressBuilder_ == null) { + return java.util.Collections.unmodifiableList(address_); + } else { + return addressBuilder_.getMessageList(); + } + } + /** + * repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + */ + public int getAddressCount() { + if (addressBuilder_ == null) { + return address_.size(); + } else { + return addressBuilder_.getCount(); + } + } + /** + * repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress getAddress(int index) { + if (addressBuilder_ == null) { + return address_.get(index); + } else { + return addressBuilder_.getMessage(index); + } + } + /** + * repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + */ + public Builder setAddress( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress value) { + if (addressBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureAddressIsMutable(); + address_.set(index, value); + onChanged(); + } else { + addressBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + */ + public Builder setAddress( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.Builder builderForValue) { + if (addressBuilder_ == null) { + ensureAddressIsMutable(); + address_.set(index, builderForValue.build()); + onChanged(); + } else { + addressBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + */ + public Builder addAddress(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress value) { + if (addressBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureAddressIsMutable(); + address_.add(value); + onChanged(); + } else { + addressBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + */ + public Builder addAddress( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress value) { + if (addressBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureAddressIsMutable(); + address_.add(index, value); + onChanged(); + } else { + addressBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + */ + public Builder addAddress( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.Builder builderForValue) { + if (addressBuilder_ == null) { + ensureAddressIsMutable(); + address_.add(builderForValue.build()); + onChanged(); + } else { + addressBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + */ + public Builder addAddress( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.Builder builderForValue) { + if (addressBuilder_ == null) { + ensureAddressIsMutable(); + address_.add(index, builderForValue.build()); + onChanged(); + } else { + addressBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + */ + public Builder addAllAddress( + Iterable values) { + if (addressBuilder_ == null) { + ensureAddressIsMutable(); + super.addAll(values, address_); + onChanged(); + } else { + addressBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + */ + public Builder clearAddress() { + if (addressBuilder_ == null) { + address_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000008); + onChanged(); + } else { + addressBuilder_.clear(); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + */ + public Builder removeAddress(int index) { + if (addressBuilder_ == null) { + ensureAddressIsMutable(); + address_.remove(index); + onChanged(); + } else { + addressBuilder_.remove(index); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.Builder getAddressBuilder( + int index) { + return getAddressFieldBuilder().getBuilder(index); + } + /** + * repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddressOrBuilder getAddressOrBuilder( + int index) { + if (addressBuilder_ == null) { + return address_.get(index); } else { + return addressBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + */ + public java.util.List + getAddressOrBuilderList() { + if (addressBuilder_ != null) { + return addressBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(address_); + } + } + /** + * repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.Builder addAddressBuilder() { + return getAddressFieldBuilder().addBuilder( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.getDefaultInstance()); + } + /** + * repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.Builder addAddressBuilder( + int index) { + return getAddressFieldBuilder().addBuilder( + index, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.getDefaultInstance()); + } + /** + * repeated .signalservice.DataMessage.Contact.PostalAddress address = 5; + */ + public java.util.List + getAddressBuilderList() { + return getAddressFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddressOrBuilder> + getAddressFieldBuilder() { + if (addressBuilder_ == null) { + addressBuilder_ = new com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddress.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.PostalAddressOrBuilder>( + address_, + ((bitField0_ & 0x00000008) == 0x00000008), + getParentForChildren(), + isClean()); + address_ = null; + } + return addressBuilder_; + } + + // optional .signalservice.DataMessage.Contact.Avatar avatar = 6; + private org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar avatar_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.AvatarOrBuilder> avatarBuilder_; + /** + * optional .signalservice.DataMessage.Contact.Avatar avatar = 6; + */ + public boolean hasAvatar() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional .signalservice.DataMessage.Contact.Avatar avatar = 6; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar getAvatar() { + if (avatarBuilder_ == null) { + return avatar_; + } else { + return avatarBuilder_.getMessage(); + } + } + /** + * optional .signalservice.DataMessage.Contact.Avatar avatar = 6; + */ + public Builder setAvatar(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar value) { + if (avatarBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + avatar_ = value; + onChanged(); + } else { + avatarBuilder_.setMessage(value); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * optional .signalservice.DataMessage.Contact.Avatar avatar = 6; + */ + public Builder setAvatar( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar.Builder builderForValue) { + if (avatarBuilder_ == null) { + avatar_ = builderForValue.build(); + onChanged(); + } else { + avatarBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * optional .signalservice.DataMessage.Contact.Avatar avatar = 6; + */ + public Builder mergeAvatar(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar value) { + if (avatarBuilder_ == null) { + if (((bitField0_ & 0x00000010) == 0x00000010) && + avatar_ != org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar.getDefaultInstance()) { + avatar_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar.newBuilder(avatar_).mergeFrom(value).buildPartial(); + } else { + avatar_ = value; + } + onChanged(); + } else { + avatarBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * optional .signalservice.DataMessage.Contact.Avatar avatar = 6; + */ + public Builder clearAvatar() { + if (avatarBuilder_ == null) { + avatar_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar.getDefaultInstance(); + onChanged(); + } else { + avatarBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000010); + return this; + } + /** + * optional .signalservice.DataMessage.Contact.Avatar avatar = 6; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar.Builder getAvatarBuilder() { + bitField0_ |= 0x00000010; + onChanged(); + return getAvatarFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.DataMessage.Contact.Avatar avatar = 6; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.AvatarOrBuilder getAvatarOrBuilder() { + if (avatarBuilder_ != null) { + return avatarBuilder_.getMessageOrBuilder(); + } else { + return avatar_; + } + } + /** + * optional .signalservice.DataMessage.Contact.Avatar avatar = 6; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.AvatarOrBuilder> + getAvatarFieldBuilder() { + if (avatarBuilder_ == null) { + avatarBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Avatar.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.AvatarOrBuilder>( + avatar_, + getParentForChildren(), + isClean()); + avatar_ = null; + } + return avatarBuilder_; + } + + // optional string organization = 7; + private Object organization_ = ""; + /** + * optional string organization = 7; + */ + public boolean hasOrganization() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional string organization = 7; + */ + public String getOrganization() { + Object ref = organization_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + organization_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string organization = 7; + */ + public com.google.protobuf.ByteString + getOrganizationBytes() { + Object ref = organization_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + organization_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string organization = 7; + */ + public Builder setOrganization( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000020; + organization_ = value; + onChanged(); + return this; + } + /** + * optional string organization = 7; + */ + public Builder clearOrganization() { + bitField0_ = (bitField0_ & ~0x00000020); + organization_ = getDefaultInstance().getOrganization(); + onChanged(); + return this; + } + /** + * optional string organization = 7; + */ + public Builder setOrganizationBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000020; + organization_ = value; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.DataMessage.Contact) + } + + static { + defaultInstance = new Contact(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.DataMessage.Contact) + } + + public interface PreviewOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional string url = 1; + /** + * optional string url = 1; + */ + boolean hasUrl(); + /** + * optional string url = 1; + */ + String getUrl(); + /** + * optional string url = 1; + */ + com.google.protobuf.ByteString + getUrlBytes(); + + // optional string title = 2; + /** + * optional string title = 2; + */ + boolean hasTitle(); + /** + * optional string title = 2; + */ + String getTitle(); + /** + * optional string title = 2; + */ + com.google.protobuf.ByteString + getTitleBytes(); + + // optional .signalservice.AttachmentPointer image = 3; + /** + * optional .signalservice.AttachmentPointer image = 3; + */ + boolean hasImage(); + /** + * optional .signalservice.AttachmentPointer image = 3; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer getImage(); + /** + * optional .signalservice.AttachmentPointer image = 3; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder getImageOrBuilder(); + } + /** + * Protobuf type {@code signalservice.DataMessage.Preview} + */ + public static final class Preview extends + com.google.protobuf.GeneratedMessage + implements PreviewOrBuilder { + // Use Preview.newBuilder() to construct. + private Preview(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Preview(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Preview defaultInstance; + public static Preview getDefaultInstance() { + return defaultInstance; + } + + public Preview getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Preview( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + url_ = input.readBytes(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + title_ = input.readBytes(); + break; + } + case 26: { + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder subBuilder = null; + if (((bitField0_ & 0x00000004) == 0x00000004)) { + subBuilder = image_.toBuilder(); + } + image_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(image_); + image_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000004; + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Preview_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Preview_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview.class, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Preview parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Preview(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional string url = 1; + public static final int URL_FIELD_NUMBER = 1; + private Object url_; + /** + * optional string url = 1; + */ + public boolean hasUrl() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string url = 1; + */ + public String getUrl() { + Object ref = url_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + url_ = s; + } + return s; + } + } + /** + * optional string url = 1; + */ + public com.google.protobuf.ByteString + getUrlBytes() { + Object ref = url_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + url_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional string title = 2; + public static final int TITLE_FIELD_NUMBER = 2; + private Object title_; + /** + * optional string title = 2; + */ + public boolean hasTitle() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string title = 2; + */ + public String getTitle() { + Object ref = title_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + title_ = s; + } + return s; + } + } + /** + * optional string title = 2; + */ + public com.google.protobuf.ByteString + getTitleBytes() { + Object ref = title_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + title_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional .signalservice.AttachmentPointer image = 3; + public static final int IMAGE_FIELD_NUMBER = 3; + private org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer image_; + /** + * optional .signalservice.AttachmentPointer image = 3; + */ + public boolean hasImage() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .signalservice.AttachmentPointer image = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer getImage() { + return image_; + } + /** + * optional .signalservice.AttachmentPointer image = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder getImageOrBuilder() { + return image_; + } + + private void initFields() { + url_ = ""; + title_ = ""; + image_ = org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance(); + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getUrlBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, getTitleBytes()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeMessage(3, image_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getUrlBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, getTitleBytes()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, image_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.DataMessage.Preview} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.PreviewOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Preview_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Preview_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview.class, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getImageFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + url_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + title_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + if (imageBuilder_ == null) { + image_ = org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance(); + } else { + imageBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Preview_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview result = new org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.url_ = url_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.title_ = title_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + if (imageBuilder_ == null) { + result.image_ = image_; + } else { + result.image_ = imageBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview.getDefaultInstance()) return this; + if (other.hasUrl()) { + bitField0_ |= 0x00000001; + url_ = other.url_; + onChanged(); + } + if (other.hasTitle()) { + bitField0_ |= 0x00000002; + title_ = other.title_; + onChanged(); + } + if (other.hasImage()) { + mergeImage(other.getImage()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional string url = 1; + private Object url_ = ""; + /** + * optional string url = 1; + */ + public boolean hasUrl() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string url = 1; + */ + public String getUrl() { + Object ref = url_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + url_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string url = 1; + */ + public com.google.protobuf.ByteString + getUrlBytes() { + Object ref = url_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + url_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string url = 1; + */ + public Builder setUrl( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + url_ = value; + onChanged(); + return this; + } + /** + * optional string url = 1; + */ + public Builder clearUrl() { + bitField0_ = (bitField0_ & ~0x00000001); + url_ = getDefaultInstance().getUrl(); + onChanged(); + return this; + } + /** + * optional string url = 1; + */ + public Builder setUrlBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + url_ = value; + onChanged(); + return this; + } + + // optional string title = 2; + private Object title_ = ""; + /** + * optional string title = 2; + */ + public boolean hasTitle() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string title = 2; + */ + public String getTitle() { + Object ref = title_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + title_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string title = 2; + */ + public com.google.protobuf.ByteString + getTitleBytes() { + Object ref = title_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + title_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string title = 2; + */ + public Builder setTitle( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + title_ = value; + onChanged(); + return this; + } + /** + * optional string title = 2; + */ + public Builder clearTitle() { + bitField0_ = (bitField0_ & ~0x00000002); + title_ = getDefaultInstance().getTitle(); + onChanged(); + return this; + } + /** + * optional string title = 2; + */ + public Builder setTitleBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + title_ = value; + onChanged(); + return this; + } + + // optional .signalservice.AttachmentPointer image = 3; + private org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer image_ = org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder> imageBuilder_; + /** + * optional .signalservice.AttachmentPointer image = 3; + */ + public boolean hasImage() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .signalservice.AttachmentPointer image = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer getImage() { + if (imageBuilder_ == null) { + return image_; + } else { + return imageBuilder_.getMessage(); + } + } + /** + * optional .signalservice.AttachmentPointer image = 3; + */ + public Builder setImage(org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer value) { + if (imageBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + image_ = value; + onChanged(); + } else { + imageBuilder_.setMessage(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .signalservice.AttachmentPointer image = 3; + */ + public Builder setImage( + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder builderForValue) { + if (imageBuilder_ == null) { + image_ = builderForValue.build(); + onChanged(); + } else { + imageBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .signalservice.AttachmentPointer image = 3; + */ + public Builder mergeImage(org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer value) { + if (imageBuilder_ == null) { + if (((bitField0_ & 0x00000004) == 0x00000004) && + image_ != org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance()) { + image_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.newBuilder(image_).mergeFrom(value).buildPartial(); + } else { + image_ = value; + } + onChanged(); + } else { + imageBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .signalservice.AttachmentPointer image = 3; + */ + public Builder clearImage() { + if (imageBuilder_ == null) { + image_ = org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance(); + onChanged(); + } else { + imageBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + /** + * optional .signalservice.AttachmentPointer image = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder getImageBuilder() { + bitField0_ |= 0x00000004; + onChanged(); + return getImageFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.AttachmentPointer image = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder getImageOrBuilder() { + if (imageBuilder_ != null) { + return imageBuilder_.getMessageOrBuilder(); + } else { + return image_; + } + } + /** + * optional .signalservice.AttachmentPointer image = 3; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder> + getImageFieldBuilder() { + if (imageBuilder_ == null) { + imageBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder>( + image_, + getParentForChildren(), + isClean()); + image_ = null; + } + return imageBuilder_; + } + + // @@protoc_insertion_point(builder_scope:signalservice.DataMessage.Preview) + } + + static { + defaultInstance = new Preview(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.DataMessage.Preview) + } + + public interface StickerOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional bytes packId = 1; + /** + * optional bytes packId = 1; + */ + boolean hasPackId(); + /** + * optional bytes packId = 1; + */ + com.google.protobuf.ByteString getPackId(); + + // optional bytes packKey = 2; + /** + * optional bytes packKey = 2; + */ + boolean hasPackKey(); + /** + * optional bytes packKey = 2; + */ + com.google.protobuf.ByteString getPackKey(); + + // optional uint32 stickerId = 3; + /** + * optional uint32 stickerId = 3; + */ + boolean hasStickerId(); + /** + * optional uint32 stickerId = 3; + */ + int getStickerId(); + + // optional .signalservice.AttachmentPointer data = 4; + /** + * optional .signalservice.AttachmentPointer data = 4; + */ + boolean hasData(); + /** + * optional .signalservice.AttachmentPointer data = 4; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer getData(); + /** + * optional .signalservice.AttachmentPointer data = 4; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder getDataOrBuilder(); + } + /** + * Protobuf type {@code signalservice.DataMessage.Sticker} + */ + public static final class Sticker extends + com.google.protobuf.GeneratedMessage + implements StickerOrBuilder { + // Use Sticker.newBuilder() to construct. + private Sticker(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Sticker(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Sticker defaultInstance; + public static Sticker getDefaultInstance() { + return defaultInstance; + } + + public Sticker getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Sticker( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + packId_ = input.readBytes(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + packKey_ = input.readBytes(); + break; + } + case 24: { + bitField0_ |= 0x00000004; + stickerId_ = input.readUInt32(); + break; + } + case 34: { + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder subBuilder = null; + if (((bitField0_ & 0x00000008) == 0x00000008)) { + subBuilder = data_.toBuilder(); + } + data_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(data_); + data_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000008; + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Sticker_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Sticker_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker.class, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Sticker parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Sticker(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional bytes packId = 1; + public static final int PACKID_FIELD_NUMBER = 1; + private com.google.protobuf.ByteString packId_; + /** + * optional bytes packId = 1; + */ + public boolean hasPackId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes packId = 1; + */ + public com.google.protobuf.ByteString getPackId() { + return packId_; + } + + // optional bytes packKey = 2; + public static final int PACKKEY_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString packKey_; + /** + * optional bytes packKey = 2; + */ + public boolean hasPackKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes packKey = 2; + */ + public com.google.protobuf.ByteString getPackKey() { + return packKey_; + } + + // optional uint32 stickerId = 3; + public static final int STICKERID_FIELD_NUMBER = 3; + private int stickerId_; + /** + * optional uint32 stickerId = 3; + */ + public boolean hasStickerId() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional uint32 stickerId = 3; + */ + public int getStickerId() { + return stickerId_; + } + + // optional .signalservice.AttachmentPointer data = 4; + public static final int DATA_FIELD_NUMBER = 4; + private org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer data_; + /** + * optional .signalservice.AttachmentPointer data = 4; + */ + public boolean hasData() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional .signalservice.AttachmentPointer data = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer getData() { + return data_; + } + /** + * optional .signalservice.AttachmentPointer data = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder getDataOrBuilder() { + return data_; + } + + private void initFields() { + packId_ = com.google.protobuf.ByteString.EMPTY; + packKey_ = com.google.protobuf.ByteString.EMPTY; + stickerId_ = 0; + data_ = org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance(); + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, packId_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, packKey_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeUInt32(3, stickerId_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeMessage(4, data_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, packId_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, packKey_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(3, stickerId_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(4, data_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.DataMessage.Sticker} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.StickerOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Sticker_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Sticker_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker.class, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getDataFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + packId_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + packKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + stickerId_ = 0; + bitField0_ = (bitField0_ & ~0x00000004); + if (dataBuilder_ == null) { + data_ = org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance(); + } else { + dataBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_Sticker_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker result = new org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.packId_ = packId_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.packKey_ = packKey_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.stickerId_ = stickerId_; + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000008; + } + if (dataBuilder_ == null) { + result.data_ = data_; + } else { + result.data_ = dataBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker.getDefaultInstance()) return this; + if (other.hasPackId()) { + setPackId(other.getPackId()); + } + if (other.hasPackKey()) { + setPackKey(other.getPackKey()); + } + if (other.hasStickerId()) { + setStickerId(other.getStickerId()); + } + if (other.hasData()) { + mergeData(other.getData()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional bytes packId = 1; + private com.google.protobuf.ByteString packId_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes packId = 1; + */ + public boolean hasPackId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes packId = 1; + */ + public com.google.protobuf.ByteString getPackId() { + return packId_; + } + /** + * optional bytes packId = 1; + */ + public Builder setPackId(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + packId_ = value; + onChanged(); + return this; + } + /** + * optional bytes packId = 1; + */ + public Builder clearPackId() { + bitField0_ = (bitField0_ & ~0x00000001); + packId_ = getDefaultInstance().getPackId(); + onChanged(); + return this; + } + + // optional bytes packKey = 2; + private com.google.protobuf.ByteString packKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes packKey = 2; + */ + public boolean hasPackKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes packKey = 2; + */ + public com.google.protobuf.ByteString getPackKey() { + return packKey_; + } + /** + * optional bytes packKey = 2; + */ + public Builder setPackKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + packKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes packKey = 2; + */ + public Builder clearPackKey() { + bitField0_ = (bitField0_ & ~0x00000002); + packKey_ = getDefaultInstance().getPackKey(); + onChanged(); + return this; + } + + // optional uint32 stickerId = 3; + private int stickerId_ ; + /** + * optional uint32 stickerId = 3; + */ + public boolean hasStickerId() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional uint32 stickerId = 3; + */ + public int getStickerId() { + return stickerId_; + } + /** + * optional uint32 stickerId = 3; + */ + public Builder setStickerId(int value) { + bitField0_ |= 0x00000004; + stickerId_ = value; + onChanged(); + return this; + } + /** + * optional uint32 stickerId = 3; + */ + public Builder clearStickerId() { + bitField0_ = (bitField0_ & ~0x00000004); + stickerId_ = 0; + onChanged(); + return this; + } + + // optional .signalservice.AttachmentPointer data = 4; + private org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer data_ = org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder> dataBuilder_; + /** + * optional .signalservice.AttachmentPointer data = 4; + */ + public boolean hasData() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional .signalservice.AttachmentPointer data = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer getData() { + if (dataBuilder_ == null) { + return data_; + } else { + return dataBuilder_.getMessage(); + } + } + /** + * optional .signalservice.AttachmentPointer data = 4; + */ + public Builder setData(org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer value) { + if (dataBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + data_ = value; + onChanged(); + } else { + dataBuilder_.setMessage(value); + } + bitField0_ |= 0x00000008; + return this; + } + /** + * optional .signalservice.AttachmentPointer data = 4; + */ + public Builder setData( + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder builderForValue) { + if (dataBuilder_ == null) { + data_ = builderForValue.build(); + onChanged(); + } else { + dataBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000008; + return this; + } + /** + * optional .signalservice.AttachmentPointer data = 4; + */ + public Builder mergeData(org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer value) { + if (dataBuilder_ == null) { + if (((bitField0_ & 0x00000008) == 0x00000008) && + data_ != org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance()) { + data_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.newBuilder(data_).mergeFrom(value).buildPartial(); + } else { + data_ = value; + } + onChanged(); + } else { + dataBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000008; + return this; + } + /** + * optional .signalservice.AttachmentPointer data = 4; + */ + public Builder clearData() { + if (dataBuilder_ == null) { + data_ = org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance(); + onChanged(); + } else { + dataBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + /** + * optional .signalservice.AttachmentPointer data = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder getDataBuilder() { + bitField0_ |= 0x00000008; + onChanged(); + return getDataFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.AttachmentPointer data = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder getDataOrBuilder() { + if (dataBuilder_ != null) { + return dataBuilder_.getMessageOrBuilder(); + } else { + return data_; + } + } + /** + * optional .signalservice.AttachmentPointer data = 4; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder> + getDataFieldBuilder() { + if (dataBuilder_ == null) { + dataBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder>( + data_, + getParentForChildren(), + isClean()); + data_ = null; + } + return dataBuilder_; + } + + // @@protoc_insertion_point(builder_scope:signalservice.DataMessage.Sticker) + } + + static { + defaultInstance = new Sticker(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.DataMessage.Sticker) + } + + private int bitField0_; + // optional string body = 1; + public static final int BODY_FIELD_NUMBER = 1; + private Object body_; + /** + * optional string body = 1; + */ + public boolean hasBody() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string body = 1; + */ + public String getBody() { + Object ref = body_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + body_ = s; + } + return s; + } + } + /** + * optional string body = 1; + */ + public com.google.protobuf.ByteString + getBodyBytes() { + Object ref = body_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + body_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // repeated .signalservice.AttachmentPointer attachments = 2; + public static final int ATTACHMENTS_FIELD_NUMBER = 2; + private java.util.List attachments_; + /** + * repeated .signalservice.AttachmentPointer attachments = 2; + */ + public java.util.List getAttachmentsList() { + return attachments_; + } + /** + * repeated .signalservice.AttachmentPointer attachments = 2; + */ + public java.util.List + getAttachmentsOrBuilderList() { + return attachments_; + } + /** + * repeated .signalservice.AttachmentPointer attachments = 2; + */ + public int getAttachmentsCount() { + return attachments_.size(); + } + /** + * repeated .signalservice.AttachmentPointer attachments = 2; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer getAttachments(int index) { + return attachments_.get(index); + } + /** + * repeated .signalservice.AttachmentPointer attachments = 2; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder getAttachmentsOrBuilder( + int index) { + return attachments_.get(index); + } + + // optional .signalservice.GroupContext group = 3; + public static final int GROUP_FIELD_NUMBER = 3; + private org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext group_; + /** + * optional .signalservice.GroupContext group = 3; + */ + public boolean hasGroup() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .signalservice.GroupContext group = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext getGroup() { + return group_; + } + /** + * optional .signalservice.GroupContext group = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContextOrBuilder getGroupOrBuilder() { + return group_; + } + + // optional uint32 flags = 4; + public static final int FLAGS_FIELD_NUMBER = 4; + private int flags_; + /** + * optional uint32 flags = 4; + */ + public boolean hasFlags() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional uint32 flags = 4; + */ + public int getFlags() { + return flags_; + } + + // optional uint32 expireTimer = 5; + public static final int EXPIRETIMER_FIELD_NUMBER = 5; + private int expireTimer_; + /** + * optional uint32 expireTimer = 5; + */ + public boolean hasExpireTimer() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional uint32 expireTimer = 5; + */ + public int getExpireTimer() { + return expireTimer_; + } + + // optional bytes profileKey = 6; + public static final int PROFILEKEY_FIELD_NUMBER = 6; + private com.google.protobuf.ByteString profileKey_; + /** + * optional bytes profileKey = 6; + */ + public boolean hasProfileKey() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional bytes profileKey = 6; + */ + public com.google.protobuf.ByteString getProfileKey() { + return profileKey_; + } + + // optional uint64 timestamp = 7; + public static final int TIMESTAMP_FIELD_NUMBER = 7; + private long timestamp_; + /** + * optional uint64 timestamp = 7; + */ + public boolean hasTimestamp() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional uint64 timestamp = 7; + */ + public long getTimestamp() { + return timestamp_; + } + + // optional .signalservice.DataMessage.Quote quote = 8; + public static final int QUOTE_FIELD_NUMBER = 8; + private org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote quote_; + /** + * optional .signalservice.DataMessage.Quote quote = 8; + */ + public boolean hasQuote() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * optional .signalservice.DataMessage.Quote quote = 8; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote getQuote() { + return quote_; + } + /** + * optional .signalservice.DataMessage.Quote quote = 8; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.QuoteOrBuilder getQuoteOrBuilder() { + return quote_; + } + + // repeated .signalservice.DataMessage.Contact contact = 9; + public static final int CONTACT_FIELD_NUMBER = 9; + private java.util.List contact_; + /** + * repeated .signalservice.DataMessage.Contact contact = 9; + */ + public java.util.List getContactList() { + return contact_; + } + /** + * repeated .signalservice.DataMessage.Contact contact = 9; + */ + public java.util.List + getContactOrBuilderList() { + return contact_; + } + /** + * repeated .signalservice.DataMessage.Contact contact = 9; + */ + public int getContactCount() { + return contact_.size(); + } + /** + * repeated .signalservice.DataMessage.Contact contact = 9; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact getContact(int index) { + return contact_.get(index); + } + /** + * repeated .signalservice.DataMessage.Contact contact = 9; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.ContactOrBuilder getContactOrBuilder( + int index) { + return contact_.get(index); + } + + // repeated .signalservice.DataMessage.Preview preview = 10; + public static final int PREVIEW_FIELD_NUMBER = 10; + private java.util.List preview_; + /** + * repeated .signalservice.DataMessage.Preview preview = 10; + */ + public java.util.List getPreviewList() { + return preview_; + } + /** + * repeated .signalservice.DataMessage.Preview preview = 10; + */ + public java.util.List + getPreviewOrBuilderList() { + return preview_; + } + /** + * repeated .signalservice.DataMessage.Preview preview = 10; + */ + public int getPreviewCount() { + return preview_.size(); + } + /** + * repeated .signalservice.DataMessage.Preview preview = 10; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview getPreview(int index) { + return preview_.get(index); + } + /** + * repeated .signalservice.DataMessage.Preview preview = 10; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.PreviewOrBuilder getPreviewOrBuilder( + int index) { + return preview_.get(index); + } + + // optional .signalservice.DataMessage.Sticker sticker = 11; + public static final int STICKER_FIELD_NUMBER = 11; + private org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker sticker_; + /** + * optional .signalservice.DataMessage.Sticker sticker = 11; + */ + public boolean hasSticker() { + return ((bitField0_ & 0x00000080) == 0x00000080); + } + /** + * optional .signalservice.DataMessage.Sticker sticker = 11; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker getSticker() { + return sticker_; + } + /** + * optional .signalservice.DataMessage.Sticker sticker = 11; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.StickerOrBuilder getStickerOrBuilder() { + return sticker_; + } + + // optional .signalservice.LokiUserProfile profile = 101; + public static final int PROFILE_FIELD_NUMBER = 101; + private org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile profile_; + /** + * optional .signalservice.LokiUserProfile profile = 101; + * + *
+     * Loki - The profile of the current user
+     * 
+ */ + public boolean hasProfile() { + return ((bitField0_ & 0x00000100) == 0x00000100); + } + /** + * optional .signalservice.LokiUserProfile profile = 101; + * + *
+     * Loki - The profile of the current user
+     * 
+ */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile getProfile() { + return profile_; + } + /** + * optional .signalservice.LokiUserProfile profile = 101; + * + *
+     * Loki - The profile of the current user
+     * 
+ */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfileOrBuilder getProfileOrBuilder() { + return profile_; + } + + // optional .signalservice.ClosedGroupUpdate closedGroupUpdate = 103; + public static final int CLOSEDGROUPUPDATE_FIELD_NUMBER = 103; + private org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate closedGroupUpdate_; + /** + * optional .signalservice.ClosedGroupUpdate closedGroupUpdate = 103; + * + *
+     * Loki
+     * 
+ */ + public boolean hasClosedGroupUpdate() { + return ((bitField0_ & 0x00000200) == 0x00000200); + } + /** + * optional .signalservice.ClosedGroupUpdate closedGroupUpdate = 103; + * + *
+     * Loki
+     * 
+ */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate getClosedGroupUpdate() { + return closedGroupUpdate_; + } + /** + * optional .signalservice.ClosedGroupUpdate closedGroupUpdate = 103; + * + *
+     * Loki
+     * 
+ */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdateOrBuilder getClosedGroupUpdateOrBuilder() { + return closedGroupUpdate_; + } + + private void initFields() { + body_ = ""; + attachments_ = java.util.Collections.emptyList(); + group_ = org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.getDefaultInstance(); + flags_ = 0; + expireTimer_ = 0; + profileKey_ = com.google.protobuf.ByteString.EMPTY; + timestamp_ = 0L; + quote_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.getDefaultInstance(); + contact_ = java.util.Collections.emptyList(); + preview_ = java.util.Collections.emptyList(); + sticker_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker.getDefaultInstance(); + profile_ = org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile.getDefaultInstance(); + closedGroupUpdate_ = org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.getDefaultInstance(); + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getBodyBytes()); + } + for (int i = 0; i < attachments_.size(); i++) { + output.writeMessage(2, attachments_.get(i)); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeMessage(3, group_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeUInt32(4, flags_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeUInt32(5, expireTimer_); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + output.writeBytes(6, profileKey_); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + output.writeUInt64(7, timestamp_); + } + if (((bitField0_ & 0x00000040) == 0x00000040)) { + output.writeMessage(8, quote_); + } + for (int i = 0; i < contact_.size(); i++) { + output.writeMessage(9, contact_.get(i)); + } + for (int i = 0; i < preview_.size(); i++) { + output.writeMessage(10, preview_.get(i)); + } + if (((bitField0_ & 0x00000080) == 0x00000080)) { + output.writeMessage(11, sticker_); + } + if (((bitField0_ & 0x00000100) == 0x00000100)) { + output.writeMessage(101, profile_); + } + if (((bitField0_ & 0x00000200) == 0x00000200)) { + output.writeMessage(103, closedGroupUpdate_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getBodyBytes()); + } + for (int i = 0; i < attachments_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, attachments_.get(i)); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, group_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(4, flags_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(5, expireTimer_); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(6, profileKey_); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(7, timestamp_); + } + if (((bitField0_ & 0x00000040) == 0x00000040)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(8, quote_); + } + for (int i = 0; i < contact_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(9, contact_.get(i)); + } + for (int i = 0; i < preview_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(10, preview_.get(i)); + } + if (((bitField0_ & 0x00000080) == 0x00000080)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(11, sticker_); + } + if (((bitField0_ & 0x00000100) == 0x00000100)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(101, profile_); + } + if (((bitField0_ & 0x00000200) == 0x00000200)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(103, closedGroupUpdate_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.DataMessage} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.class, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getAttachmentsFieldBuilder(); + getGroupFieldBuilder(); + getQuoteFieldBuilder(); + getContactFieldBuilder(); + getPreviewFieldBuilder(); + getStickerFieldBuilder(); + getProfileFieldBuilder(); + getClosedGroupUpdateFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + body_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + if (attachmentsBuilder_ == null) { + attachments_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); + } else { + attachmentsBuilder_.clear(); + } + if (groupBuilder_ == null) { + group_ = org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.getDefaultInstance(); + } else { + groupBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + flags_ = 0; + bitField0_ = (bitField0_ & ~0x00000008); + expireTimer_ = 0; + bitField0_ = (bitField0_ & ~0x00000010); + profileKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000020); + timestamp_ = 0L; + bitField0_ = (bitField0_ & ~0x00000040); + if (quoteBuilder_ == null) { + quote_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.getDefaultInstance(); + } else { + quoteBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000080); + if (contactBuilder_ == null) { + contact_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000100); + } else { + contactBuilder_.clear(); + } + if (previewBuilder_ == null) { + preview_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000200); + } else { + previewBuilder_.clear(); + } + if (stickerBuilder_ == null) { + sticker_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker.getDefaultInstance(); + } else { + stickerBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000400); + if (profileBuilder_ == null) { + profile_ = org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile.getDefaultInstance(); + } else { + profileBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000800); + if (closedGroupUpdateBuilder_ == null) { + closedGroupUpdate_ = org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.getDefaultInstance(); + } else { + closedGroupUpdateBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00001000); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_DataMessage_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage result = new org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.body_ = body_; + if (attachmentsBuilder_ == null) { + if (((bitField0_ & 0x00000002) == 0x00000002)) { + attachments_ = java.util.Collections.unmodifiableList(attachments_); + bitField0_ = (bitField0_ & ~0x00000002); + } + result.attachments_ = attachments_; + } else { + result.attachments_ = attachmentsBuilder_.build(); + } + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000002; + } + if (groupBuilder_ == null) { + result.group_ = group_; + } else { + result.group_ = groupBuilder_.build(); + } + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000004; + } + result.flags_ = flags_; + if (((from_bitField0_ & 0x00000010) == 0x00000010)) { + to_bitField0_ |= 0x00000008; + } + result.expireTimer_ = expireTimer_; + if (((from_bitField0_ & 0x00000020) == 0x00000020)) { + to_bitField0_ |= 0x00000010; + } + result.profileKey_ = profileKey_; + if (((from_bitField0_ & 0x00000040) == 0x00000040)) { + to_bitField0_ |= 0x00000020; + } + result.timestamp_ = timestamp_; + if (((from_bitField0_ & 0x00000080) == 0x00000080)) { + to_bitField0_ |= 0x00000040; + } + if (quoteBuilder_ == null) { + result.quote_ = quote_; + } else { + result.quote_ = quoteBuilder_.build(); + } + if (contactBuilder_ == null) { + if (((bitField0_ & 0x00000100) == 0x00000100)) { + contact_ = java.util.Collections.unmodifiableList(contact_); + bitField0_ = (bitField0_ & ~0x00000100); + } + result.contact_ = contact_; + } else { + result.contact_ = contactBuilder_.build(); + } + if (previewBuilder_ == null) { + if (((bitField0_ & 0x00000200) == 0x00000200)) { + preview_ = java.util.Collections.unmodifiableList(preview_); + bitField0_ = (bitField0_ & ~0x00000200); + } + result.preview_ = preview_; + } else { + result.preview_ = previewBuilder_.build(); + } + if (((from_bitField0_ & 0x00000400) == 0x00000400)) { + to_bitField0_ |= 0x00000080; + } + if (stickerBuilder_ == null) { + result.sticker_ = sticker_; + } else { + result.sticker_ = stickerBuilder_.build(); + } + if (((from_bitField0_ & 0x00000800) == 0x00000800)) { + to_bitField0_ |= 0x00000100; + } + if (profileBuilder_ == null) { + result.profile_ = profile_; + } else { + result.profile_ = profileBuilder_.build(); + } + if (((from_bitField0_ & 0x00001000) == 0x00001000)) { + to_bitField0_ |= 0x00000200; + } + if (closedGroupUpdateBuilder_ == null) { + result.closedGroupUpdate_ = closedGroupUpdate_; + } else { + result.closedGroupUpdate_ = closedGroupUpdateBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.getDefaultInstance()) return this; + if (other.hasBody()) { + bitField0_ |= 0x00000001; + body_ = other.body_; + onChanged(); + } + if (attachmentsBuilder_ == null) { + if (!other.attachments_.isEmpty()) { + if (attachments_.isEmpty()) { + attachments_ = other.attachments_; + bitField0_ = (bitField0_ & ~0x00000002); + } else { + ensureAttachmentsIsMutable(); + attachments_.addAll(other.attachments_); + } + onChanged(); + } + } else { + if (!other.attachments_.isEmpty()) { + if (attachmentsBuilder_.isEmpty()) { + attachmentsBuilder_.dispose(); + attachmentsBuilder_ = null; + attachments_ = other.attachments_; + bitField0_ = (bitField0_ & ~0x00000002); + attachmentsBuilder_ = + com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ? + getAttachmentsFieldBuilder() : null; + } else { + attachmentsBuilder_.addAllMessages(other.attachments_); + } + } + } + if (other.hasGroup()) { + mergeGroup(other.getGroup()); + } + if (other.hasFlags()) { + setFlags(other.getFlags()); + } + if (other.hasExpireTimer()) { + setExpireTimer(other.getExpireTimer()); + } + if (other.hasProfileKey()) { + setProfileKey(other.getProfileKey()); + } + if (other.hasTimestamp()) { + setTimestamp(other.getTimestamp()); + } + if (other.hasQuote()) { + mergeQuote(other.getQuote()); + } + if (contactBuilder_ == null) { + if (!other.contact_.isEmpty()) { + if (contact_.isEmpty()) { + contact_ = other.contact_; + bitField0_ = (bitField0_ & ~0x00000100); + } else { + ensureContactIsMutable(); + contact_.addAll(other.contact_); + } + onChanged(); + } + } else { + if (!other.contact_.isEmpty()) { + if (contactBuilder_.isEmpty()) { + contactBuilder_.dispose(); + contactBuilder_ = null; + contact_ = other.contact_; + bitField0_ = (bitField0_ & ~0x00000100); + contactBuilder_ = + com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ? + getContactFieldBuilder() : null; + } else { + contactBuilder_.addAllMessages(other.contact_); + } + } + } + if (previewBuilder_ == null) { + if (!other.preview_.isEmpty()) { + if (preview_.isEmpty()) { + preview_ = other.preview_; + bitField0_ = (bitField0_ & ~0x00000200); + } else { + ensurePreviewIsMutable(); + preview_.addAll(other.preview_); + } + onChanged(); + } + } else { + if (!other.preview_.isEmpty()) { + if (previewBuilder_.isEmpty()) { + previewBuilder_.dispose(); + previewBuilder_ = null; + preview_ = other.preview_; + bitField0_ = (bitField0_ & ~0x00000200); + previewBuilder_ = + com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ? + getPreviewFieldBuilder() : null; + } else { + previewBuilder_.addAllMessages(other.preview_); + } + } + } + if (other.hasSticker()) { + mergeSticker(other.getSticker()); + } + if (other.hasProfile()) { + mergeProfile(other.getProfile()); + } + if (other.hasClosedGroupUpdate()) { + mergeClosedGroupUpdate(other.getClosedGroupUpdate()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional string body = 1; + private Object body_ = ""; + /** + * optional string body = 1; + */ + public boolean hasBody() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string body = 1; + */ + public String getBody() { + Object ref = body_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + body_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string body = 1; + */ + public com.google.protobuf.ByteString + getBodyBytes() { + Object ref = body_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + body_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string body = 1; + */ + public Builder setBody( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + body_ = value; + onChanged(); + return this; + } + /** + * optional string body = 1; + */ + public Builder clearBody() { + bitField0_ = (bitField0_ & ~0x00000001); + body_ = getDefaultInstance().getBody(); + onChanged(); + return this; + } + /** + * optional string body = 1; + */ + public Builder setBodyBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + body_ = value; + onChanged(); + return this; + } + + // repeated .signalservice.AttachmentPointer attachments = 2; + private java.util.List attachments_ = + java.util.Collections.emptyList(); + private void ensureAttachmentsIsMutable() { + if (!((bitField0_ & 0x00000002) == 0x00000002)) { + attachments_ = new java.util.ArrayList(attachments_); + bitField0_ |= 0x00000002; + } + } + + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder> attachmentsBuilder_; + + /** + * repeated .signalservice.AttachmentPointer attachments = 2; + */ + public java.util.List getAttachmentsList() { + if (attachmentsBuilder_ == null) { + return java.util.Collections.unmodifiableList(attachments_); + } else { + return attachmentsBuilder_.getMessageList(); + } + } + /** + * repeated .signalservice.AttachmentPointer attachments = 2; + */ + public int getAttachmentsCount() { + if (attachmentsBuilder_ == null) { + return attachments_.size(); + } else { + return attachmentsBuilder_.getCount(); + } + } + /** + * repeated .signalservice.AttachmentPointer attachments = 2; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer getAttachments(int index) { + if (attachmentsBuilder_ == null) { + return attachments_.get(index); + } else { + return attachmentsBuilder_.getMessage(index); + } + } + /** + * repeated .signalservice.AttachmentPointer attachments = 2; + */ + public Builder setAttachments( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer value) { + if (attachmentsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureAttachmentsIsMutable(); + attachments_.set(index, value); + onChanged(); + } else { + attachmentsBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .signalservice.AttachmentPointer attachments = 2; + */ + public Builder setAttachments( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder builderForValue) { + if (attachmentsBuilder_ == null) { + ensureAttachmentsIsMutable(); + attachments_.set(index, builderForValue.build()); + onChanged(); + } else { + attachmentsBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.AttachmentPointer attachments = 2; + */ + public Builder addAttachments(org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer value) { + if (attachmentsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureAttachmentsIsMutable(); + attachments_.add(value); + onChanged(); + } else { + attachmentsBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .signalservice.AttachmentPointer attachments = 2; + */ + public Builder addAttachments( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer value) { + if (attachmentsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureAttachmentsIsMutable(); + attachments_.add(index, value); + onChanged(); + } else { + attachmentsBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .signalservice.AttachmentPointer attachments = 2; + */ + public Builder addAttachments( + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder builderForValue) { + if (attachmentsBuilder_ == null) { + ensureAttachmentsIsMutable(); + attachments_.add(builderForValue.build()); + onChanged(); + } else { + attachmentsBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.AttachmentPointer attachments = 2; + */ + public Builder addAttachments( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder builderForValue) { + if (attachmentsBuilder_ == null) { + ensureAttachmentsIsMutable(); + attachments_.add(index, builderForValue.build()); + onChanged(); + } else { + attachmentsBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.AttachmentPointer attachments = 2; + */ + public Builder addAllAttachments( + Iterable values) { + if (attachmentsBuilder_ == null) { + ensureAttachmentsIsMutable(); + super.addAll(values, attachments_); + onChanged(); + } else { + attachmentsBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .signalservice.AttachmentPointer attachments = 2; + */ + public Builder clearAttachments() { + if (attachmentsBuilder_ == null) { + attachments_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + } else { + attachmentsBuilder_.clear(); + } + return this; + } + /** + * repeated .signalservice.AttachmentPointer attachments = 2; + */ + public Builder removeAttachments(int index) { + if (attachmentsBuilder_ == null) { + ensureAttachmentsIsMutable(); + attachments_.remove(index); + onChanged(); + } else { + attachmentsBuilder_.remove(index); + } + return this; + } + /** + * repeated .signalservice.AttachmentPointer attachments = 2; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder getAttachmentsBuilder( + int index) { + return getAttachmentsFieldBuilder().getBuilder(index); + } + /** + * repeated .signalservice.AttachmentPointer attachments = 2; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder getAttachmentsOrBuilder( + int index) { + if (attachmentsBuilder_ == null) { + return attachments_.get(index); } else { + return attachmentsBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .signalservice.AttachmentPointer attachments = 2; + */ + public java.util.List + getAttachmentsOrBuilderList() { + if (attachmentsBuilder_ != null) { + return attachmentsBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(attachments_); + } + } + /** + * repeated .signalservice.AttachmentPointer attachments = 2; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder addAttachmentsBuilder() { + return getAttachmentsFieldBuilder().addBuilder( + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance()); + } + /** + * repeated .signalservice.AttachmentPointer attachments = 2; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder addAttachmentsBuilder( + int index) { + return getAttachmentsFieldBuilder().addBuilder( + index, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance()); + } + /** + * repeated .signalservice.AttachmentPointer attachments = 2; + */ + public java.util.List + getAttachmentsBuilderList() { + return getAttachmentsFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder> + getAttachmentsFieldBuilder() { + if (attachmentsBuilder_ == null) { + attachmentsBuilder_ = new com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder>( + attachments_, + ((bitField0_ & 0x00000002) == 0x00000002), + getParentForChildren(), + isClean()); + attachments_ = null; + } + return attachmentsBuilder_; + } + + // optional .signalservice.GroupContext group = 3; + private org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext group_ = org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext, org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContextOrBuilder> groupBuilder_; + /** + * optional .signalservice.GroupContext group = 3; + */ + public boolean hasGroup() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .signalservice.GroupContext group = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext getGroup() { + if (groupBuilder_ == null) { + return group_; + } else { + return groupBuilder_.getMessage(); + } + } + /** + * optional .signalservice.GroupContext group = 3; + */ + public Builder setGroup(org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext value) { + if (groupBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + group_ = value; + onChanged(); + } else { + groupBuilder_.setMessage(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .signalservice.GroupContext group = 3; + */ + public Builder setGroup( + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.Builder builderForValue) { + if (groupBuilder_ == null) { + group_ = builderForValue.build(); + onChanged(); + } else { + groupBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .signalservice.GroupContext group = 3; + */ + public Builder mergeGroup(org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext value) { + if (groupBuilder_ == null) { + if (((bitField0_ & 0x00000004) == 0x00000004) && + group_ != org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.getDefaultInstance()) { + group_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.newBuilder(group_).mergeFrom(value).buildPartial(); + } else { + group_ = value; + } + onChanged(); + } else { + groupBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .signalservice.GroupContext group = 3; + */ + public Builder clearGroup() { + if (groupBuilder_ == null) { + group_ = org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.getDefaultInstance(); + onChanged(); + } else { + groupBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + /** + * optional .signalservice.GroupContext group = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.Builder getGroupBuilder() { + bitField0_ |= 0x00000004; + onChanged(); + return getGroupFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.GroupContext group = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContextOrBuilder getGroupOrBuilder() { + if (groupBuilder_ != null) { + return groupBuilder_.getMessageOrBuilder(); + } else { + return group_; + } + } + /** + * optional .signalservice.GroupContext group = 3; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext, org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContextOrBuilder> + getGroupFieldBuilder() { + if (groupBuilder_ == null) { + groupBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext, org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContextOrBuilder>( + group_, + getParentForChildren(), + isClean()); + group_ = null; + } + return groupBuilder_; + } + + // optional uint32 flags = 4; + private int flags_ ; + /** + * optional uint32 flags = 4; + */ + public boolean hasFlags() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional uint32 flags = 4; + */ + public int getFlags() { + return flags_; + } + /** + * optional uint32 flags = 4; + */ + public Builder setFlags(int value) { + bitField0_ |= 0x00000008; + flags_ = value; + onChanged(); + return this; + } + /** + * optional uint32 flags = 4; + */ + public Builder clearFlags() { + bitField0_ = (bitField0_ & ~0x00000008); + flags_ = 0; + onChanged(); + return this; + } + + // optional uint32 expireTimer = 5; + private int expireTimer_ ; + /** + * optional uint32 expireTimer = 5; + */ + public boolean hasExpireTimer() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional uint32 expireTimer = 5; + */ + public int getExpireTimer() { + return expireTimer_; + } + /** + * optional uint32 expireTimer = 5; + */ + public Builder setExpireTimer(int value) { + bitField0_ |= 0x00000010; + expireTimer_ = value; + onChanged(); + return this; + } + /** + * optional uint32 expireTimer = 5; + */ + public Builder clearExpireTimer() { + bitField0_ = (bitField0_ & ~0x00000010); + expireTimer_ = 0; + onChanged(); + return this; + } + + // optional bytes profileKey = 6; + private com.google.protobuf.ByteString profileKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes profileKey = 6; + */ + public boolean hasProfileKey() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional bytes profileKey = 6; + */ + public com.google.protobuf.ByteString getProfileKey() { + return profileKey_; + } + /** + * optional bytes profileKey = 6; + */ + public Builder setProfileKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000020; + profileKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes profileKey = 6; + */ + public Builder clearProfileKey() { + bitField0_ = (bitField0_ & ~0x00000020); + profileKey_ = getDefaultInstance().getProfileKey(); + onChanged(); + return this; + } + + // optional uint64 timestamp = 7; + private long timestamp_ ; + /** + * optional uint64 timestamp = 7; + */ + public boolean hasTimestamp() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * optional uint64 timestamp = 7; + */ + public long getTimestamp() { + return timestamp_; + } + /** + * optional uint64 timestamp = 7; + */ + public Builder setTimestamp(long value) { + bitField0_ |= 0x00000040; + timestamp_ = value; + onChanged(); + return this; + } + /** + * optional uint64 timestamp = 7; + */ + public Builder clearTimestamp() { + bitField0_ = (bitField0_ & ~0x00000040); + timestamp_ = 0L; + onChanged(); + return this; + } + + // optional .signalservice.DataMessage.Quote quote = 8; + private org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote quote_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.QuoteOrBuilder> quoteBuilder_; + /** + * optional .signalservice.DataMessage.Quote quote = 8; + */ + public boolean hasQuote() { + return ((bitField0_ & 0x00000080) == 0x00000080); + } + /** + * optional .signalservice.DataMessage.Quote quote = 8; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote getQuote() { + if (quoteBuilder_ == null) { + return quote_; + } else { + return quoteBuilder_.getMessage(); + } + } + /** + * optional .signalservice.DataMessage.Quote quote = 8; + */ + public Builder setQuote(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote value) { + if (quoteBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + quote_ = value; + onChanged(); + } else { + quoteBuilder_.setMessage(value); + } + bitField0_ |= 0x00000080; + return this; + } + /** + * optional .signalservice.DataMessage.Quote quote = 8; + */ + public Builder setQuote( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.Builder builderForValue) { + if (quoteBuilder_ == null) { + quote_ = builderForValue.build(); + onChanged(); + } else { + quoteBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000080; + return this; + } + /** + * optional .signalservice.DataMessage.Quote quote = 8; + */ + public Builder mergeQuote(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote value) { + if (quoteBuilder_ == null) { + if (((bitField0_ & 0x00000080) == 0x00000080) && + quote_ != org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.getDefaultInstance()) { + quote_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.newBuilder(quote_).mergeFrom(value).buildPartial(); + } else { + quote_ = value; + } + onChanged(); + } else { + quoteBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000080; + return this; + } + /** + * optional .signalservice.DataMessage.Quote quote = 8; + */ + public Builder clearQuote() { + if (quoteBuilder_ == null) { + quote_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.getDefaultInstance(); + onChanged(); + } else { + quoteBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000080); + return this; + } + /** + * optional .signalservice.DataMessage.Quote quote = 8; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.Builder getQuoteBuilder() { + bitField0_ |= 0x00000080; + onChanged(); + return getQuoteFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.DataMessage.Quote quote = 8; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.QuoteOrBuilder getQuoteOrBuilder() { + if (quoteBuilder_ != null) { + return quoteBuilder_.getMessageOrBuilder(); + } else { + return quote_; + } + } + /** + * optional .signalservice.DataMessage.Quote quote = 8; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.QuoteOrBuilder> + getQuoteFieldBuilder() { + if (quoteBuilder_ == null) { + quoteBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Quote.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.QuoteOrBuilder>( + quote_, + getParentForChildren(), + isClean()); + quote_ = null; + } + return quoteBuilder_; + } + + // repeated .signalservice.DataMessage.Contact contact = 9; + private java.util.List contact_ = + java.util.Collections.emptyList(); + private void ensureContactIsMutable() { + if (!((bitField0_ & 0x00000100) == 0x00000100)) { + contact_ = new java.util.ArrayList(contact_); + bitField0_ |= 0x00000100; + } + } + + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.ContactOrBuilder> contactBuilder_; + + /** + * repeated .signalservice.DataMessage.Contact contact = 9; + */ + public java.util.List getContactList() { + if (contactBuilder_ == null) { + return java.util.Collections.unmodifiableList(contact_); + } else { + return contactBuilder_.getMessageList(); + } + } + /** + * repeated .signalservice.DataMessage.Contact contact = 9; + */ + public int getContactCount() { + if (contactBuilder_ == null) { + return contact_.size(); + } else { + return contactBuilder_.getCount(); + } + } + /** + * repeated .signalservice.DataMessage.Contact contact = 9; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact getContact(int index) { + if (contactBuilder_ == null) { + return contact_.get(index); + } else { + return contactBuilder_.getMessage(index); + } + } + /** + * repeated .signalservice.DataMessage.Contact contact = 9; + */ + public Builder setContact( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact value) { + if (contactBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureContactIsMutable(); + contact_.set(index, value); + onChanged(); + } else { + contactBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact contact = 9; + */ + public Builder setContact( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Builder builderForValue) { + if (contactBuilder_ == null) { + ensureContactIsMutable(); + contact_.set(index, builderForValue.build()); + onChanged(); + } else { + contactBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact contact = 9; + */ + public Builder addContact(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact value) { + if (contactBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureContactIsMutable(); + contact_.add(value); + onChanged(); + } else { + contactBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact contact = 9; + */ + public Builder addContact( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact value) { + if (contactBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureContactIsMutable(); + contact_.add(index, value); + onChanged(); + } else { + contactBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact contact = 9; + */ + public Builder addContact( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Builder builderForValue) { + if (contactBuilder_ == null) { + ensureContactIsMutable(); + contact_.add(builderForValue.build()); + onChanged(); + } else { + contactBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact contact = 9; + */ + public Builder addContact( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Builder builderForValue) { + if (contactBuilder_ == null) { + ensureContactIsMutable(); + contact_.add(index, builderForValue.build()); + onChanged(); + } else { + contactBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact contact = 9; + */ + public Builder addAllContact( + Iterable values) { + if (contactBuilder_ == null) { + ensureContactIsMutable(); + super.addAll(values, contact_); + onChanged(); + } else { + contactBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact contact = 9; + */ + public Builder clearContact() { + if (contactBuilder_ == null) { + contact_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000100); + onChanged(); + } else { + contactBuilder_.clear(); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact contact = 9; + */ + public Builder removeContact(int index) { + if (contactBuilder_ == null) { + ensureContactIsMutable(); + contact_.remove(index); + onChanged(); + } else { + contactBuilder_.remove(index); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Contact contact = 9; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Builder getContactBuilder( + int index) { + return getContactFieldBuilder().getBuilder(index); + } + /** + * repeated .signalservice.DataMessage.Contact contact = 9; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.ContactOrBuilder getContactOrBuilder( + int index) { + if (contactBuilder_ == null) { + return contact_.get(index); } else { + return contactBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .signalservice.DataMessage.Contact contact = 9; + */ + public java.util.List + getContactOrBuilderList() { + if (contactBuilder_ != null) { + return contactBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(contact_); + } + } + /** + * repeated .signalservice.DataMessage.Contact contact = 9; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Builder addContactBuilder() { + return getContactFieldBuilder().addBuilder( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.getDefaultInstance()); + } + /** + * repeated .signalservice.DataMessage.Contact contact = 9; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Builder addContactBuilder( + int index) { + return getContactFieldBuilder().addBuilder( + index, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.getDefaultInstance()); + } + /** + * repeated .signalservice.DataMessage.Contact contact = 9; + */ + public java.util.List + getContactBuilderList() { + return getContactFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.ContactOrBuilder> + getContactFieldBuilder() { + if (contactBuilder_ == null) { + contactBuilder_ = new com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Contact.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.ContactOrBuilder>( + contact_, + ((bitField0_ & 0x00000100) == 0x00000100), + getParentForChildren(), + isClean()); + contact_ = null; + } + return contactBuilder_; + } + + // repeated .signalservice.DataMessage.Preview preview = 10; + private java.util.List preview_ = + java.util.Collections.emptyList(); + private void ensurePreviewIsMutable() { + if (!((bitField0_ & 0x00000200) == 0x00000200)) { + preview_ = new java.util.ArrayList(preview_); + bitField0_ |= 0x00000200; + } + } + + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.PreviewOrBuilder> previewBuilder_; + + /** + * repeated .signalservice.DataMessage.Preview preview = 10; + */ + public java.util.List getPreviewList() { + if (previewBuilder_ == null) { + return java.util.Collections.unmodifiableList(preview_); + } else { + return previewBuilder_.getMessageList(); + } + } + /** + * repeated .signalservice.DataMessage.Preview preview = 10; + */ + public int getPreviewCount() { + if (previewBuilder_ == null) { + return preview_.size(); + } else { + return previewBuilder_.getCount(); + } + } + /** + * repeated .signalservice.DataMessage.Preview preview = 10; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview getPreview(int index) { + if (previewBuilder_ == null) { + return preview_.get(index); + } else { + return previewBuilder_.getMessage(index); + } + } + /** + * repeated .signalservice.DataMessage.Preview preview = 10; + */ + public Builder setPreview( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview value) { + if (previewBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensurePreviewIsMutable(); + preview_.set(index, value); + onChanged(); + } else { + previewBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Preview preview = 10; + */ + public Builder setPreview( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview.Builder builderForValue) { + if (previewBuilder_ == null) { + ensurePreviewIsMutable(); + preview_.set(index, builderForValue.build()); + onChanged(); + } else { + previewBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Preview preview = 10; + */ + public Builder addPreview(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview value) { + if (previewBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensurePreviewIsMutable(); + preview_.add(value); + onChanged(); + } else { + previewBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Preview preview = 10; + */ + public Builder addPreview( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview value) { + if (previewBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensurePreviewIsMutable(); + preview_.add(index, value); + onChanged(); + } else { + previewBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Preview preview = 10; + */ + public Builder addPreview( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview.Builder builderForValue) { + if (previewBuilder_ == null) { + ensurePreviewIsMutable(); + preview_.add(builderForValue.build()); + onChanged(); + } else { + previewBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Preview preview = 10; + */ + public Builder addPreview( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview.Builder builderForValue) { + if (previewBuilder_ == null) { + ensurePreviewIsMutable(); + preview_.add(index, builderForValue.build()); + onChanged(); + } else { + previewBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Preview preview = 10; + */ + public Builder addAllPreview( + Iterable values) { + if (previewBuilder_ == null) { + ensurePreviewIsMutable(); + super.addAll(values, preview_); + onChanged(); + } else { + previewBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Preview preview = 10; + */ + public Builder clearPreview() { + if (previewBuilder_ == null) { + preview_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000200); + onChanged(); + } else { + previewBuilder_.clear(); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Preview preview = 10; + */ + public Builder removePreview(int index) { + if (previewBuilder_ == null) { + ensurePreviewIsMutable(); + preview_.remove(index); + onChanged(); + } else { + previewBuilder_.remove(index); + } + return this; + } + /** + * repeated .signalservice.DataMessage.Preview preview = 10; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview.Builder getPreviewBuilder( + int index) { + return getPreviewFieldBuilder().getBuilder(index); + } + /** + * repeated .signalservice.DataMessage.Preview preview = 10; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.PreviewOrBuilder getPreviewOrBuilder( + int index) { + if (previewBuilder_ == null) { + return preview_.get(index); } else { + return previewBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .signalservice.DataMessage.Preview preview = 10; + */ + public java.util.List + getPreviewOrBuilderList() { + if (previewBuilder_ != null) { + return previewBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(preview_); + } + } + /** + * repeated .signalservice.DataMessage.Preview preview = 10; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview.Builder addPreviewBuilder() { + return getPreviewFieldBuilder().addBuilder( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview.getDefaultInstance()); + } + /** + * repeated .signalservice.DataMessage.Preview preview = 10; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview.Builder addPreviewBuilder( + int index) { + return getPreviewFieldBuilder().addBuilder( + index, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview.getDefaultInstance()); + } + /** + * repeated .signalservice.DataMessage.Preview preview = 10; + */ + public java.util.List + getPreviewBuilderList() { + return getPreviewFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.PreviewOrBuilder> + getPreviewFieldBuilder() { + if (previewBuilder_ == null) { + previewBuilder_ = new com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Preview.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.PreviewOrBuilder>( + preview_, + ((bitField0_ & 0x00000200) == 0x00000200), + getParentForChildren(), + isClean()); + preview_ = null; + } + return previewBuilder_; + } + + // optional .signalservice.DataMessage.Sticker sticker = 11; + private org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker sticker_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.StickerOrBuilder> stickerBuilder_; + /** + * optional .signalservice.DataMessage.Sticker sticker = 11; + */ + public boolean hasSticker() { + return ((bitField0_ & 0x00000400) == 0x00000400); + } + /** + * optional .signalservice.DataMessage.Sticker sticker = 11; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker getSticker() { + if (stickerBuilder_ == null) { + return sticker_; + } else { + return stickerBuilder_.getMessage(); + } + } + /** + * optional .signalservice.DataMessage.Sticker sticker = 11; + */ + public Builder setSticker(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker value) { + if (stickerBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + sticker_ = value; + onChanged(); + } else { + stickerBuilder_.setMessage(value); + } + bitField0_ |= 0x00000400; + return this; + } + /** + * optional .signalservice.DataMessage.Sticker sticker = 11; + */ + public Builder setSticker( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker.Builder builderForValue) { + if (stickerBuilder_ == null) { + sticker_ = builderForValue.build(); + onChanged(); + } else { + stickerBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000400; + return this; + } + /** + * optional .signalservice.DataMessage.Sticker sticker = 11; + */ + public Builder mergeSticker(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker value) { + if (stickerBuilder_ == null) { + if (((bitField0_ & 0x00000400) == 0x00000400) && + sticker_ != org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker.getDefaultInstance()) { + sticker_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker.newBuilder(sticker_).mergeFrom(value).buildPartial(); + } else { + sticker_ = value; + } + onChanged(); + } else { + stickerBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000400; + return this; + } + /** + * optional .signalservice.DataMessage.Sticker sticker = 11; + */ + public Builder clearSticker() { + if (stickerBuilder_ == null) { + sticker_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker.getDefaultInstance(); + onChanged(); + } else { + stickerBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000400); + return this; + } + /** + * optional .signalservice.DataMessage.Sticker sticker = 11; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker.Builder getStickerBuilder() { + bitField0_ |= 0x00000400; + onChanged(); + return getStickerFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.DataMessage.Sticker sticker = 11; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.StickerOrBuilder getStickerOrBuilder() { + if (stickerBuilder_ != null) { + return stickerBuilder_.getMessageOrBuilder(); + } else { + return sticker_; + } + } + /** + * optional .signalservice.DataMessage.Sticker sticker = 11; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.StickerOrBuilder> + getStickerFieldBuilder() { + if (stickerBuilder_ == null) { + stickerBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Sticker.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.StickerOrBuilder>( + sticker_, + getParentForChildren(), + isClean()); + sticker_ = null; + } + return stickerBuilder_; + } + + // optional .signalservice.LokiUserProfile profile = 101; + private org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile profile_ = org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile, org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfileOrBuilder> profileBuilder_; + /** + * optional .signalservice.LokiUserProfile profile = 101; + * + *
+       * Loki - The profile of the current user
+       * 
+ */ + public boolean hasProfile() { + return ((bitField0_ & 0x00000800) == 0x00000800); + } + /** + * optional .signalservice.LokiUserProfile profile = 101; + * + *
+       * Loki - The profile of the current user
+       * 
+ */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile getProfile() { + if (profileBuilder_ == null) { + return profile_; + } else { + return profileBuilder_.getMessage(); + } + } + /** + * optional .signalservice.LokiUserProfile profile = 101; + * + *
+       * Loki - The profile of the current user
+       * 
+ */ + public Builder setProfile(org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile value) { + if (profileBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + profile_ = value; + onChanged(); + } else { + profileBuilder_.setMessage(value); + } + bitField0_ |= 0x00000800; + return this; + } + /** + * optional .signalservice.LokiUserProfile profile = 101; + * + *
+       * Loki - The profile of the current user
+       * 
+ */ + public Builder setProfile( + org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile.Builder builderForValue) { + if (profileBuilder_ == null) { + profile_ = builderForValue.build(); + onChanged(); + } else { + profileBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000800; + return this; + } + /** + * optional .signalservice.LokiUserProfile profile = 101; + * + *
+       * Loki - The profile of the current user
+       * 
+ */ + public Builder mergeProfile(org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile value) { + if (profileBuilder_ == null) { + if (((bitField0_ & 0x00000800) == 0x00000800) && + profile_ != org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile.getDefaultInstance()) { + profile_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile.newBuilder(profile_).mergeFrom(value).buildPartial(); + } else { + profile_ = value; + } + onChanged(); + } else { + profileBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000800; + return this; + } + /** + * optional .signalservice.LokiUserProfile profile = 101; + * + *
+       * Loki - The profile of the current user
+       * 
+ */ + public Builder clearProfile() { + if (profileBuilder_ == null) { + profile_ = org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile.getDefaultInstance(); + onChanged(); + } else { + profileBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000800); + return this; + } + /** + * optional .signalservice.LokiUserProfile profile = 101; + * + *
+       * Loki - The profile of the current user
+       * 
+ */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile.Builder getProfileBuilder() { + bitField0_ |= 0x00000800; + onChanged(); + return getProfileFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.LokiUserProfile profile = 101; + * + *
+       * Loki - The profile of the current user
+       * 
+ */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfileOrBuilder getProfileOrBuilder() { + if (profileBuilder_ != null) { + return profileBuilder_.getMessageOrBuilder(); + } else { + return profile_; + } + } + /** + * optional .signalservice.LokiUserProfile profile = 101; + * + *
+       * Loki - The profile of the current user
+       * 
+ */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile, org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfileOrBuilder> + getProfileFieldBuilder() { + if (profileBuilder_ == null) { + profileBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile, org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfileOrBuilder>( + profile_, + getParentForChildren(), + isClean()); + profile_ = null; + } + return profileBuilder_; + } + + // optional .signalservice.ClosedGroupUpdate closedGroupUpdate = 103; + private org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate closedGroupUpdate_ = org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate, org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdateOrBuilder> closedGroupUpdateBuilder_; + /** + * optional .signalservice.ClosedGroupUpdate closedGroupUpdate = 103; + * + *
+       * Loki
+       * 
+ */ + public boolean hasClosedGroupUpdate() { + return ((bitField0_ & 0x00001000) == 0x00001000); + } + /** + * optional .signalservice.ClosedGroupUpdate closedGroupUpdate = 103; + * + *
+       * Loki
+       * 
+ */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate getClosedGroupUpdate() { + if (closedGroupUpdateBuilder_ == null) { + return closedGroupUpdate_; + } else { + return closedGroupUpdateBuilder_.getMessage(); + } + } + /** + * optional .signalservice.ClosedGroupUpdate closedGroupUpdate = 103; + * + *
+       * Loki
+       * 
+ */ + public Builder setClosedGroupUpdate(org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate value) { + if (closedGroupUpdateBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + closedGroupUpdate_ = value; + onChanged(); + } else { + closedGroupUpdateBuilder_.setMessage(value); + } + bitField0_ |= 0x00001000; + return this; + } + /** + * optional .signalservice.ClosedGroupUpdate closedGroupUpdate = 103; + * + *
+       * Loki
+       * 
+ */ + public Builder setClosedGroupUpdate( + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.Builder builderForValue) { + if (closedGroupUpdateBuilder_ == null) { + closedGroupUpdate_ = builderForValue.build(); + onChanged(); + } else { + closedGroupUpdateBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00001000; + return this; + } + /** + * optional .signalservice.ClosedGroupUpdate closedGroupUpdate = 103; + * + *
+       * Loki
+       * 
+ */ + public Builder mergeClosedGroupUpdate(org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate value) { + if (closedGroupUpdateBuilder_ == null) { + if (((bitField0_ & 0x00001000) == 0x00001000) && + closedGroupUpdate_ != org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.getDefaultInstance()) { + closedGroupUpdate_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.newBuilder(closedGroupUpdate_).mergeFrom(value).buildPartial(); + } else { + closedGroupUpdate_ = value; + } + onChanged(); + } else { + closedGroupUpdateBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00001000; + return this; + } + /** + * optional .signalservice.ClosedGroupUpdate closedGroupUpdate = 103; + * + *
+       * Loki
+       * 
+ */ + public Builder clearClosedGroupUpdate() { + if (closedGroupUpdateBuilder_ == null) { + closedGroupUpdate_ = org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.getDefaultInstance(); + onChanged(); + } else { + closedGroupUpdateBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00001000); + return this; + } + /** + * optional .signalservice.ClosedGroupUpdate closedGroupUpdate = 103; + * + *
+       * Loki
+       * 
+ */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.Builder getClosedGroupUpdateBuilder() { + bitField0_ |= 0x00001000; + onChanged(); + return getClosedGroupUpdateFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.ClosedGroupUpdate closedGroupUpdate = 103; + * + *
+       * Loki
+       * 
+ */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdateOrBuilder getClosedGroupUpdateOrBuilder() { + if (closedGroupUpdateBuilder_ != null) { + return closedGroupUpdateBuilder_.getMessageOrBuilder(); + } else { + return closedGroupUpdate_; + } + } + /** + * optional .signalservice.ClosedGroupUpdate closedGroupUpdate = 103; + * + *
+       * Loki
+       * 
+ */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate, org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdateOrBuilder> + getClosedGroupUpdateFieldBuilder() { + if (closedGroupUpdateBuilder_ == null) { + closedGroupUpdateBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate, org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdateOrBuilder>( + closedGroupUpdate_, + getParentForChildren(), + isClean()); + closedGroupUpdate_ = null; + } + return closedGroupUpdateBuilder_; + } + + // @@protoc_insertion_point(builder_scope:signalservice.DataMessage) + } + + static { + defaultInstance = new DataMessage(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.DataMessage) + } + + public interface LokiUserProfileOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional string displayName = 1; + /** + * optional string displayName = 1; + */ + boolean hasDisplayName(); + /** + * optional string displayName = 1; + */ + String getDisplayName(); + /** + * optional string displayName = 1; + */ + com.google.protobuf.ByteString + getDisplayNameBytes(); + + // optional string profilePictureURL = 2; + /** + * optional string profilePictureURL = 2; + */ + boolean hasProfilePictureURL(); + /** + * optional string profilePictureURL = 2; + */ + String getProfilePictureURL(); + /** + * optional string profilePictureURL = 2; + */ + com.google.protobuf.ByteString + getProfilePictureURLBytes(); + } + /** + * Protobuf type {@code signalservice.LokiUserProfile} + */ + public static final class LokiUserProfile extends + com.google.protobuf.GeneratedMessage + implements LokiUserProfileOrBuilder { + // Use LokiUserProfile.newBuilder() to construct. + private LokiUserProfile(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private LokiUserProfile(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final LokiUserProfile defaultInstance; + public static LokiUserProfile getDefaultInstance() { + return defaultInstance; + } + + public LokiUserProfile getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private LokiUserProfile( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + displayName_ = input.readBytes(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + profilePictureURL_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_LokiUserProfile_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_LokiUserProfile_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile.class, org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public LokiUserProfile parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new LokiUserProfile(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional string displayName = 1; + public static final int DISPLAYNAME_FIELD_NUMBER = 1; + private Object displayName_; + /** + * optional string displayName = 1; + */ + public boolean hasDisplayName() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string displayName = 1; + */ + public String getDisplayName() { + Object ref = displayName_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + displayName_ = s; + } + return s; + } + } + /** + * optional string displayName = 1; + */ + public com.google.protobuf.ByteString + getDisplayNameBytes() { + Object ref = displayName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + displayName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional string profilePictureURL = 2; + public static final int PROFILEPICTUREURL_FIELD_NUMBER = 2; + private Object profilePictureURL_; + /** + * optional string profilePictureURL = 2; + */ + public boolean hasProfilePictureURL() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string profilePictureURL = 2; + */ + public String getProfilePictureURL() { + Object ref = profilePictureURL_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + profilePictureURL_ = s; + } + return s; + } + } + /** + * optional string profilePictureURL = 2; + */ + public com.google.protobuf.ByteString + getProfilePictureURLBytes() { + Object ref = profilePictureURL_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + profilePictureURL_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private void initFields() { + displayName_ = ""; + profilePictureURL_ = ""; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getDisplayNameBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, getProfilePictureURLBytes()); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getDisplayNameBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, getProfilePictureURLBytes()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.LokiUserProfile} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfileOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_LokiUserProfile_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_LokiUserProfile_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile.class, org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + displayName_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + profilePictureURL_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_LokiUserProfile_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile result = new org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.displayName_ = displayName_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.profilePictureURL_ = profilePictureURL_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile.getDefaultInstance()) return this; + if (other.hasDisplayName()) { + bitField0_ |= 0x00000001; + displayName_ = other.displayName_; + onChanged(); + } + if (other.hasProfilePictureURL()) { + bitField0_ |= 0x00000002; + profilePictureURL_ = other.profilePictureURL_; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.LokiUserProfile) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional string displayName = 1; + private Object displayName_ = ""; + /** + * optional string displayName = 1; + */ + public boolean hasDisplayName() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string displayName = 1; + */ + public String getDisplayName() { + Object ref = displayName_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + displayName_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string displayName = 1; + */ + public com.google.protobuf.ByteString + getDisplayNameBytes() { + Object ref = displayName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + displayName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string displayName = 1; + */ + public Builder setDisplayName( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + displayName_ = value; + onChanged(); + return this; + } + /** + * optional string displayName = 1; + */ + public Builder clearDisplayName() { + bitField0_ = (bitField0_ & ~0x00000001); + displayName_ = getDefaultInstance().getDisplayName(); + onChanged(); + return this; + } + /** + * optional string displayName = 1; + */ + public Builder setDisplayNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + displayName_ = value; + onChanged(); + return this; + } + + // optional string profilePictureURL = 2; + private Object profilePictureURL_ = ""; + /** + * optional string profilePictureURL = 2; + */ + public boolean hasProfilePictureURL() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string profilePictureURL = 2; + */ + public String getProfilePictureURL() { + Object ref = profilePictureURL_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + profilePictureURL_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string profilePictureURL = 2; + */ + public com.google.protobuf.ByteString + getProfilePictureURLBytes() { + Object ref = profilePictureURL_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + profilePictureURL_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string profilePictureURL = 2; + */ + public Builder setProfilePictureURL( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + profilePictureURL_ = value; + onChanged(); + return this; + } + /** + * optional string profilePictureURL = 2; + */ + public Builder clearProfilePictureURL() { + bitField0_ = (bitField0_ & ~0x00000002); + profilePictureURL_ = getDefaultInstance().getProfilePictureURL(); + onChanged(); + return this; + } + /** + * optional string profilePictureURL = 2; + */ + public Builder setProfilePictureURLBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + profilePictureURL_ = value; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.LokiUserProfile) + } + + static { + defaultInstance = new LokiUserProfile(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.LokiUserProfile) + } + + public interface ClosedGroupUpdateOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional string name = 1; + /** + * optional string name = 1; + */ + boolean hasName(); + /** + * optional string name = 1; + */ + String getName(); + /** + * optional string name = 1; + */ + com.google.protobuf.ByteString + getNameBytes(); + + // optional bytes groupPublicKey = 2; + /** + * optional bytes groupPublicKey = 2; + * + *
+     * @required
+     * 
+ */ + boolean hasGroupPublicKey(); + /** + * optional bytes groupPublicKey = 2; + * + *
+     * @required
+     * 
+ */ + com.google.protobuf.ByteString getGroupPublicKey(); + + // optional bytes groupPrivateKey = 3; + /** + * optional bytes groupPrivateKey = 3; + */ + boolean hasGroupPrivateKey(); + /** + * optional bytes groupPrivateKey = 3; + */ + com.google.protobuf.ByteString getGroupPrivateKey(); + + // repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + /** + * repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + */ + java.util.List + getSenderKeysList(); + /** + * repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey getSenderKeys(int index); + /** + * repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + */ + int getSenderKeysCount(); + /** + * repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + */ + java.util.List + getSenderKeysOrBuilderList(); + /** + * repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKeyOrBuilder getSenderKeysOrBuilder( + int index); + + // repeated bytes members = 5; + /** + * repeated bytes members = 5; + */ + java.util.List getMembersList(); + /** + * repeated bytes members = 5; + */ + int getMembersCount(); + /** + * repeated bytes members = 5; + */ + com.google.protobuf.ByteString getMembers(int index); + + // repeated bytes admins = 6; + /** + * repeated bytes admins = 6; + */ + java.util.List getAdminsList(); + /** + * repeated bytes admins = 6; + */ + int getAdminsCount(); + /** + * repeated bytes admins = 6; + */ + com.google.protobuf.ByteString getAdmins(int index); + + // optional .signalservice.ClosedGroupUpdate.Type type = 7; + /** + * optional .signalservice.ClosedGroupUpdate.Type type = 7; + * + *
+     * @required
+     * 
+ */ + boolean hasType(); + /** + * optional .signalservice.ClosedGroupUpdate.Type type = 7; + * + *
+     * @required
+     * 
+ */ + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.Type getType(); + } + /** + * Protobuf type {@code signalservice.ClosedGroupUpdate} + * + *
+   * Loki
+   * 
+ */ + public static final class ClosedGroupUpdate extends + com.google.protobuf.GeneratedMessage + implements ClosedGroupUpdateOrBuilder { + // Use ClosedGroupUpdate.newBuilder() to construct. + private ClosedGroupUpdate(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private ClosedGroupUpdate(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final ClosedGroupUpdate defaultInstance; + public static ClosedGroupUpdate getDefaultInstance() { + return defaultInstance; + } + + public ClosedGroupUpdate getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private ClosedGroupUpdate( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + name_ = input.readBytes(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + groupPublicKey_ = input.readBytes(); + break; + } + case 26: { + bitField0_ |= 0x00000004; + groupPrivateKey_ = input.readBytes(); + break; + } + case 34: { + if (!((mutable_bitField0_ & 0x00000008) == 0x00000008)) { + senderKeys_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000008; + } + senderKeys_.add(input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey.PARSER, extensionRegistry)); + break; + } + case 42: { + if (!((mutable_bitField0_ & 0x00000010) == 0x00000010)) { + members_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000010; + } + members_.add(input.readBytes()); + break; + } + case 50: { + if (!((mutable_bitField0_ & 0x00000020) == 0x00000020)) { + admins_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000020; + } + admins_.add(input.readBytes()); + break; + } + case 56: { + int rawValue = input.readEnum(); + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.Type value = org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.Type.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(7, rawValue); + } else { + bitField0_ |= 0x00000008; + type_ = value; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000008) == 0x00000008)) { + senderKeys_ = java.util.Collections.unmodifiableList(senderKeys_); + } + if (((mutable_bitField0_ & 0x00000010) == 0x00000010)) { + members_ = java.util.Collections.unmodifiableList(members_); + } + if (((mutable_bitField0_ & 0x00000020) == 0x00000020)) { + admins_ = java.util.Collections.unmodifiableList(admins_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ClosedGroupUpdate_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ClosedGroupUpdate_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.class, org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public ClosedGroupUpdate parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new ClosedGroupUpdate(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + /** + * Protobuf enum {@code signalservice.ClosedGroupUpdate.Type} + */ + public enum Type + implements com.google.protobuf.ProtocolMessageEnum { + /** + * NEW = 0; + * + *
+       * groupPublicKey, name, groupPrivateKey, senderKeys, members, admins
+       * 
+ */ + NEW(0, 0), + /** + * INFO = 1; + * + *
+       * groupPublicKey, name, senderKeys, members, admins
+       * 
+ */ + INFO(1, 1), + /** + * SENDER_KEY_REQUEST = 2; + * + *
+       * groupPublicKey
+       * 
+ */ + SENDER_KEY_REQUEST(2, 2), + /** + * SENDER_KEY = 3; + * + *
+       * groupPublicKey, senderKeys
+       * 
+ */ + SENDER_KEY(3, 3), + ; + + /** + * NEW = 0; + * + *
+       * groupPublicKey, name, groupPrivateKey, senderKeys, members, admins
+       * 
+ */ + public static final int NEW_VALUE = 0; + /** + * INFO = 1; + * + *
+       * groupPublicKey, name, senderKeys, members, admins
+       * 
+ */ + public static final int INFO_VALUE = 1; + /** + * SENDER_KEY_REQUEST = 2; + * + *
+       * groupPublicKey
+       * 
+ */ + public static final int SENDER_KEY_REQUEST_VALUE = 2; + /** + * SENDER_KEY = 3; + * + *
+       * groupPublicKey, senderKeys
+       * 
+ */ + public static final int SENDER_KEY_VALUE = 3; + + + public final int getNumber() { return value; } + + public static Type valueOf(int value) { + switch (value) { + case 0: return NEW; + case 1: return INFO; + case 2: return SENDER_KEY_REQUEST; + case 3: return SENDER_KEY; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static com.google.protobuf.Internal.EnumLiteMap + internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Type findValueByNumber(int number) { + return Type.valueOf(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(index); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.getDescriptor().getEnumTypes().get(0); + } + + private static final Type[] VALUES = values(); + + public static Type valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int index; + private final int value; + + private Type(int index, int value) { + this.index = index; + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:signalservice.ClosedGroupUpdate.Type) + } + + public interface SenderKeyOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional bytes chainKey = 1; + /** + * optional bytes chainKey = 1; + * + *
+       * @required
+       * 
+ */ + boolean hasChainKey(); + /** + * optional bytes chainKey = 1; + * + *
+       * @required
+       * 
+ */ + com.google.protobuf.ByteString getChainKey(); + + // optional uint32 keyIndex = 2; + /** + * optional uint32 keyIndex = 2; + * + *
+       * @required
+       * 
+ */ + boolean hasKeyIndex(); + /** + * optional uint32 keyIndex = 2; + * + *
+       * @required
+       * 
+ */ + int getKeyIndex(); + + // optional bytes publicKey = 3; + /** + * optional bytes publicKey = 3; + * + *
+       * @required
+       * 
+ */ + boolean hasPublicKey(); + /** + * optional bytes publicKey = 3; + * + *
+       * @required
+       * 
+ */ + com.google.protobuf.ByteString getPublicKey(); + } + /** + * Protobuf type {@code signalservice.ClosedGroupUpdate.SenderKey} + */ + public static final class SenderKey extends + com.google.protobuf.GeneratedMessage + implements SenderKeyOrBuilder { + // Use SenderKey.newBuilder() to construct. + private SenderKey(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private SenderKey(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final SenderKey defaultInstance; + public static SenderKey getDefaultInstance() { + return defaultInstance; + } + + public SenderKey getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private SenderKey( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + chainKey_ = input.readBytes(); + break; + } + case 16: { + bitField0_ |= 0x00000002; + keyIndex_ = input.readUInt32(); + break; + } + case 26: { + bitField0_ |= 0x00000004; + publicKey_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ClosedGroupUpdate_SenderKey_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ClosedGroupUpdate_SenderKey_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey.class, org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public SenderKey parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new SenderKey(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional bytes chainKey = 1; + public static final int CHAINKEY_FIELD_NUMBER = 1; + private com.google.protobuf.ByteString chainKey_; + /** + * optional bytes chainKey = 1; + * + *
+       * @required
+       * 
+ */ + public boolean hasChainKey() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes chainKey = 1; + * + *
+       * @required
+       * 
+ */ + public com.google.protobuf.ByteString getChainKey() { + return chainKey_; + } + + // optional uint32 keyIndex = 2; + public static final int KEYINDEX_FIELD_NUMBER = 2; + private int keyIndex_; + /** + * optional uint32 keyIndex = 2; + * + *
+       * @required
+       * 
+ */ + public boolean hasKeyIndex() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional uint32 keyIndex = 2; + * + *
+       * @required
+       * 
+ */ + public int getKeyIndex() { + return keyIndex_; + } + + // optional bytes publicKey = 3; + public static final int PUBLICKEY_FIELD_NUMBER = 3; + private com.google.protobuf.ByteString publicKey_; + /** + * optional bytes publicKey = 3; + * + *
+       * @required
+       * 
+ */ + public boolean hasPublicKey() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes publicKey = 3; + * + *
+       * @required
+       * 
+ */ + public com.google.protobuf.ByteString getPublicKey() { + return publicKey_; + } + + private void initFields() { + chainKey_ = com.google.protobuf.ByteString.EMPTY; + keyIndex_ = 0; + publicKey_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, chainKey_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeUInt32(2, keyIndex_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(3, publicKey_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, chainKey_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(2, keyIndex_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, publicKey_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.ClosedGroupUpdate.SenderKey} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKeyOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ClosedGroupUpdate_SenderKey_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ClosedGroupUpdate_SenderKey_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey.class, org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + chainKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + keyIndex_ = 0; + bitField0_ = (bitField0_ & ~0x00000002); + publicKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ClosedGroupUpdate_SenderKey_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey result = new org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.chainKey_ = chainKey_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.keyIndex_ = keyIndex_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.publicKey_ = publicKey_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey.getDefaultInstance()) return this; + if (other.hasChainKey()) { + setChainKey(other.getChainKey()); + } + if (other.hasKeyIndex()) { + setKeyIndex(other.getKeyIndex()); + } + if (other.hasPublicKey()) { + setPublicKey(other.getPublicKey()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional bytes chainKey = 1; + private com.google.protobuf.ByteString chainKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes chainKey = 1; + * + *
+         * @required
+         * 
+ */ + public boolean hasChainKey() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes chainKey = 1; + * + *
+         * @required
+         * 
+ */ + public com.google.protobuf.ByteString getChainKey() { + return chainKey_; + } + /** + * optional bytes chainKey = 1; + * + *
+         * @required
+         * 
+ */ + public Builder setChainKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + chainKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes chainKey = 1; + * + *
+         * @required
+         * 
+ */ + public Builder clearChainKey() { + bitField0_ = (bitField0_ & ~0x00000001); + chainKey_ = getDefaultInstance().getChainKey(); + onChanged(); + return this; + } + + // optional uint32 keyIndex = 2; + private int keyIndex_ ; + /** + * optional uint32 keyIndex = 2; + * + *
+         * @required
+         * 
+ */ + public boolean hasKeyIndex() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional uint32 keyIndex = 2; + * + *
+         * @required
+         * 
+ */ + public int getKeyIndex() { + return keyIndex_; + } + /** + * optional uint32 keyIndex = 2; + * + *
+         * @required
+         * 
+ */ + public Builder setKeyIndex(int value) { + bitField0_ |= 0x00000002; + keyIndex_ = value; + onChanged(); + return this; + } + /** + * optional uint32 keyIndex = 2; + * + *
+         * @required
+         * 
+ */ + public Builder clearKeyIndex() { + bitField0_ = (bitField0_ & ~0x00000002); + keyIndex_ = 0; + onChanged(); + return this; + } + + // optional bytes publicKey = 3; + private com.google.protobuf.ByteString publicKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes publicKey = 3; + * + *
+         * @required
+         * 
+ */ + public boolean hasPublicKey() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes publicKey = 3; + * + *
+         * @required
+         * 
+ */ + public com.google.protobuf.ByteString getPublicKey() { + return publicKey_; + } + /** + * optional bytes publicKey = 3; + * + *
+         * @required
+         * 
+ */ + public Builder setPublicKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + publicKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes publicKey = 3; + * + *
+         * @required
+         * 
+ */ + public Builder clearPublicKey() { + bitField0_ = (bitField0_ & ~0x00000004); + publicKey_ = getDefaultInstance().getPublicKey(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.ClosedGroupUpdate.SenderKey) + } + + static { + defaultInstance = new SenderKey(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.ClosedGroupUpdate.SenderKey) + } + + private int bitField0_; + // optional string name = 1; + public static final int NAME_FIELD_NUMBER = 1; + private Object name_; + /** + * optional string name = 1; + */ + public boolean hasName() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string name = 1; + */ + public String getName() { + Object ref = name_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } + } + /** + * optional string name = 1; + */ + public com.google.protobuf.ByteString + getNameBytes() { + Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional bytes groupPublicKey = 2; + public static final int GROUPPUBLICKEY_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString groupPublicKey_; + /** + * optional bytes groupPublicKey = 2; + * + *
+     * @required
+     * 
+ */ + public boolean hasGroupPublicKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes groupPublicKey = 2; + * + *
+     * @required
+     * 
+ */ + public com.google.protobuf.ByteString getGroupPublicKey() { + return groupPublicKey_; + } + + // optional bytes groupPrivateKey = 3; + public static final int GROUPPRIVATEKEY_FIELD_NUMBER = 3; + private com.google.protobuf.ByteString groupPrivateKey_; + /** + * optional bytes groupPrivateKey = 3; + */ + public boolean hasGroupPrivateKey() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes groupPrivateKey = 3; + */ + public com.google.protobuf.ByteString getGroupPrivateKey() { + return groupPrivateKey_; + } + + // repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + public static final int SENDERKEYS_FIELD_NUMBER = 4; + private java.util.List senderKeys_; + /** + * repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + */ + public java.util.List getSenderKeysList() { + return senderKeys_; + } + /** + * repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + */ + public java.util.List + getSenderKeysOrBuilderList() { + return senderKeys_; + } + /** + * repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + */ + public int getSenderKeysCount() { + return senderKeys_.size(); + } + /** + * repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey getSenderKeys(int index) { + return senderKeys_.get(index); + } + /** + * repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKeyOrBuilder getSenderKeysOrBuilder( + int index) { + return senderKeys_.get(index); + } + + // repeated bytes members = 5; + public static final int MEMBERS_FIELD_NUMBER = 5; + private java.util.List members_; + /** + * repeated bytes members = 5; + */ + public java.util.List + getMembersList() { + return members_; + } + /** + * repeated bytes members = 5; + */ + public int getMembersCount() { + return members_.size(); + } + /** + * repeated bytes members = 5; + */ + public com.google.protobuf.ByteString getMembers(int index) { + return members_.get(index); + } + + // repeated bytes admins = 6; + public static final int ADMINS_FIELD_NUMBER = 6; + private java.util.List admins_; + /** + * repeated bytes admins = 6; + */ + public java.util.List + getAdminsList() { + return admins_; + } + /** + * repeated bytes admins = 6; + */ + public int getAdminsCount() { + return admins_.size(); + } + /** + * repeated bytes admins = 6; + */ + public com.google.protobuf.ByteString getAdmins(int index) { + return admins_.get(index); + } + + // optional .signalservice.ClosedGroupUpdate.Type type = 7; + public static final int TYPE_FIELD_NUMBER = 7; + private org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.Type type_; + /** + * optional .signalservice.ClosedGroupUpdate.Type type = 7; + * + *
+     * @required
+     * 
+ */ + public boolean hasType() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional .signalservice.ClosedGroupUpdate.Type type = 7; + * + *
+     * @required
+     * 
+ */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.Type getType() { + return type_; + } + + private void initFields() { + name_ = ""; + groupPublicKey_ = com.google.protobuf.ByteString.EMPTY; + groupPrivateKey_ = com.google.protobuf.ByteString.EMPTY; + senderKeys_ = java.util.Collections.emptyList(); + members_ = java.util.Collections.emptyList(); + admins_ = java.util.Collections.emptyList(); + type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.Type.NEW; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getNameBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, groupPublicKey_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(3, groupPrivateKey_); + } + for (int i = 0; i < senderKeys_.size(); i++) { + output.writeMessage(4, senderKeys_.get(i)); + } + for (int i = 0; i < members_.size(); i++) { + output.writeBytes(5, members_.get(i)); + } + for (int i = 0; i < admins_.size(); i++) { + output.writeBytes(6, admins_.get(i)); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeEnum(7, type_.getNumber()); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getNameBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, groupPublicKey_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, groupPrivateKey_); + } + for (int i = 0; i < senderKeys_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(4, senderKeys_.get(i)); + } + { + int dataSize = 0; + for (int i = 0; i < members_.size(); i++) { + dataSize += com.google.protobuf.CodedOutputStream + .computeBytesSizeNoTag(members_.get(i)); + } + size += dataSize; + size += 1 * getMembersList().size(); + } + { + int dataSize = 0; + for (int i = 0; i < admins_.size(); i++) { + dataSize += com.google.protobuf.CodedOutputStream + .computeBytesSizeNoTag(admins_.get(i)); + } + size += dataSize; + size += 1 * getAdminsList().size(); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(7, type_.getNumber()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.ClosedGroupUpdate} + * + *
+     * Loki
+     * 
+ */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdateOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ClosedGroupUpdate_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ClosedGroupUpdate_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.class, org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getSenderKeysFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + name_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + groupPublicKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + groupPrivateKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000004); + if (senderKeysBuilder_ == null) { + senderKeys_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000008); + } else { + senderKeysBuilder_.clear(); + } + members_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000010); + admins_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000020); + type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.Type.NEW; + bitField0_ = (bitField0_ & ~0x00000040); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ClosedGroupUpdate_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate result = new org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.name_ = name_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.groupPublicKey_ = groupPublicKey_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.groupPrivateKey_ = groupPrivateKey_; + if (senderKeysBuilder_ == null) { + if (((bitField0_ & 0x00000008) == 0x00000008)) { + senderKeys_ = java.util.Collections.unmodifiableList(senderKeys_); + bitField0_ = (bitField0_ & ~0x00000008); + } + result.senderKeys_ = senderKeys_; + } else { + result.senderKeys_ = senderKeysBuilder_.build(); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + members_ = java.util.Collections.unmodifiableList(members_); + bitField0_ = (bitField0_ & ~0x00000010); + } + result.members_ = members_; + if (((bitField0_ & 0x00000020) == 0x00000020)) { + admins_ = java.util.Collections.unmodifiableList(admins_); + bitField0_ = (bitField0_ & ~0x00000020); + } + result.admins_ = admins_; + if (((from_bitField0_ & 0x00000040) == 0x00000040)) { + to_bitField0_ |= 0x00000008; + } + result.type_ = type_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.getDefaultInstance()) return this; + if (other.hasName()) { + bitField0_ |= 0x00000001; + name_ = other.name_; + onChanged(); + } + if (other.hasGroupPublicKey()) { + setGroupPublicKey(other.getGroupPublicKey()); + } + if (other.hasGroupPrivateKey()) { + setGroupPrivateKey(other.getGroupPrivateKey()); + } + if (senderKeysBuilder_ == null) { + if (!other.senderKeys_.isEmpty()) { + if (senderKeys_.isEmpty()) { + senderKeys_ = other.senderKeys_; + bitField0_ = (bitField0_ & ~0x00000008); + } else { + ensureSenderKeysIsMutable(); + senderKeys_.addAll(other.senderKeys_); + } + onChanged(); + } + } else { + if (!other.senderKeys_.isEmpty()) { + if (senderKeysBuilder_.isEmpty()) { + senderKeysBuilder_.dispose(); + senderKeysBuilder_ = null; + senderKeys_ = other.senderKeys_; + bitField0_ = (bitField0_ & ~0x00000008); + senderKeysBuilder_ = + com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ? + getSenderKeysFieldBuilder() : null; + } else { + senderKeysBuilder_.addAllMessages(other.senderKeys_); + } + } + } + if (!other.members_.isEmpty()) { + if (members_.isEmpty()) { + members_ = other.members_; + bitField0_ = (bitField0_ & ~0x00000010); + } else { + ensureMembersIsMutable(); + members_.addAll(other.members_); + } + onChanged(); + } + if (!other.admins_.isEmpty()) { + if (admins_.isEmpty()) { + admins_ = other.admins_; + bitField0_ = (bitField0_ & ~0x00000020); + } else { + ensureAdminsIsMutable(); + admins_.addAll(other.admins_); + } + onChanged(); + } + if (other.hasType()) { + setType(other.getType()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional string name = 1; + private Object name_ = ""; + /** + * optional string name = 1; + */ + public boolean hasName() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string name = 1; + */ + public String getName() { + Object ref = name_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + name_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string name = 1; + */ + public com.google.protobuf.ByteString + getNameBytes() { + Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string name = 1; + */ + public Builder setName( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + name_ = value; + onChanged(); + return this; + } + /** + * optional string name = 1; + */ + public Builder clearName() { + bitField0_ = (bitField0_ & ~0x00000001); + name_ = getDefaultInstance().getName(); + onChanged(); + return this; + } + /** + * optional string name = 1; + */ + public Builder setNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + name_ = value; + onChanged(); + return this; + } + + // optional bytes groupPublicKey = 2; + private com.google.protobuf.ByteString groupPublicKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes groupPublicKey = 2; + * + *
+       * @required
+       * 
+ */ + public boolean hasGroupPublicKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes groupPublicKey = 2; + * + *
+       * @required
+       * 
+ */ + public com.google.protobuf.ByteString getGroupPublicKey() { + return groupPublicKey_; + } + /** + * optional bytes groupPublicKey = 2; + * + *
+       * @required
+       * 
+ */ + public Builder setGroupPublicKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + groupPublicKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes groupPublicKey = 2; + * + *
+       * @required
+       * 
+ */ + public Builder clearGroupPublicKey() { + bitField0_ = (bitField0_ & ~0x00000002); + groupPublicKey_ = getDefaultInstance().getGroupPublicKey(); + onChanged(); + return this; + } + + // optional bytes groupPrivateKey = 3; + private com.google.protobuf.ByteString groupPrivateKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes groupPrivateKey = 3; + */ + public boolean hasGroupPrivateKey() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes groupPrivateKey = 3; + */ + public com.google.protobuf.ByteString getGroupPrivateKey() { + return groupPrivateKey_; + } + /** + * optional bytes groupPrivateKey = 3; + */ + public Builder setGroupPrivateKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + groupPrivateKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes groupPrivateKey = 3; + */ + public Builder clearGroupPrivateKey() { + bitField0_ = (bitField0_ & ~0x00000004); + groupPrivateKey_ = getDefaultInstance().getGroupPrivateKey(); + onChanged(); + return this; + } + + // repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + private java.util.List senderKeys_ = + java.util.Collections.emptyList(); + private void ensureSenderKeysIsMutable() { + if (!((bitField0_ & 0x00000008) == 0x00000008)) { + senderKeys_ = new java.util.ArrayList(senderKeys_); + bitField0_ |= 0x00000008; + } + } + + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey, org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKeyOrBuilder> senderKeysBuilder_; + + /** + * repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + */ + public java.util.List getSenderKeysList() { + if (senderKeysBuilder_ == null) { + return java.util.Collections.unmodifiableList(senderKeys_); + } else { + return senderKeysBuilder_.getMessageList(); + } + } + /** + * repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + */ + public int getSenderKeysCount() { + if (senderKeysBuilder_ == null) { + return senderKeys_.size(); + } else { + return senderKeysBuilder_.getCount(); + } + } + /** + * repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey getSenderKeys(int index) { + if (senderKeysBuilder_ == null) { + return senderKeys_.get(index); + } else { + return senderKeysBuilder_.getMessage(index); + } + } + /** + * repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + */ + public Builder setSenderKeys( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey value) { + if (senderKeysBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureSenderKeysIsMutable(); + senderKeys_.set(index, value); + onChanged(); + } else { + senderKeysBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + */ + public Builder setSenderKeys( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey.Builder builderForValue) { + if (senderKeysBuilder_ == null) { + ensureSenderKeysIsMutable(); + senderKeys_.set(index, builderForValue.build()); + onChanged(); + } else { + senderKeysBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + */ + public Builder addSenderKeys(org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey value) { + if (senderKeysBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureSenderKeysIsMutable(); + senderKeys_.add(value); + onChanged(); + } else { + senderKeysBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + */ + public Builder addSenderKeys( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey value) { + if (senderKeysBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureSenderKeysIsMutable(); + senderKeys_.add(index, value); + onChanged(); + } else { + senderKeysBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + */ + public Builder addSenderKeys( + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey.Builder builderForValue) { + if (senderKeysBuilder_ == null) { + ensureSenderKeysIsMutable(); + senderKeys_.add(builderForValue.build()); + onChanged(); + } else { + senderKeysBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + */ + public Builder addSenderKeys( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey.Builder builderForValue) { + if (senderKeysBuilder_ == null) { + ensureSenderKeysIsMutable(); + senderKeys_.add(index, builderForValue.build()); + onChanged(); + } else { + senderKeysBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + */ + public Builder addAllSenderKeys( + Iterable values) { + if (senderKeysBuilder_ == null) { + ensureSenderKeysIsMutable(); + super.addAll(values, senderKeys_); + onChanged(); + } else { + senderKeysBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + */ + public Builder clearSenderKeys() { + if (senderKeysBuilder_ == null) { + senderKeys_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000008); + onChanged(); + } else { + senderKeysBuilder_.clear(); + } + return this; + } + /** + * repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + */ + public Builder removeSenderKeys(int index) { + if (senderKeysBuilder_ == null) { + ensureSenderKeysIsMutable(); + senderKeys_.remove(index); + onChanged(); + } else { + senderKeysBuilder_.remove(index); + } + return this; + } + /** + * repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey.Builder getSenderKeysBuilder( + int index) { + return getSenderKeysFieldBuilder().getBuilder(index); + } + /** + * repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKeyOrBuilder getSenderKeysOrBuilder( + int index) { + if (senderKeysBuilder_ == null) { + return senderKeys_.get(index); } else { + return senderKeysBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + */ + public java.util.List + getSenderKeysOrBuilderList() { + if (senderKeysBuilder_ != null) { + return senderKeysBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(senderKeys_); + } + } + /** + * repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey.Builder addSenderKeysBuilder() { + return getSenderKeysFieldBuilder().addBuilder( + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey.getDefaultInstance()); + } + /** + * repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey.Builder addSenderKeysBuilder( + int index) { + return getSenderKeysFieldBuilder().addBuilder( + index, org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey.getDefaultInstance()); + } + /** + * repeated .signalservice.ClosedGroupUpdate.SenderKey senderKeys = 4; + */ + public java.util.List + getSenderKeysBuilderList() { + return getSenderKeysFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey, org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKeyOrBuilder> + getSenderKeysFieldBuilder() { + if (senderKeysBuilder_ == null) { + senderKeysBuilder_ = new com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey, org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKey.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.SenderKeyOrBuilder>( + senderKeys_, + ((bitField0_ & 0x00000008) == 0x00000008), + getParentForChildren(), + isClean()); + senderKeys_ = null; + } + return senderKeysBuilder_; + } + + // repeated bytes members = 5; + private java.util.List members_ = java.util.Collections.emptyList(); + private void ensureMembersIsMutable() { + if (!((bitField0_ & 0x00000010) == 0x00000010)) { + members_ = new java.util.ArrayList(members_); + bitField0_ |= 0x00000010; + } + } + /** + * repeated bytes members = 5; + */ + public java.util.List + getMembersList() { + return java.util.Collections.unmodifiableList(members_); + } + /** + * repeated bytes members = 5; + */ + public int getMembersCount() { + return members_.size(); + } + /** + * repeated bytes members = 5; + */ + public com.google.protobuf.ByteString getMembers(int index) { + return members_.get(index); + } + /** + * repeated bytes members = 5; + */ + public Builder setMembers( + int index, com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + ensureMembersIsMutable(); + members_.set(index, value); + onChanged(); + return this; + } + /** + * repeated bytes members = 5; + */ + public Builder addMembers(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + ensureMembersIsMutable(); + members_.add(value); + onChanged(); + return this; + } + /** + * repeated bytes members = 5; + */ + public Builder addAllMembers( + Iterable values) { + ensureMembersIsMutable(); + super.addAll(values, members_); + onChanged(); + return this; + } + /** + * repeated bytes members = 5; + */ + public Builder clearMembers() { + members_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000010); + onChanged(); + return this; + } + + // repeated bytes admins = 6; + private java.util.List admins_ = java.util.Collections.emptyList(); + private void ensureAdminsIsMutable() { + if (!((bitField0_ & 0x00000020) == 0x00000020)) { + admins_ = new java.util.ArrayList(admins_); + bitField0_ |= 0x00000020; + } + } + /** + * repeated bytes admins = 6; + */ + public java.util.List + getAdminsList() { + return java.util.Collections.unmodifiableList(admins_); + } + /** + * repeated bytes admins = 6; + */ + public int getAdminsCount() { + return admins_.size(); + } + /** + * repeated bytes admins = 6; + */ + public com.google.protobuf.ByteString getAdmins(int index) { + return admins_.get(index); + } + /** + * repeated bytes admins = 6; + */ + public Builder setAdmins( + int index, com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + ensureAdminsIsMutable(); + admins_.set(index, value); + onChanged(); + return this; + } + /** + * repeated bytes admins = 6; + */ + public Builder addAdmins(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + ensureAdminsIsMutable(); + admins_.add(value); + onChanged(); + return this; + } + /** + * repeated bytes admins = 6; + */ + public Builder addAllAdmins( + Iterable values) { + ensureAdminsIsMutable(); + super.addAll(values, admins_); + onChanged(); + return this; + } + /** + * repeated bytes admins = 6; + */ + public Builder clearAdmins() { + admins_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000020); + onChanged(); + return this; + } + + // optional .signalservice.ClosedGroupUpdate.Type type = 7; + private org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.Type type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.Type.NEW; + /** + * optional .signalservice.ClosedGroupUpdate.Type type = 7; + * + *
+       * @required
+       * 
+ */ + public boolean hasType() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * optional .signalservice.ClosedGroupUpdate.Type type = 7; + * + *
+       * @required
+       * 
+ */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.Type getType() { + return type_; + } + /** + * optional .signalservice.ClosedGroupUpdate.Type type = 7; + * + *
+       * @required
+       * 
+ */ + public Builder setType(org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.Type value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000040; + type_ = value; + onChanged(); + return this; + } + /** + * optional .signalservice.ClosedGroupUpdate.Type type = 7; + * + *
+       * @required
+       * 
+ */ + public Builder clearType() { + bitField0_ = (bitField0_ & ~0x00000040); + type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.ClosedGroupUpdate.Type.NEW; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.ClosedGroupUpdate) + } + + static { + defaultInstance = new ClosedGroupUpdate(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.ClosedGroupUpdate) + } + + public interface NullMessageOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional bytes padding = 1; + /** + * optional bytes padding = 1; + */ + boolean hasPadding(); + /** + * optional bytes padding = 1; + */ + com.google.protobuf.ByteString getPadding(); + } + /** + * Protobuf type {@code signalservice.NullMessage} + */ + public static final class NullMessage extends + com.google.protobuf.GeneratedMessage + implements NullMessageOrBuilder { + // Use NullMessage.newBuilder() to construct. + private NullMessage(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private NullMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final NullMessage defaultInstance; + public static NullMessage getDefaultInstance() { + return defaultInstance; + } + + public NullMessage getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private NullMessage( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + padding_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_NullMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_NullMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage.class, org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public NullMessage parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new NullMessage(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional bytes padding = 1; + public static final int PADDING_FIELD_NUMBER = 1; + private com.google.protobuf.ByteString padding_; + /** + * optional bytes padding = 1; + */ + public boolean hasPadding() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes padding = 1; + */ + public com.google.protobuf.ByteString getPadding() { + return padding_; + } + + private void initFields() { + padding_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, padding_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, padding_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.NullMessage} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_NullMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_NullMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage.class, org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + padding_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_NullMessage_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage result = new org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.padding_ = padding_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage.getDefaultInstance()) return this; + if (other.hasPadding()) { + setPadding(other.getPadding()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.NullMessage) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional bytes padding = 1; + private com.google.protobuf.ByteString padding_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes padding = 1; + */ + public boolean hasPadding() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes padding = 1; + */ + public com.google.protobuf.ByteString getPadding() { + return padding_; + } + /** + * optional bytes padding = 1; + */ + public Builder setPadding(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + padding_ = value; + onChanged(); + return this; + } + /** + * optional bytes padding = 1; + */ + public Builder clearPadding() { + bitField0_ = (bitField0_ & ~0x00000001); + padding_ = getDefaultInstance().getPadding(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.NullMessage) + } + + static { + defaultInstance = new NullMessage(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.NullMessage) + } + + public interface ReceiptMessageOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional .signalservice.ReceiptMessage.Type type = 1; + /** + * optional .signalservice.ReceiptMessage.Type type = 1; + */ + boolean hasType(); + /** + * optional .signalservice.ReceiptMessage.Type type = 1; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.Type getType(); + + // repeated uint64 timestamp = 2; + /** + * repeated uint64 timestamp = 2; + */ + java.util.List getTimestampList(); + /** + * repeated uint64 timestamp = 2; + */ + int getTimestampCount(); + /** + * repeated uint64 timestamp = 2; + */ + long getTimestamp(int index); + } + /** + * Protobuf type {@code signalservice.ReceiptMessage} + */ + public static final class ReceiptMessage extends + com.google.protobuf.GeneratedMessage + implements ReceiptMessageOrBuilder { + // Use ReceiptMessage.newBuilder() to construct. + private ReceiptMessage(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private ReceiptMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final ReceiptMessage defaultInstance; + public static ReceiptMessage getDefaultInstance() { + return defaultInstance; + } + + public ReceiptMessage getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private ReceiptMessage( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + int rawValue = input.readEnum(); + org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.Type value = org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.Type.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(1, rawValue); + } else { + bitField0_ |= 0x00000001; + type_ = value; + } + break; + } + case 16: { + if (!((mutable_bitField0_ & 0x00000002) == 0x00000002)) { + timestamp_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000002; + } + timestamp_.add(input.readUInt64()); + break; + } + case 18: { + int length = input.readRawVarint32(); + int limit = input.pushLimit(length); + if (!((mutable_bitField0_ & 0x00000002) == 0x00000002) && input.getBytesUntilLimit() > 0) { + timestamp_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000002; + } + while (input.getBytesUntilLimit() > 0) { + timestamp_.add(input.readUInt64()); + } + input.popLimit(limit); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000002) == 0x00000002)) { + timestamp_ = java.util.Collections.unmodifiableList(timestamp_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ReceiptMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ReceiptMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.class, org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public ReceiptMessage parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new ReceiptMessage(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + /** + * Protobuf enum {@code signalservice.ReceiptMessage.Type} + */ + public enum Type + implements com.google.protobuf.ProtocolMessageEnum { + /** + * DELIVERY = 0; + */ + DELIVERY(0, 0), + /** + * READ = 1; + */ + READ(1, 1), + ; + + /** + * DELIVERY = 0; + */ + public static final int DELIVERY_VALUE = 0; + /** + * READ = 1; + */ + public static final int READ_VALUE = 1; + + + public final int getNumber() { return value; } + + public static Type valueOf(int value) { + switch (value) { + case 0: return DELIVERY; + case 1: return READ; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static com.google.protobuf.Internal.EnumLiteMap + internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Type findValueByNumber(int number) { + return Type.valueOf(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(index); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.getDescriptor().getEnumTypes().get(0); + } + + private static final Type[] VALUES = values(); + + public static Type valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int index; + private final int value; + + private Type(int index, int value) { + this.index = index; + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:signalservice.ReceiptMessage.Type) + } + + private int bitField0_; + // optional .signalservice.ReceiptMessage.Type type = 1; + public static final int TYPE_FIELD_NUMBER = 1; + private org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.Type type_; + /** + * optional .signalservice.ReceiptMessage.Type type = 1; + */ + public boolean hasType() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional .signalservice.ReceiptMessage.Type type = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.Type getType() { + return type_; + } + + // repeated uint64 timestamp = 2; + public static final int TIMESTAMP_FIELD_NUMBER = 2; + private java.util.List timestamp_; + /** + * repeated uint64 timestamp = 2; + */ + public java.util.List + getTimestampList() { + return timestamp_; + } + /** + * repeated uint64 timestamp = 2; + */ + public int getTimestampCount() { + return timestamp_.size(); + } + /** + * repeated uint64 timestamp = 2; + */ + public long getTimestamp(int index) { + return timestamp_.get(index); + } + + private void initFields() { + type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.Type.DELIVERY; + timestamp_ = java.util.Collections.emptyList(); + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeEnum(1, type_.getNumber()); + } + for (int i = 0; i < timestamp_.size(); i++) { + output.writeUInt64(2, timestamp_.get(i)); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(1, type_.getNumber()); + } + { + int dataSize = 0; + for (int i = 0; i < timestamp_.size(); i++) { + dataSize += com.google.protobuf.CodedOutputStream + .computeUInt64SizeNoTag(timestamp_.get(i)); + } + size += dataSize; + size += 1 * getTimestampList().size(); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.ReceiptMessage} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ReceiptMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ReceiptMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.class, org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.Type.DELIVERY; + bitField0_ = (bitField0_ & ~0x00000001); + timestamp_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ReceiptMessage_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage result = new org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.type_ = type_; + if (((bitField0_ & 0x00000002) == 0x00000002)) { + timestamp_ = java.util.Collections.unmodifiableList(timestamp_); + bitField0_ = (bitField0_ & ~0x00000002); + } + result.timestamp_ = timestamp_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.getDefaultInstance()) return this; + if (other.hasType()) { + setType(other.getType()); + } + if (!other.timestamp_.isEmpty()) { + if (timestamp_.isEmpty()) { + timestamp_ = other.timestamp_; + bitField0_ = (bitField0_ & ~0x00000002); + } else { + ensureTimestampIsMutable(); + timestamp_.addAll(other.timestamp_); + } + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional .signalservice.ReceiptMessage.Type type = 1; + private org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.Type type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.Type.DELIVERY; + /** + * optional .signalservice.ReceiptMessage.Type type = 1; + */ + public boolean hasType() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional .signalservice.ReceiptMessage.Type type = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.Type getType() { + return type_; + } + /** + * optional .signalservice.ReceiptMessage.Type type = 1; + */ + public Builder setType(org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.Type value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + type_ = value; + onChanged(); + return this; + } + /** + * optional .signalservice.ReceiptMessage.Type type = 1; + */ + public Builder clearType() { + bitField0_ = (bitField0_ & ~0x00000001); + type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMessage.Type.DELIVERY; + onChanged(); + return this; + } + + // repeated uint64 timestamp = 2; + private java.util.List timestamp_ = java.util.Collections.emptyList(); + private void ensureTimestampIsMutable() { + if (!((bitField0_ & 0x00000002) == 0x00000002)) { + timestamp_ = new java.util.ArrayList(timestamp_); + bitField0_ |= 0x00000002; + } + } + /** + * repeated uint64 timestamp = 2; + */ + public java.util.List + getTimestampList() { + return java.util.Collections.unmodifiableList(timestamp_); + } + /** + * repeated uint64 timestamp = 2; + */ + public int getTimestampCount() { + return timestamp_.size(); + } + /** + * repeated uint64 timestamp = 2; + */ + public long getTimestamp(int index) { + return timestamp_.get(index); + } + /** + * repeated uint64 timestamp = 2; + */ + public Builder setTimestamp( + int index, long value) { + ensureTimestampIsMutable(); + timestamp_.set(index, value); + onChanged(); + return this; + } + /** + * repeated uint64 timestamp = 2; + */ + public Builder addTimestamp(long value) { + ensureTimestampIsMutable(); + timestamp_.add(value); + onChanged(); + return this; + } + /** + * repeated uint64 timestamp = 2; + */ + public Builder addAllTimestamp( + Iterable values) { + ensureTimestampIsMutable(); + super.addAll(values, timestamp_); + onChanged(); + return this; + } + /** + * repeated uint64 timestamp = 2; + */ + public Builder clearTimestamp() { + timestamp_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.ReceiptMessage) + } + + static { + defaultInstance = new ReceiptMessage(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.ReceiptMessage) + } + + public interface TypingMessageOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional uint64 timestamp = 1; + /** + * optional uint64 timestamp = 1; + */ + boolean hasTimestamp(); + /** + * optional uint64 timestamp = 1; + */ + long getTimestamp(); + + // optional .signalservice.TypingMessage.Action action = 2; + /** + * optional .signalservice.TypingMessage.Action action = 2; + */ + boolean hasAction(); + /** + * optional .signalservice.TypingMessage.Action action = 2; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.Action getAction(); + + // optional bytes groupId = 3; + /** + * optional bytes groupId = 3; + */ + boolean hasGroupId(); + /** + * optional bytes groupId = 3; + */ + com.google.protobuf.ByteString getGroupId(); + } + /** + * Protobuf type {@code signalservice.TypingMessage} + */ + public static final class TypingMessage extends + com.google.protobuf.GeneratedMessage + implements TypingMessageOrBuilder { + // Use TypingMessage.newBuilder() to construct. + private TypingMessage(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private TypingMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final TypingMessage defaultInstance; + public static TypingMessage getDefaultInstance() { + return defaultInstance; + } + + public TypingMessage getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private TypingMessage( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + timestamp_ = input.readUInt64(); + break; + } + case 16: { + int rawValue = input.readEnum(); + org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.Action value = org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.Action.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(2, rawValue); + } else { + bitField0_ |= 0x00000002; + action_ = value; + } + break; + } + case 26: { + bitField0_ |= 0x00000004; + groupId_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_TypingMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_TypingMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.class, org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public TypingMessage parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new TypingMessage(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + /** + * Protobuf enum {@code signalservice.TypingMessage.Action} + */ + public enum Action + implements com.google.protobuf.ProtocolMessageEnum { + /** + * STARTED = 0; + */ + STARTED(0, 0), + /** + * STOPPED = 1; + */ + STOPPED(1, 1), + ; + + /** + * STARTED = 0; + */ + public static final int STARTED_VALUE = 0; + /** + * STOPPED = 1; + */ + public static final int STOPPED_VALUE = 1; + + + public final int getNumber() { return value; } + + public static Action valueOf(int value) { + switch (value) { + case 0: return STARTED; + case 1: return STOPPED; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static com.google.protobuf.Internal.EnumLiteMap + internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Action findValueByNumber(int number) { + return Action.valueOf(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(index); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.getDescriptor().getEnumTypes().get(0); + } + + private static final Action[] VALUES = values(); + + public static Action valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int index; + private final int value; + + private Action(int index, int value) { + this.index = index; + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:signalservice.TypingMessage.Action) + } + + private int bitField0_; + // optional uint64 timestamp = 1; + public static final int TIMESTAMP_FIELD_NUMBER = 1; + private long timestamp_; + /** + * optional uint64 timestamp = 1; + */ + public boolean hasTimestamp() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint64 timestamp = 1; + */ + public long getTimestamp() { + return timestamp_; + } + + // optional .signalservice.TypingMessage.Action action = 2; + public static final int ACTION_FIELD_NUMBER = 2; + private org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.Action action_; + /** + * optional .signalservice.TypingMessage.Action action = 2; + */ + public boolean hasAction() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .signalservice.TypingMessage.Action action = 2; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.Action getAction() { + return action_; + } + + // optional bytes groupId = 3; + public static final int GROUPID_FIELD_NUMBER = 3; + private com.google.protobuf.ByteString groupId_; + /** + * optional bytes groupId = 3; + */ + public boolean hasGroupId() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes groupId = 3; + */ + public com.google.protobuf.ByteString getGroupId() { + return groupId_; + } + + private void initFields() { + timestamp_ = 0L; + action_ = org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.Action.STARTED; + groupId_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt64(1, timestamp_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeEnum(2, action_.getNumber()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(3, groupId_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(1, timestamp_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(2, action_.getNumber()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, groupId_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.TypingMessage} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_TypingMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_TypingMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.class, org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + timestamp_ = 0L; + bitField0_ = (bitField0_ & ~0x00000001); + action_ = org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.Action.STARTED; + bitField0_ = (bitField0_ & ~0x00000002); + groupId_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_TypingMessage_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage result = new org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.timestamp_ = timestamp_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.action_ = action_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.groupId_ = groupId_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.getDefaultInstance()) return this; + if (other.hasTimestamp()) { + setTimestamp(other.getTimestamp()); + } + if (other.hasAction()) { + setAction(other.getAction()); + } + if (other.hasGroupId()) { + setGroupId(other.getGroupId()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional uint64 timestamp = 1; + private long timestamp_ ; + /** + * optional uint64 timestamp = 1; + */ + public boolean hasTimestamp() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint64 timestamp = 1; + */ + public long getTimestamp() { + return timestamp_; + } + /** + * optional uint64 timestamp = 1; + */ + public Builder setTimestamp(long value) { + bitField0_ |= 0x00000001; + timestamp_ = value; + onChanged(); + return this; + } + /** + * optional uint64 timestamp = 1; + */ + public Builder clearTimestamp() { + bitField0_ = (bitField0_ & ~0x00000001); + timestamp_ = 0L; + onChanged(); + return this; + } + + // optional .signalservice.TypingMessage.Action action = 2; + private org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.Action action_ = org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.Action.STARTED; + /** + * optional .signalservice.TypingMessage.Action action = 2; + */ + public boolean hasAction() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .signalservice.TypingMessage.Action action = 2; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.Action getAction() { + return action_; + } + /** + * optional .signalservice.TypingMessage.Action action = 2; + */ + public Builder setAction(org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.Action value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + action_ = value; + onChanged(); + return this; + } + /** + * optional .signalservice.TypingMessage.Action action = 2; + */ + public Builder clearAction() { + bitField0_ = (bitField0_ & ~0x00000002); + action_ = org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage.Action.STARTED; + onChanged(); + return this; + } + + // optional bytes groupId = 3; + private com.google.protobuf.ByteString groupId_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes groupId = 3; + */ + public boolean hasGroupId() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes groupId = 3; + */ + public com.google.protobuf.ByteString getGroupId() { + return groupId_; + } + /** + * optional bytes groupId = 3; + */ + public Builder setGroupId(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + groupId_ = value; + onChanged(); + return this; + } + /** + * optional bytes groupId = 3; + */ + public Builder clearGroupId() { + bitField0_ = (bitField0_ & ~0x00000004); + groupId_ = getDefaultInstance().getGroupId(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.TypingMessage) + } + + static { + defaultInstance = new TypingMessage(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.TypingMessage) + } + + public interface VerifiedOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional string destination = 1; + /** + * optional string destination = 1; + */ + boolean hasDestination(); + /** + * optional string destination = 1; + */ + String getDestination(); + /** + * optional string destination = 1; + */ + com.google.protobuf.ByteString + getDestinationBytes(); + + // optional bytes identityKey = 2; + /** + * optional bytes identityKey = 2; + */ + boolean hasIdentityKey(); + /** + * optional bytes identityKey = 2; + */ + com.google.protobuf.ByteString getIdentityKey(); + + // optional .signalservice.Verified.State state = 3; + /** + * optional .signalservice.Verified.State state = 3; + */ + boolean hasState(); + /** + * optional .signalservice.Verified.State state = 3; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.State getState(); + + // optional bytes nullMessage = 4; + /** + * optional bytes nullMessage = 4; + */ + boolean hasNullMessage(); + /** + * optional bytes nullMessage = 4; + */ + com.google.protobuf.ByteString getNullMessage(); + } + /** + * Protobuf type {@code signalservice.Verified} + */ + public static final class Verified extends + com.google.protobuf.GeneratedMessage + implements VerifiedOrBuilder { + // Use Verified.newBuilder() to construct. + private Verified(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Verified(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Verified defaultInstance; + public static Verified getDefaultInstance() { + return defaultInstance; + } + + public Verified getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Verified( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + destination_ = input.readBytes(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + identityKey_ = input.readBytes(); + break; + } + case 24: { + int rawValue = input.readEnum(); + org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.State value = org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.State.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(3, rawValue); + } else { + bitField0_ |= 0x00000004; + state_ = value; + } + break; + } + case 34: { + bitField0_ |= 0x00000008; + nullMessage_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_Verified_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_Verified_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.class, org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Verified parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Verified(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + /** + * Protobuf enum {@code signalservice.Verified.State} + */ + public enum State + implements com.google.protobuf.ProtocolMessageEnum { + /** + * DEFAULT = 0; + */ + DEFAULT(0, 0), + /** + * VERIFIED = 1; + */ + VERIFIED(1, 1), + /** + * UNVERIFIED = 2; + */ + UNVERIFIED(2, 2), + ; + + /** + * DEFAULT = 0; + */ + public static final int DEFAULT_VALUE = 0; + /** + * VERIFIED = 1; + */ + public static final int VERIFIED_VALUE = 1; + /** + * UNVERIFIED = 2; + */ + public static final int UNVERIFIED_VALUE = 2; + + + public final int getNumber() { return value; } + + public static State valueOf(int value) { + switch (value) { + case 0: return DEFAULT; + case 1: return VERIFIED; + case 2: return UNVERIFIED; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static com.google.protobuf.Internal.EnumLiteMap + internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public State findValueByNumber(int number) { + return State.valueOf(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(index); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.getDescriptor().getEnumTypes().get(0); + } + + private static final State[] VALUES = values(); + + public static State valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int index; + private final int value; + + private State(int index, int value) { + this.index = index; + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:signalservice.Verified.State) + } + + private int bitField0_; + // optional string destination = 1; + public static final int DESTINATION_FIELD_NUMBER = 1; + private Object destination_; + /** + * optional string destination = 1; + */ + public boolean hasDestination() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string destination = 1; + */ + public String getDestination() { + Object ref = destination_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + destination_ = s; + } + return s; + } + } + /** + * optional string destination = 1; + */ + public com.google.protobuf.ByteString + getDestinationBytes() { + Object ref = destination_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + destination_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional bytes identityKey = 2; + public static final int IDENTITYKEY_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString identityKey_; + /** + * optional bytes identityKey = 2; + */ + public boolean hasIdentityKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes identityKey = 2; + */ + public com.google.protobuf.ByteString getIdentityKey() { + return identityKey_; + } + + // optional .signalservice.Verified.State state = 3; + public static final int STATE_FIELD_NUMBER = 3; + private org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.State state_; + /** + * optional .signalservice.Verified.State state = 3; + */ + public boolean hasState() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .signalservice.Verified.State state = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.State getState() { + return state_; + } + + // optional bytes nullMessage = 4; + public static final int NULLMESSAGE_FIELD_NUMBER = 4; + private com.google.protobuf.ByteString nullMessage_; + /** + * optional bytes nullMessage = 4; + */ + public boolean hasNullMessage() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional bytes nullMessage = 4; + */ + public com.google.protobuf.ByteString getNullMessage() { + return nullMessage_; + } + + private void initFields() { + destination_ = ""; + identityKey_ = com.google.protobuf.ByteString.EMPTY; + state_ = org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.State.DEFAULT; + nullMessage_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getDestinationBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, identityKey_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeEnum(3, state_.getNumber()); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeBytes(4, nullMessage_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getDestinationBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, identityKey_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(3, state_.getNumber()); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(4, nullMessage_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.Verified parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.Verified parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.Verified parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.Verified parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.Verified parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.Verified parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.Verified parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.Verified parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.Verified parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.Verified parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.Verified prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.Verified} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.VerifiedOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_Verified_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_Verified_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.class, org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + destination_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + identityKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + state_ = org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.State.DEFAULT; + bitField0_ = (bitField0_ & ~0x00000004); + nullMessage_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_Verified_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.Verified getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.Verified build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.Verified result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.Verified buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.Verified result = new org.session.libsignal.service.internal.push.SignalServiceProtos.Verified(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.destination_ = destination_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.identityKey_ = identityKey_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.state_ = state_; + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000008; + } + result.nullMessage_ = nullMessage_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.Verified) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.Verified)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.Verified other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.getDefaultInstance()) return this; + if (other.hasDestination()) { + bitField0_ |= 0x00000001; + destination_ = other.destination_; + onChanged(); + } + if (other.hasIdentityKey()) { + setIdentityKey(other.getIdentityKey()); + } + if (other.hasState()) { + setState(other.getState()); + } + if (other.hasNullMessage()) { + setNullMessage(other.getNullMessage()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.Verified parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.Verified) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional string destination = 1; + private Object destination_ = ""; + /** + * optional string destination = 1; + */ + public boolean hasDestination() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string destination = 1; + */ + public String getDestination() { + Object ref = destination_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + destination_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string destination = 1; + */ + public com.google.protobuf.ByteString + getDestinationBytes() { + Object ref = destination_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + destination_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string destination = 1; + */ + public Builder setDestination( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + destination_ = value; + onChanged(); + return this; + } + /** + * optional string destination = 1; + */ + public Builder clearDestination() { + bitField0_ = (bitField0_ & ~0x00000001); + destination_ = getDefaultInstance().getDestination(); + onChanged(); + return this; + } + /** + * optional string destination = 1; + */ + public Builder setDestinationBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + destination_ = value; + onChanged(); + return this; + } + + // optional bytes identityKey = 2; + private com.google.protobuf.ByteString identityKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes identityKey = 2; + */ + public boolean hasIdentityKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes identityKey = 2; + */ + public com.google.protobuf.ByteString getIdentityKey() { + return identityKey_; + } + /** + * optional bytes identityKey = 2; + */ + public Builder setIdentityKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + identityKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes identityKey = 2; + */ + public Builder clearIdentityKey() { + bitField0_ = (bitField0_ & ~0x00000002); + identityKey_ = getDefaultInstance().getIdentityKey(); + onChanged(); + return this; + } + + // optional .signalservice.Verified.State state = 3; + private org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.State state_ = org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.State.DEFAULT; + /** + * optional .signalservice.Verified.State state = 3; + */ + public boolean hasState() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .signalservice.Verified.State state = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.State getState() { + return state_; + } + /** + * optional .signalservice.Verified.State state = 3; + */ + public Builder setState(org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.State value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + state_ = value; + onChanged(); + return this; + } + /** + * optional .signalservice.Verified.State state = 3; + */ + public Builder clearState() { + bitField0_ = (bitField0_ & ~0x00000004); + state_ = org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.State.DEFAULT; + onChanged(); + return this; + } + + // optional bytes nullMessage = 4; + private com.google.protobuf.ByteString nullMessage_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes nullMessage = 4; + */ + public boolean hasNullMessage() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional bytes nullMessage = 4; + */ + public com.google.protobuf.ByteString getNullMessage() { + return nullMessage_; + } + /** + * optional bytes nullMessage = 4; + */ + public Builder setNullMessage(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + nullMessage_ = value; + onChanged(); + return this; + } + /** + * optional bytes nullMessage = 4; + */ + public Builder clearNullMessage() { + bitField0_ = (bitField0_ & ~0x00000008); + nullMessage_ = getDefaultInstance().getNullMessage(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.Verified) + } + + static { + defaultInstance = new Verified(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.Verified) + } + + public interface SyncMessageOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional .signalservice.SyncMessage.Sent sent = 1; + /** + * optional .signalservice.SyncMessage.Sent sent = 1; + */ + boolean hasSent(); + /** + * optional .signalservice.SyncMessage.Sent sent = 1; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent getSent(); + /** + * optional .signalservice.SyncMessage.Sent sent = 1; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.SentOrBuilder getSentOrBuilder(); + + // optional .signalservice.SyncMessage.Contacts contacts = 2; + /** + * optional .signalservice.SyncMessage.Contacts contacts = 2; + */ + boolean hasContacts(); + /** + * optional .signalservice.SyncMessage.Contacts contacts = 2; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts getContacts(); + /** + * optional .signalservice.SyncMessage.Contacts contacts = 2; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.ContactsOrBuilder getContactsOrBuilder(); + + // optional .signalservice.SyncMessage.Groups groups = 3; + /** + * optional .signalservice.SyncMessage.Groups groups = 3; + */ + boolean hasGroups(); + /** + * optional .signalservice.SyncMessage.Groups groups = 3; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups getGroups(); + /** + * optional .signalservice.SyncMessage.Groups groups = 3; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.GroupsOrBuilder getGroupsOrBuilder(); + + // optional .signalservice.SyncMessage.Request request = 4; + /** + * optional .signalservice.SyncMessage.Request request = 4; + */ + boolean hasRequest(); + /** + * optional .signalservice.SyncMessage.Request request = 4; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request getRequest(); + /** + * optional .signalservice.SyncMessage.Request request = 4; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.RequestOrBuilder getRequestOrBuilder(); + + // repeated .signalservice.SyncMessage.Read read = 5; + /** + * repeated .signalservice.SyncMessage.Read read = 5; + */ + java.util.List + getReadList(); + /** + * repeated .signalservice.SyncMessage.Read read = 5; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read getRead(int index); + /** + * repeated .signalservice.SyncMessage.Read read = 5; + */ + int getReadCount(); + /** + * repeated .signalservice.SyncMessage.Read read = 5; + */ + java.util.List + getReadOrBuilderList(); + /** + * repeated .signalservice.SyncMessage.Read read = 5; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.ReadOrBuilder getReadOrBuilder( + int index); + + // optional .signalservice.SyncMessage.Blocked blocked = 6; + /** + * optional .signalservice.SyncMessage.Blocked blocked = 6; + */ + boolean hasBlocked(); + /** + * optional .signalservice.SyncMessage.Blocked blocked = 6; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked getBlocked(); + /** + * optional .signalservice.SyncMessage.Blocked blocked = 6; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.BlockedOrBuilder getBlockedOrBuilder(); + + // optional .signalservice.Verified verified = 7; + /** + * optional .signalservice.Verified verified = 7; + */ + boolean hasVerified(); + /** + * optional .signalservice.Verified verified = 7; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.Verified getVerified(); + /** + * optional .signalservice.Verified verified = 7; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.VerifiedOrBuilder getVerifiedOrBuilder(); + + // optional .signalservice.SyncMessage.Configuration configuration = 9; + /** + * optional .signalservice.SyncMessage.Configuration configuration = 9; + */ + boolean hasConfiguration(); + /** + * optional .signalservice.SyncMessage.Configuration configuration = 9; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration getConfiguration(); + /** + * optional .signalservice.SyncMessage.Configuration configuration = 9; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.ConfigurationOrBuilder getConfigurationOrBuilder(); + + // optional bytes padding = 8; + /** + * optional bytes padding = 8; + */ + boolean hasPadding(); + /** + * optional bytes padding = 8; + */ + com.google.protobuf.ByteString getPadding(); + + // repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + /** + * repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + */ + java.util.List + getStickerPackOperationList(); + /** + * repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation getStickerPackOperation(int index); + /** + * repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + */ + int getStickerPackOperationCount(); + /** + * repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + */ + java.util.List + getStickerPackOperationOrBuilderList(); + /** + * repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperationOrBuilder getStickerPackOperationOrBuilder( + int index); + + // repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + /** + * repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + */ + java.util.List + getOpenGroupsList(); + /** + * repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails getOpenGroups(int index); + /** + * repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + */ + int getOpenGroupsCount(); + /** + * repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + */ + java.util.List + getOpenGroupsOrBuilderList(); + /** + * repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetailsOrBuilder getOpenGroupsOrBuilder( + int index); + } + /** + * Protobuf type {@code signalservice.SyncMessage} + */ + public static final class SyncMessage extends + com.google.protobuf.GeneratedMessage + implements SyncMessageOrBuilder { + // Use SyncMessage.newBuilder() to construct. + private SyncMessage(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private SyncMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final SyncMessage defaultInstance; + public static SyncMessage getDefaultInstance() { + return defaultInstance; + } + + public SyncMessage getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private SyncMessage( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.Builder subBuilder = null; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + subBuilder = sent_.toBuilder(); + } + sent_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(sent_); + sent_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000001; + break; + } + case 18: { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts.Builder subBuilder = null; + if (((bitField0_ & 0x00000002) == 0x00000002)) { + subBuilder = contacts_.toBuilder(); + } + contacts_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(contacts_); + contacts_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000002; + break; + } + case 26: { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups.Builder subBuilder = null; + if (((bitField0_ & 0x00000004) == 0x00000004)) { + subBuilder = groups_.toBuilder(); + } + groups_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(groups_); + groups_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000004; + break; + } + case 34: { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.Builder subBuilder = null; + if (((bitField0_ & 0x00000008) == 0x00000008)) { + subBuilder = request_.toBuilder(); + } + request_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(request_); + request_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000008; + break; + } + case 42: { + if (!((mutable_bitField0_ & 0x00000010) == 0x00000010)) { + read_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000010; + } + read_.add(input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read.PARSER, extensionRegistry)); + break; + } + case 50: { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked.Builder subBuilder = null; + if (((bitField0_ & 0x00000010) == 0x00000010)) { + subBuilder = blocked_.toBuilder(); + } + blocked_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(blocked_); + blocked_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000010; + break; + } + case 58: { + org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.Builder subBuilder = null; + if (((bitField0_ & 0x00000020) == 0x00000020)) { + subBuilder = verified_.toBuilder(); + } + verified_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(verified_); + verified_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000020; + break; + } + case 66: { + bitField0_ |= 0x00000080; + padding_ = input.readBytes(); + break; + } + case 74: { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration.Builder subBuilder = null; + if (((bitField0_ & 0x00000040) == 0x00000040)) { + subBuilder = configuration_.toBuilder(); + } + configuration_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(configuration_); + configuration_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000040; + break; + } + case 82: { + if (!((mutable_bitField0_ & 0x00000200) == 0x00000200)) { + stickerPackOperation_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000200; + } + stickerPackOperation_.add(input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.PARSER, extensionRegistry)); + break; + } + case 802: { + if (!((mutable_bitField0_ & 0x00000400) == 0x00000400)) { + openGroups_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000400; + } + openGroups_.add(input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails.PARSER, extensionRegistry)); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000010) == 0x00000010)) { + read_ = java.util.Collections.unmodifiableList(read_); + } + if (((mutable_bitField0_ & 0x00000200) == 0x00000200)) { + stickerPackOperation_ = java.util.Collections.unmodifiableList(stickerPackOperation_); + } + if (((mutable_bitField0_ & 0x00000400) == 0x00000400)) { + openGroups_ = java.util.Collections.unmodifiableList(openGroups_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.class, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public SyncMessage parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new SyncMessage(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public interface SentOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional string destination = 1; + /** + * optional string destination = 1; + */ + boolean hasDestination(); + /** + * optional string destination = 1; + */ + String getDestination(); + /** + * optional string destination = 1; + */ + com.google.protobuf.ByteString + getDestinationBytes(); + + // optional uint64 timestamp = 2; + /** + * optional uint64 timestamp = 2; + */ + boolean hasTimestamp(); + /** + * optional uint64 timestamp = 2; + */ + long getTimestamp(); + + // optional .signalservice.DataMessage message = 3; + /** + * optional .signalservice.DataMessage message = 3; + */ + boolean hasMessage(); + /** + * optional .signalservice.DataMessage message = 3; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage getMessage(); + /** + * optional .signalservice.DataMessage message = 3; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessageOrBuilder getMessageOrBuilder(); + + // optional uint64 expirationStartTimestamp = 4; + /** + * optional uint64 expirationStartTimestamp = 4; + */ + boolean hasExpirationStartTimestamp(); + /** + * optional uint64 expirationStartTimestamp = 4; + */ + long getExpirationStartTimestamp(); + + // repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + /** + * repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + */ + java.util.List + getUnidentifiedStatusList(); + /** + * repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus getUnidentifiedStatus(int index); + /** + * repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + */ + int getUnidentifiedStatusCount(); + /** + * repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + */ + java.util.List + getUnidentifiedStatusOrBuilderList(); + /** + * repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatusOrBuilder getUnidentifiedStatusOrBuilder( + int index); + } + /** + * Protobuf type {@code signalservice.SyncMessage.Sent} + */ + public static final class Sent extends + com.google.protobuf.GeneratedMessage + implements SentOrBuilder { + // Use Sent.newBuilder() to construct. + private Sent(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Sent(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Sent defaultInstance; + public static Sent getDefaultInstance() { + return defaultInstance; + } + + public Sent getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Sent( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + destination_ = input.readBytes(); + break; + } + case 16: { + bitField0_ |= 0x00000002; + timestamp_ = input.readUInt64(); + break; + } + case 26: { + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Builder subBuilder = null; + if (((bitField0_ & 0x00000004) == 0x00000004)) { + subBuilder = message_.toBuilder(); + } + message_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(message_); + message_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000004; + break; + } + case 32: { + bitField0_ |= 0x00000008; + expirationStartTimestamp_ = input.readUInt64(); + break; + } + case 42: { + if (!((mutable_bitField0_ & 0x00000010) == 0x00000010)) { + unidentifiedStatus_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000010; + } + unidentifiedStatus_.add(input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus.PARSER, extensionRegistry)); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000010) == 0x00000010)) { + unidentifiedStatus_ = java.util.Collections.unmodifiableList(unidentifiedStatus_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Sent_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Sent_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.class, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Sent parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Sent(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public interface UnidentifiedDeliveryStatusOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional string destination = 1; + /** + * optional string destination = 1; + */ + boolean hasDestination(); + /** + * optional string destination = 1; + */ + String getDestination(); + /** + * optional string destination = 1; + */ + com.google.protobuf.ByteString + getDestinationBytes(); + + // optional bool unidentified = 2; + /** + * optional bool unidentified = 2; + */ + boolean hasUnidentified(); + /** + * optional bool unidentified = 2; + */ + boolean getUnidentified(); + } + /** + * Protobuf type {@code signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus} + */ + public static final class UnidentifiedDeliveryStatus extends + com.google.protobuf.GeneratedMessage + implements UnidentifiedDeliveryStatusOrBuilder { + // Use UnidentifiedDeliveryStatus.newBuilder() to construct. + private UnidentifiedDeliveryStatus(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private UnidentifiedDeliveryStatus(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final UnidentifiedDeliveryStatus defaultInstance; + public static UnidentifiedDeliveryStatus getDefaultInstance() { + return defaultInstance; + } + + public UnidentifiedDeliveryStatus getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private UnidentifiedDeliveryStatus( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + destination_ = input.readBytes(); + break; + } + case 16: { + bitField0_ |= 0x00000002; + unidentified_ = input.readBool(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Sent_UnidentifiedDeliveryStatus_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Sent_UnidentifiedDeliveryStatus_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus.class, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public UnidentifiedDeliveryStatus parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new UnidentifiedDeliveryStatus(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional string destination = 1; + public static final int DESTINATION_FIELD_NUMBER = 1; + private Object destination_; + /** + * optional string destination = 1; + */ + public boolean hasDestination() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string destination = 1; + */ + public String getDestination() { + Object ref = destination_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + destination_ = s; + } + return s; + } + } + /** + * optional string destination = 1; + */ + public com.google.protobuf.ByteString + getDestinationBytes() { + Object ref = destination_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + destination_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional bool unidentified = 2; + public static final int UNIDENTIFIED_FIELD_NUMBER = 2; + private boolean unidentified_; + /** + * optional bool unidentified = 2; + */ + public boolean hasUnidentified() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bool unidentified = 2; + */ + public boolean getUnidentified() { + return unidentified_; + } + + private void initFields() { + destination_ = ""; + unidentified_ = false; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getDestinationBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBool(2, unidentified_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getDestinationBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(2, unidentified_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatusOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Sent_UnidentifiedDeliveryStatus_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Sent_UnidentifiedDeliveryStatus_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus.class, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + destination_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + unidentified_ = false; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Sent_UnidentifiedDeliveryStatus_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus result = new org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.destination_ = destination_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.unidentified_ = unidentified_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus.getDefaultInstance()) return this; + if (other.hasDestination()) { + bitField0_ |= 0x00000001; + destination_ = other.destination_; + onChanged(); + } + if (other.hasUnidentified()) { + setUnidentified(other.getUnidentified()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional string destination = 1; + private Object destination_ = ""; + /** + * optional string destination = 1; + */ + public boolean hasDestination() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string destination = 1; + */ + public String getDestination() { + Object ref = destination_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + destination_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string destination = 1; + */ + public com.google.protobuf.ByteString + getDestinationBytes() { + Object ref = destination_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + destination_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string destination = 1; + */ + public Builder setDestination( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + destination_ = value; + onChanged(); + return this; + } + /** + * optional string destination = 1; + */ + public Builder clearDestination() { + bitField0_ = (bitField0_ & ~0x00000001); + destination_ = getDefaultInstance().getDestination(); + onChanged(); + return this; + } + /** + * optional string destination = 1; + */ + public Builder setDestinationBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + destination_ = value; + onChanged(); + return this; + } + + // optional bool unidentified = 2; + private boolean unidentified_ ; + /** + * optional bool unidentified = 2; + */ + public boolean hasUnidentified() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bool unidentified = 2; + */ + public boolean getUnidentified() { + return unidentified_; + } + /** + * optional bool unidentified = 2; + */ + public Builder setUnidentified(boolean value) { + bitField0_ |= 0x00000002; + unidentified_ = value; + onChanged(); + return this; + } + /** + * optional bool unidentified = 2; + */ + public Builder clearUnidentified() { + bitField0_ = (bitField0_ & ~0x00000002); + unidentified_ = false; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus) + } + + static { + defaultInstance = new UnidentifiedDeliveryStatus(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus) + } + + private int bitField0_; + // optional string destination = 1; + public static final int DESTINATION_FIELD_NUMBER = 1; + private Object destination_; + /** + * optional string destination = 1; + */ + public boolean hasDestination() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string destination = 1; + */ + public String getDestination() { + Object ref = destination_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + destination_ = s; + } + return s; + } + } + /** + * optional string destination = 1; + */ + public com.google.protobuf.ByteString + getDestinationBytes() { + Object ref = destination_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + destination_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional uint64 timestamp = 2; + public static final int TIMESTAMP_FIELD_NUMBER = 2; + private long timestamp_; + /** + * optional uint64 timestamp = 2; + */ + public boolean hasTimestamp() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional uint64 timestamp = 2; + */ + public long getTimestamp() { + return timestamp_; + } + + // optional .signalservice.DataMessage message = 3; + public static final int MESSAGE_FIELD_NUMBER = 3; + private org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage message_; + /** + * optional .signalservice.DataMessage message = 3; + */ + public boolean hasMessage() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .signalservice.DataMessage message = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage getMessage() { + return message_; + } + /** + * optional .signalservice.DataMessage message = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessageOrBuilder getMessageOrBuilder() { + return message_; + } + + // optional uint64 expirationStartTimestamp = 4; + public static final int EXPIRATIONSTARTTIMESTAMP_FIELD_NUMBER = 4; + private long expirationStartTimestamp_; + /** + * optional uint64 expirationStartTimestamp = 4; + */ + public boolean hasExpirationStartTimestamp() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional uint64 expirationStartTimestamp = 4; + */ + public long getExpirationStartTimestamp() { + return expirationStartTimestamp_; + } + + // repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + public static final int UNIDENTIFIEDSTATUS_FIELD_NUMBER = 5; + private java.util.List unidentifiedStatus_; + /** + * repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + */ + public java.util.List getUnidentifiedStatusList() { + return unidentifiedStatus_; + } + /** + * repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + */ + public java.util.List + getUnidentifiedStatusOrBuilderList() { + return unidentifiedStatus_; + } + /** + * repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + */ + public int getUnidentifiedStatusCount() { + return unidentifiedStatus_.size(); + } + /** + * repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus getUnidentifiedStatus(int index) { + return unidentifiedStatus_.get(index); + } + /** + * repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatusOrBuilder getUnidentifiedStatusOrBuilder( + int index) { + return unidentifiedStatus_.get(index); + } + + private void initFields() { + destination_ = ""; + timestamp_ = 0L; + message_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.getDefaultInstance(); + expirationStartTimestamp_ = 0L; + unidentifiedStatus_ = java.util.Collections.emptyList(); + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getDestinationBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeUInt64(2, timestamp_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeMessage(3, message_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeUInt64(4, expirationStartTimestamp_); + } + for (int i = 0; i < unidentifiedStatus_.size(); i++) { + output.writeMessage(5, unidentifiedStatus_.get(i)); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getDestinationBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(2, timestamp_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, message_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(4, expirationStartTimestamp_); + } + for (int i = 0; i < unidentifiedStatus_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(5, unidentifiedStatus_.get(i)); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.SyncMessage.Sent} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.SentOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Sent_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Sent_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.class, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getMessageFieldBuilder(); + getUnidentifiedStatusFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + destination_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + timestamp_ = 0L; + bitField0_ = (bitField0_ & ~0x00000002); + if (messageBuilder_ == null) { + message_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.getDefaultInstance(); + } else { + messageBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + expirationStartTimestamp_ = 0L; + bitField0_ = (bitField0_ & ~0x00000008); + if (unidentifiedStatusBuilder_ == null) { + unidentifiedStatus_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000010); + } else { + unidentifiedStatusBuilder_.clear(); + } + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Sent_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent result = new org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.destination_ = destination_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.timestamp_ = timestamp_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + if (messageBuilder_ == null) { + result.message_ = message_; + } else { + result.message_ = messageBuilder_.build(); + } + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000008; + } + result.expirationStartTimestamp_ = expirationStartTimestamp_; + if (unidentifiedStatusBuilder_ == null) { + if (((bitField0_ & 0x00000010) == 0x00000010)) { + unidentifiedStatus_ = java.util.Collections.unmodifiableList(unidentifiedStatus_); + bitField0_ = (bitField0_ & ~0x00000010); + } + result.unidentifiedStatus_ = unidentifiedStatus_; + } else { + result.unidentifiedStatus_ = unidentifiedStatusBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.getDefaultInstance()) return this; + if (other.hasDestination()) { + bitField0_ |= 0x00000001; + destination_ = other.destination_; + onChanged(); + } + if (other.hasTimestamp()) { + setTimestamp(other.getTimestamp()); + } + if (other.hasMessage()) { + mergeMessage(other.getMessage()); + } + if (other.hasExpirationStartTimestamp()) { + setExpirationStartTimestamp(other.getExpirationStartTimestamp()); + } + if (unidentifiedStatusBuilder_ == null) { + if (!other.unidentifiedStatus_.isEmpty()) { + if (unidentifiedStatus_.isEmpty()) { + unidentifiedStatus_ = other.unidentifiedStatus_; + bitField0_ = (bitField0_ & ~0x00000010); + } else { + ensureUnidentifiedStatusIsMutable(); + unidentifiedStatus_.addAll(other.unidentifiedStatus_); + } + onChanged(); + } + } else { + if (!other.unidentifiedStatus_.isEmpty()) { + if (unidentifiedStatusBuilder_.isEmpty()) { + unidentifiedStatusBuilder_.dispose(); + unidentifiedStatusBuilder_ = null; + unidentifiedStatus_ = other.unidentifiedStatus_; + bitField0_ = (bitField0_ & ~0x00000010); + unidentifiedStatusBuilder_ = + com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ? + getUnidentifiedStatusFieldBuilder() : null; + } else { + unidentifiedStatusBuilder_.addAllMessages(other.unidentifiedStatus_); + } + } + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional string destination = 1; + private Object destination_ = ""; + /** + * optional string destination = 1; + */ + public boolean hasDestination() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string destination = 1; + */ + public String getDestination() { + Object ref = destination_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + destination_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string destination = 1; + */ + public com.google.protobuf.ByteString + getDestinationBytes() { + Object ref = destination_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + destination_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string destination = 1; + */ + public Builder setDestination( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + destination_ = value; + onChanged(); + return this; + } + /** + * optional string destination = 1; + */ + public Builder clearDestination() { + bitField0_ = (bitField0_ & ~0x00000001); + destination_ = getDefaultInstance().getDestination(); + onChanged(); + return this; + } + /** + * optional string destination = 1; + */ + public Builder setDestinationBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + destination_ = value; + onChanged(); + return this; + } + + // optional uint64 timestamp = 2; + private long timestamp_ ; + /** + * optional uint64 timestamp = 2; + */ + public boolean hasTimestamp() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional uint64 timestamp = 2; + */ + public long getTimestamp() { + return timestamp_; + } + /** + * optional uint64 timestamp = 2; + */ + public Builder setTimestamp(long value) { + bitField0_ |= 0x00000002; + timestamp_ = value; + onChanged(); + return this; + } + /** + * optional uint64 timestamp = 2; + */ + public Builder clearTimestamp() { + bitField0_ = (bitField0_ & ~0x00000002); + timestamp_ = 0L; + onChanged(); + return this; + } + + // optional .signalservice.DataMessage message = 3; + private org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage message_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessageOrBuilder> messageBuilder_; + /** + * optional .signalservice.DataMessage message = 3; + */ + public boolean hasMessage() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .signalservice.DataMessage message = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage getMessage() { + if (messageBuilder_ == null) { + return message_; + } else { + return messageBuilder_.getMessage(); + } + } + /** + * optional .signalservice.DataMessage message = 3; + */ + public Builder setMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage value) { + if (messageBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + message_ = value; + onChanged(); + } else { + messageBuilder_.setMessage(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .signalservice.DataMessage message = 3; + */ + public Builder setMessage( + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Builder builderForValue) { + if (messageBuilder_ == null) { + message_ = builderForValue.build(); + onChanged(); + } else { + messageBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .signalservice.DataMessage message = 3; + */ + public Builder mergeMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage value) { + if (messageBuilder_ == null) { + if (((bitField0_ & 0x00000004) == 0x00000004) && + message_ != org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.getDefaultInstance()) { + message_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.newBuilder(message_).mergeFrom(value).buildPartial(); + } else { + message_ = value; + } + onChanged(); + } else { + messageBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .signalservice.DataMessage message = 3; + */ + public Builder clearMessage() { + if (messageBuilder_ == null) { + message_ = org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.getDefaultInstance(); + onChanged(); + } else { + messageBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + /** + * optional .signalservice.DataMessage message = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Builder getMessageBuilder() { + bitField0_ |= 0x00000004; + onChanged(); + return getMessageFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.DataMessage message = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessageOrBuilder getMessageOrBuilder() { + if (messageBuilder_ != null) { + return messageBuilder_.getMessageOrBuilder(); + } else { + return message_; + } + } + /** + * optional .signalservice.DataMessage message = 3; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessageOrBuilder> + getMessageFieldBuilder() { + if (messageBuilder_ == null) { + messageBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessage.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.DataMessageOrBuilder>( + message_, + getParentForChildren(), + isClean()); + message_ = null; + } + return messageBuilder_; + } + + // optional uint64 expirationStartTimestamp = 4; + private long expirationStartTimestamp_ ; + /** + * optional uint64 expirationStartTimestamp = 4; + */ + public boolean hasExpirationStartTimestamp() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional uint64 expirationStartTimestamp = 4; + */ + public long getExpirationStartTimestamp() { + return expirationStartTimestamp_; + } + /** + * optional uint64 expirationStartTimestamp = 4; + */ + public Builder setExpirationStartTimestamp(long value) { + bitField0_ |= 0x00000008; + expirationStartTimestamp_ = value; + onChanged(); + return this; + } + /** + * optional uint64 expirationStartTimestamp = 4; + */ + public Builder clearExpirationStartTimestamp() { + bitField0_ = (bitField0_ & ~0x00000008); + expirationStartTimestamp_ = 0L; + onChanged(); + return this; + } + + // repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + private java.util.List unidentifiedStatus_ = + java.util.Collections.emptyList(); + private void ensureUnidentifiedStatusIsMutable() { + if (!((bitField0_ & 0x00000010) == 0x00000010)) { + unidentifiedStatus_ = new java.util.ArrayList(unidentifiedStatus_); + bitField0_ |= 0x00000010; + } + } + + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatusOrBuilder> unidentifiedStatusBuilder_; + + /** + * repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + */ + public java.util.List getUnidentifiedStatusList() { + if (unidentifiedStatusBuilder_ == null) { + return java.util.Collections.unmodifiableList(unidentifiedStatus_); + } else { + return unidentifiedStatusBuilder_.getMessageList(); + } + } + /** + * repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + */ + public int getUnidentifiedStatusCount() { + if (unidentifiedStatusBuilder_ == null) { + return unidentifiedStatus_.size(); + } else { + return unidentifiedStatusBuilder_.getCount(); + } + } + /** + * repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus getUnidentifiedStatus(int index) { + if (unidentifiedStatusBuilder_ == null) { + return unidentifiedStatus_.get(index); + } else { + return unidentifiedStatusBuilder_.getMessage(index); + } + } + /** + * repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + */ + public Builder setUnidentifiedStatus( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus value) { + if (unidentifiedStatusBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureUnidentifiedStatusIsMutable(); + unidentifiedStatus_.set(index, value); + onChanged(); + } else { + unidentifiedStatusBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + */ + public Builder setUnidentifiedStatus( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus.Builder builderForValue) { + if (unidentifiedStatusBuilder_ == null) { + ensureUnidentifiedStatusIsMutable(); + unidentifiedStatus_.set(index, builderForValue.build()); + onChanged(); + } else { + unidentifiedStatusBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + */ + public Builder addUnidentifiedStatus(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus value) { + if (unidentifiedStatusBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureUnidentifiedStatusIsMutable(); + unidentifiedStatus_.add(value); + onChanged(); + } else { + unidentifiedStatusBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + */ + public Builder addUnidentifiedStatus( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus value) { + if (unidentifiedStatusBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureUnidentifiedStatusIsMutable(); + unidentifiedStatus_.add(index, value); + onChanged(); + } else { + unidentifiedStatusBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + */ + public Builder addUnidentifiedStatus( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus.Builder builderForValue) { + if (unidentifiedStatusBuilder_ == null) { + ensureUnidentifiedStatusIsMutable(); + unidentifiedStatus_.add(builderForValue.build()); + onChanged(); + } else { + unidentifiedStatusBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + */ + public Builder addUnidentifiedStatus( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus.Builder builderForValue) { + if (unidentifiedStatusBuilder_ == null) { + ensureUnidentifiedStatusIsMutable(); + unidentifiedStatus_.add(index, builderForValue.build()); + onChanged(); + } else { + unidentifiedStatusBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + */ + public Builder addAllUnidentifiedStatus( + Iterable values) { + if (unidentifiedStatusBuilder_ == null) { + ensureUnidentifiedStatusIsMutable(); + super.addAll(values, unidentifiedStatus_); + onChanged(); + } else { + unidentifiedStatusBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + */ + public Builder clearUnidentifiedStatus() { + if (unidentifiedStatusBuilder_ == null) { + unidentifiedStatus_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000010); + onChanged(); + } else { + unidentifiedStatusBuilder_.clear(); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + */ + public Builder removeUnidentifiedStatus(int index) { + if (unidentifiedStatusBuilder_ == null) { + ensureUnidentifiedStatusIsMutable(); + unidentifiedStatus_.remove(index); + onChanged(); + } else { + unidentifiedStatusBuilder_.remove(index); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus.Builder getUnidentifiedStatusBuilder( + int index) { + return getUnidentifiedStatusFieldBuilder().getBuilder(index); + } + /** + * repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatusOrBuilder getUnidentifiedStatusOrBuilder( + int index) { + if (unidentifiedStatusBuilder_ == null) { + return unidentifiedStatus_.get(index); } else { + return unidentifiedStatusBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + */ + public java.util.List + getUnidentifiedStatusOrBuilderList() { + if (unidentifiedStatusBuilder_ != null) { + return unidentifiedStatusBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(unidentifiedStatus_); + } + } + /** + * repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus.Builder addUnidentifiedStatusBuilder() { + return getUnidentifiedStatusFieldBuilder().addBuilder( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus.getDefaultInstance()); + } + /** + * repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus.Builder addUnidentifiedStatusBuilder( + int index) { + return getUnidentifiedStatusFieldBuilder().addBuilder( + index, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus.getDefaultInstance()); + } + /** + * repeated .signalservice.SyncMessage.Sent.UnidentifiedDeliveryStatus unidentifiedStatus = 5; + */ + public java.util.List + getUnidentifiedStatusBuilderList() { + return getUnidentifiedStatusFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatusOrBuilder> + getUnidentifiedStatusFieldBuilder() { + if (unidentifiedStatusBuilder_ == null) { + unidentifiedStatusBuilder_ = new com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatus.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.UnidentifiedDeliveryStatusOrBuilder>( + unidentifiedStatus_, + ((bitField0_ & 0x00000010) == 0x00000010), + getParentForChildren(), + isClean()); + unidentifiedStatus_ = null; + } + return unidentifiedStatusBuilder_; + } + + // @@protoc_insertion_point(builder_scope:signalservice.SyncMessage.Sent) + } + + static { + defaultInstance = new Sent(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.SyncMessage.Sent) + } + + public interface ContactsOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional .signalservice.AttachmentPointer blob = 1; + /** + * optional .signalservice.AttachmentPointer blob = 1; + */ + boolean hasBlob(); + /** + * optional .signalservice.AttachmentPointer blob = 1; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer getBlob(); + /** + * optional .signalservice.AttachmentPointer blob = 1; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder getBlobOrBuilder(); + + // optional bool complete = 2 [default = false]; + /** + * optional bool complete = 2 [default = false]; + */ + boolean hasComplete(); + /** + * optional bool complete = 2 [default = false]; + */ + boolean getComplete(); + + // optional bytes data = 101; + /** + * optional bytes data = 101; + */ + boolean hasData(); + /** + * optional bytes data = 101; + */ + com.google.protobuf.ByteString getData(); + } + /** + * Protobuf type {@code signalservice.SyncMessage.Contacts} + */ + public static final class Contacts extends + com.google.protobuf.GeneratedMessage + implements ContactsOrBuilder { + // Use Contacts.newBuilder() to construct. + private Contacts(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Contacts(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Contacts defaultInstance; + public static Contacts getDefaultInstance() { + return defaultInstance; + } + + public Contacts getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Contacts( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder subBuilder = null; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + subBuilder = blob_.toBuilder(); + } + blob_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(blob_); + blob_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000001; + break; + } + case 16: { + bitField0_ |= 0x00000002; + complete_ = input.readBool(); + break; + } + case 810: { + bitField0_ |= 0x00000004; + data_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Contacts_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Contacts_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts.class, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Contacts parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Contacts(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional .signalservice.AttachmentPointer blob = 1; + public static final int BLOB_FIELD_NUMBER = 1; + private org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer blob_; + /** + * optional .signalservice.AttachmentPointer blob = 1; + */ + public boolean hasBlob() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional .signalservice.AttachmentPointer blob = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer getBlob() { + return blob_; + } + /** + * optional .signalservice.AttachmentPointer blob = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder getBlobOrBuilder() { + return blob_; + } + + // optional bool complete = 2 [default = false]; + public static final int COMPLETE_FIELD_NUMBER = 2; + private boolean complete_; + /** + * optional bool complete = 2 [default = false]; + */ + public boolean hasComplete() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bool complete = 2 [default = false]; + */ + public boolean getComplete() { + return complete_; + } + + // optional bytes data = 101; + public static final int DATA_FIELD_NUMBER = 101; + private com.google.protobuf.ByteString data_; + /** + * optional bytes data = 101; + */ + public boolean hasData() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes data = 101; + */ + public com.google.protobuf.ByteString getData() { + return data_; + } + + private void initFields() { + blob_ = org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance(); + complete_ = false; + data_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeMessage(1, blob_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBool(2, complete_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(101, data_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, blob_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(2, complete_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(101, data_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.SyncMessage.Contacts} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.ContactsOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Contacts_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Contacts_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts.class, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getBlobFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + if (blobBuilder_ == null) { + blob_ = org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance(); + } else { + blobBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + complete_ = false; + bitField0_ = (bitField0_ & ~0x00000002); + data_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Contacts_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts result = new org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + if (blobBuilder_ == null) { + result.blob_ = blob_; + } else { + result.blob_ = blobBuilder_.build(); + } + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.complete_ = complete_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.data_ = data_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts.getDefaultInstance()) return this; + if (other.hasBlob()) { + mergeBlob(other.getBlob()); + } + if (other.hasComplete()) { + setComplete(other.getComplete()); + } + if (other.hasData()) { + setData(other.getData()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional .signalservice.AttachmentPointer blob = 1; + private org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer blob_ = org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder> blobBuilder_; + /** + * optional .signalservice.AttachmentPointer blob = 1; + */ + public boolean hasBlob() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional .signalservice.AttachmentPointer blob = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer getBlob() { + if (blobBuilder_ == null) { + return blob_; + } else { + return blobBuilder_.getMessage(); + } + } + /** + * optional .signalservice.AttachmentPointer blob = 1; + */ + public Builder setBlob(org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer value) { + if (blobBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + blob_ = value; + onChanged(); + } else { + blobBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * optional .signalservice.AttachmentPointer blob = 1; + */ + public Builder setBlob( + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder builderForValue) { + if (blobBuilder_ == null) { + blob_ = builderForValue.build(); + onChanged(); + } else { + blobBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * optional .signalservice.AttachmentPointer blob = 1; + */ + public Builder mergeBlob(org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer value) { + if (blobBuilder_ == null) { + if (((bitField0_ & 0x00000001) == 0x00000001) && + blob_ != org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance()) { + blob_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.newBuilder(blob_).mergeFrom(value).buildPartial(); + } else { + blob_ = value; + } + onChanged(); + } else { + blobBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * optional .signalservice.AttachmentPointer blob = 1; + */ + public Builder clearBlob() { + if (blobBuilder_ == null) { + blob_ = org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance(); + onChanged(); + } else { + blobBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + /** + * optional .signalservice.AttachmentPointer blob = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder getBlobBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getBlobFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.AttachmentPointer blob = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder getBlobOrBuilder() { + if (blobBuilder_ != null) { + return blobBuilder_.getMessageOrBuilder(); + } else { + return blob_; + } + } + /** + * optional .signalservice.AttachmentPointer blob = 1; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder> + getBlobFieldBuilder() { + if (blobBuilder_ == null) { + blobBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder>( + blob_, + getParentForChildren(), + isClean()); + blob_ = null; + } + return blobBuilder_; + } + + // optional bool complete = 2 [default = false]; + private boolean complete_ ; + /** + * optional bool complete = 2 [default = false]; + */ + public boolean hasComplete() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bool complete = 2 [default = false]; + */ + public boolean getComplete() { + return complete_; + } + /** + * optional bool complete = 2 [default = false]; + */ + public Builder setComplete(boolean value) { + bitField0_ |= 0x00000002; + complete_ = value; + onChanged(); + return this; + } + /** + * optional bool complete = 2 [default = false]; + */ + public Builder clearComplete() { + bitField0_ = (bitField0_ & ~0x00000002); + complete_ = false; + onChanged(); + return this; + } + + // optional bytes data = 101; + private com.google.protobuf.ByteString data_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes data = 101; + */ + public boolean hasData() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes data = 101; + */ + public com.google.protobuf.ByteString getData() { + return data_; + } + /** + * optional bytes data = 101; + */ + public Builder setData(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + data_ = value; + onChanged(); + return this; + } + /** + * optional bytes data = 101; + */ + public Builder clearData() { + bitField0_ = (bitField0_ & ~0x00000004); + data_ = getDefaultInstance().getData(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.SyncMessage.Contacts) + } + + static { + defaultInstance = new Contacts(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.SyncMessage.Contacts) + } + + public interface GroupsOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional .signalservice.AttachmentPointer blob = 1; + /** + * optional .signalservice.AttachmentPointer blob = 1; + */ + boolean hasBlob(); + /** + * optional .signalservice.AttachmentPointer blob = 1; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer getBlob(); + /** + * optional .signalservice.AttachmentPointer blob = 1; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder getBlobOrBuilder(); + + // optional bytes data = 101; + /** + * optional bytes data = 101; + */ + boolean hasData(); + /** + * optional bytes data = 101; + */ + com.google.protobuf.ByteString getData(); + } + /** + * Protobuf type {@code signalservice.SyncMessage.Groups} + */ + public static final class Groups extends + com.google.protobuf.GeneratedMessage + implements GroupsOrBuilder { + // Use Groups.newBuilder() to construct. + private Groups(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Groups(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Groups defaultInstance; + public static Groups getDefaultInstance() { + return defaultInstance; + } + + public Groups getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Groups( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder subBuilder = null; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + subBuilder = blob_.toBuilder(); + } + blob_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(blob_); + blob_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000001; + break; + } + case 810: { + bitField0_ |= 0x00000002; + data_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Groups_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Groups_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups.class, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Groups parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Groups(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional .signalservice.AttachmentPointer blob = 1; + public static final int BLOB_FIELD_NUMBER = 1; + private org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer blob_; + /** + * optional .signalservice.AttachmentPointer blob = 1; + */ + public boolean hasBlob() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional .signalservice.AttachmentPointer blob = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer getBlob() { + return blob_; + } + /** + * optional .signalservice.AttachmentPointer blob = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder getBlobOrBuilder() { + return blob_; + } + + // optional bytes data = 101; + public static final int DATA_FIELD_NUMBER = 101; + private com.google.protobuf.ByteString data_; + /** + * optional bytes data = 101; + */ + public boolean hasData() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes data = 101; + */ + public com.google.protobuf.ByteString getData() { + return data_; + } + + private void initFields() { + blob_ = org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance(); + data_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeMessage(1, blob_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(101, data_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, blob_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(101, data_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.SyncMessage.Groups} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.GroupsOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Groups_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Groups_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups.class, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getBlobFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + if (blobBuilder_ == null) { + blob_ = org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance(); + } else { + blobBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + data_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Groups_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups result = new org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + if (blobBuilder_ == null) { + result.blob_ = blob_; + } else { + result.blob_ = blobBuilder_.build(); + } + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.data_ = data_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups.getDefaultInstance()) return this; + if (other.hasBlob()) { + mergeBlob(other.getBlob()); + } + if (other.hasData()) { + setData(other.getData()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional .signalservice.AttachmentPointer blob = 1; + private org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer blob_ = org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder> blobBuilder_; + /** + * optional .signalservice.AttachmentPointer blob = 1; + */ + public boolean hasBlob() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional .signalservice.AttachmentPointer blob = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer getBlob() { + if (blobBuilder_ == null) { + return blob_; + } else { + return blobBuilder_.getMessage(); + } + } + /** + * optional .signalservice.AttachmentPointer blob = 1; + */ + public Builder setBlob(org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer value) { + if (blobBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + blob_ = value; + onChanged(); + } else { + blobBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * optional .signalservice.AttachmentPointer blob = 1; + */ + public Builder setBlob( + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder builderForValue) { + if (blobBuilder_ == null) { + blob_ = builderForValue.build(); + onChanged(); + } else { + blobBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * optional .signalservice.AttachmentPointer blob = 1; + */ + public Builder mergeBlob(org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer value) { + if (blobBuilder_ == null) { + if (((bitField0_ & 0x00000001) == 0x00000001) && + blob_ != org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance()) { + blob_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.newBuilder(blob_).mergeFrom(value).buildPartial(); + } else { + blob_ = value; + } + onChanged(); + } else { + blobBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * optional .signalservice.AttachmentPointer blob = 1; + */ + public Builder clearBlob() { + if (blobBuilder_ == null) { + blob_ = org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance(); + onChanged(); + } else { + blobBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + /** + * optional .signalservice.AttachmentPointer blob = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder getBlobBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getBlobFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.AttachmentPointer blob = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder getBlobOrBuilder() { + if (blobBuilder_ != null) { + return blobBuilder_.getMessageOrBuilder(); + } else { + return blob_; + } + } + /** + * optional .signalservice.AttachmentPointer blob = 1; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder> + getBlobFieldBuilder() { + if (blobBuilder_ == null) { + blobBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder>( + blob_, + getParentForChildren(), + isClean()); + blob_ = null; + } + return blobBuilder_; + } + + // optional bytes data = 101; + private com.google.protobuf.ByteString data_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes data = 101; + */ + public boolean hasData() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes data = 101; + */ + public com.google.protobuf.ByteString getData() { + return data_; + } + /** + * optional bytes data = 101; + */ + public Builder setData(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + data_ = value; + onChanged(); + return this; + } + /** + * optional bytes data = 101; + */ + public Builder clearData() { + bitField0_ = (bitField0_ & ~0x00000002); + data_ = getDefaultInstance().getData(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.SyncMessage.Groups) + } + + static { + defaultInstance = new Groups(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.SyncMessage.Groups) + } + + public interface BlockedOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // repeated string numbers = 1; + /** + * repeated string numbers = 1; + */ + java.util.List + getNumbersList(); + /** + * repeated string numbers = 1; + */ + int getNumbersCount(); + /** + * repeated string numbers = 1; + */ + String getNumbers(int index); + /** + * repeated string numbers = 1; + */ + com.google.protobuf.ByteString + getNumbersBytes(int index); + + // repeated bytes groupIds = 2; + /** + * repeated bytes groupIds = 2; + */ + java.util.List getGroupIdsList(); + /** + * repeated bytes groupIds = 2; + */ + int getGroupIdsCount(); + /** + * repeated bytes groupIds = 2; + */ + com.google.protobuf.ByteString getGroupIds(int index); + } + /** + * Protobuf type {@code signalservice.SyncMessage.Blocked} + */ + public static final class Blocked extends + com.google.protobuf.GeneratedMessage + implements BlockedOrBuilder { + // Use Blocked.newBuilder() to construct. + private Blocked(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Blocked(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Blocked defaultInstance; + public static Blocked getDefaultInstance() { + return defaultInstance; + } + + public Blocked getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Blocked( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) { + numbers_ = new com.google.protobuf.LazyStringArrayList(); + mutable_bitField0_ |= 0x00000001; + } + numbers_.add(input.readBytes()); + break; + } + case 18: { + if (!((mutable_bitField0_ & 0x00000002) == 0x00000002)) { + groupIds_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000002; + } + groupIds_.add(input.readBytes()); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) { + numbers_ = new com.google.protobuf.UnmodifiableLazyStringList(numbers_); + } + if (((mutable_bitField0_ & 0x00000002) == 0x00000002)) { + groupIds_ = java.util.Collections.unmodifiableList(groupIds_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Blocked_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Blocked_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked.class, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Blocked parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Blocked(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + // repeated string numbers = 1; + public static final int NUMBERS_FIELD_NUMBER = 1; + private com.google.protobuf.LazyStringList numbers_; + /** + * repeated string numbers = 1; + */ + public java.util.List + getNumbersList() { + return numbers_; + } + /** + * repeated string numbers = 1; + */ + public int getNumbersCount() { + return numbers_.size(); + } + /** + * repeated string numbers = 1; + */ + public String getNumbers(int index) { + return numbers_.get(index); + } + /** + * repeated string numbers = 1; + */ + public com.google.protobuf.ByteString + getNumbersBytes(int index) { + return numbers_.getByteString(index); + } + + // repeated bytes groupIds = 2; + public static final int GROUPIDS_FIELD_NUMBER = 2; + private java.util.List groupIds_; + /** + * repeated bytes groupIds = 2; + */ + public java.util.List + getGroupIdsList() { + return groupIds_; + } + /** + * repeated bytes groupIds = 2; + */ + public int getGroupIdsCount() { + return groupIds_.size(); + } + /** + * repeated bytes groupIds = 2; + */ + public com.google.protobuf.ByteString getGroupIds(int index) { + return groupIds_.get(index); + } + + private void initFields() { + numbers_ = com.google.protobuf.LazyStringArrayList.EMPTY; + groupIds_ = java.util.Collections.emptyList(); + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + for (int i = 0; i < numbers_.size(); i++) { + output.writeBytes(1, numbers_.getByteString(i)); + } + for (int i = 0; i < groupIds_.size(); i++) { + output.writeBytes(2, groupIds_.get(i)); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + { + int dataSize = 0; + for (int i = 0; i < numbers_.size(); i++) { + dataSize += com.google.protobuf.CodedOutputStream + .computeBytesSizeNoTag(numbers_.getByteString(i)); + } + size += dataSize; + size += 1 * getNumbersList().size(); + } + { + int dataSize = 0; + for (int i = 0; i < groupIds_.size(); i++) { + dataSize += com.google.protobuf.CodedOutputStream + .computeBytesSizeNoTag(groupIds_.get(i)); + } + size += dataSize; + size += 1 * getGroupIdsList().size(); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.SyncMessage.Blocked} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.BlockedOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Blocked_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Blocked_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked.class, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + numbers_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + groupIds_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Blocked_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked result = new org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked(this); + int from_bitField0_ = bitField0_; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + numbers_ = new com.google.protobuf.UnmodifiableLazyStringList( + numbers_); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.numbers_ = numbers_; + if (((bitField0_ & 0x00000002) == 0x00000002)) { + groupIds_ = java.util.Collections.unmodifiableList(groupIds_); + bitField0_ = (bitField0_ & ~0x00000002); + } + result.groupIds_ = groupIds_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked.getDefaultInstance()) return this; + if (!other.numbers_.isEmpty()) { + if (numbers_.isEmpty()) { + numbers_ = other.numbers_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureNumbersIsMutable(); + numbers_.addAll(other.numbers_); + } + onChanged(); + } + if (!other.groupIds_.isEmpty()) { + if (groupIds_.isEmpty()) { + groupIds_ = other.groupIds_; + bitField0_ = (bitField0_ & ~0x00000002); + } else { + ensureGroupIdsIsMutable(); + groupIds_.addAll(other.groupIds_); + } + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // repeated string numbers = 1; + private com.google.protobuf.LazyStringList numbers_ = com.google.protobuf.LazyStringArrayList.EMPTY; + private void ensureNumbersIsMutable() { + if (!((bitField0_ & 0x00000001) == 0x00000001)) { + numbers_ = new com.google.protobuf.LazyStringArrayList(numbers_); + bitField0_ |= 0x00000001; + } + } + /** + * repeated string numbers = 1; + */ + public java.util.List + getNumbersList() { + return java.util.Collections.unmodifiableList(numbers_); + } + /** + * repeated string numbers = 1; + */ + public int getNumbersCount() { + return numbers_.size(); + } + /** + * repeated string numbers = 1; + */ + public String getNumbers(int index) { + return numbers_.get(index); + } + /** + * repeated string numbers = 1; + */ + public com.google.protobuf.ByteString + getNumbersBytes(int index) { + return numbers_.getByteString(index); + } + /** + * repeated string numbers = 1; + */ + public Builder setNumbers( + int index, String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureNumbersIsMutable(); + numbers_.set(index, value); + onChanged(); + return this; + } + /** + * repeated string numbers = 1; + */ + public Builder addNumbers( + String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureNumbersIsMutable(); + numbers_.add(value); + onChanged(); + return this; + } + /** + * repeated string numbers = 1; + */ + public Builder addAllNumbers( + Iterable values) { + ensureNumbersIsMutable(); + super.addAll(values, numbers_); + onChanged(); + return this; + } + /** + * repeated string numbers = 1; + */ + public Builder clearNumbers() { + numbers_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + /** + * repeated string numbers = 1; + */ + public Builder addNumbersBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + ensureNumbersIsMutable(); + numbers_.add(value); + onChanged(); + return this; + } + + // repeated bytes groupIds = 2; + private java.util.List groupIds_ = java.util.Collections.emptyList(); + private void ensureGroupIdsIsMutable() { + if (!((bitField0_ & 0x00000002) == 0x00000002)) { + groupIds_ = new java.util.ArrayList(groupIds_); + bitField0_ |= 0x00000002; + } + } + /** + * repeated bytes groupIds = 2; + */ + public java.util.List + getGroupIdsList() { + return java.util.Collections.unmodifiableList(groupIds_); + } + /** + * repeated bytes groupIds = 2; + */ + public int getGroupIdsCount() { + return groupIds_.size(); + } + /** + * repeated bytes groupIds = 2; + */ + public com.google.protobuf.ByteString getGroupIds(int index) { + return groupIds_.get(index); + } + /** + * repeated bytes groupIds = 2; + */ + public Builder setGroupIds( + int index, com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + ensureGroupIdsIsMutable(); + groupIds_.set(index, value); + onChanged(); + return this; + } + /** + * repeated bytes groupIds = 2; + */ + public Builder addGroupIds(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + ensureGroupIdsIsMutable(); + groupIds_.add(value); + onChanged(); + return this; + } + /** + * repeated bytes groupIds = 2; + */ + public Builder addAllGroupIds( + Iterable values) { + ensureGroupIdsIsMutable(); + super.addAll(values, groupIds_); + onChanged(); + return this; + } + /** + * repeated bytes groupIds = 2; + */ + public Builder clearGroupIds() { + groupIds_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.SyncMessage.Blocked) + } + + static { + defaultInstance = new Blocked(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.SyncMessage.Blocked) + } + + public interface RequestOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional .signalservice.SyncMessage.Request.Type type = 1; + /** + * optional .signalservice.SyncMessage.Request.Type type = 1; + */ + boolean hasType(); + /** + * optional .signalservice.SyncMessage.Request.Type type = 1; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.Type getType(); + } + /** + * Protobuf type {@code signalservice.SyncMessage.Request} + */ + public static final class Request extends + com.google.protobuf.GeneratedMessage + implements RequestOrBuilder { + // Use Request.newBuilder() to construct. + private Request(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Request(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Request defaultInstance; + public static Request getDefaultInstance() { + return defaultInstance; + } + + public Request getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Request( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + int rawValue = input.readEnum(); + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.Type value = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.Type.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(1, rawValue); + } else { + bitField0_ |= 0x00000001; + type_ = value; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Request_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Request_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.class, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Request parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Request(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + /** + * Protobuf enum {@code signalservice.SyncMessage.Request.Type} + */ + public enum Type + implements com.google.protobuf.ProtocolMessageEnum { + /** + * UNKNOWN = 0; + */ + UNKNOWN(0, 0), + /** + * CONTACTS = 1; + */ + CONTACTS(1, 1), + /** + * GROUPS = 2; + */ + GROUPS(2, 2), + /** + * BLOCKED = 3; + */ + BLOCKED(3, 3), + /** + * CONFIGURATION = 4; + */ + CONFIGURATION(4, 4), + ; + + /** + * UNKNOWN = 0; + */ + public static final int UNKNOWN_VALUE = 0; + /** + * CONTACTS = 1; + */ + public static final int CONTACTS_VALUE = 1; + /** + * GROUPS = 2; + */ + public static final int GROUPS_VALUE = 2; + /** + * BLOCKED = 3; + */ + public static final int BLOCKED_VALUE = 3; + /** + * CONFIGURATION = 4; + */ + public static final int CONFIGURATION_VALUE = 4; + + + public final int getNumber() { return value; } + + public static Type valueOf(int value) { + switch (value) { + case 0: return UNKNOWN; + case 1: return CONTACTS; + case 2: return GROUPS; + case 3: return BLOCKED; + case 4: return CONFIGURATION; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static com.google.protobuf.Internal.EnumLiteMap + internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Type findValueByNumber(int number) { + return Type.valueOf(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(index); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.getDescriptor().getEnumTypes().get(0); + } + + private static final Type[] VALUES = values(); + + public static Type valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int index; + private final int value; + + private Type(int index, int value) { + this.index = index; + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:signalservice.SyncMessage.Request.Type) + } + + private int bitField0_; + // optional .signalservice.SyncMessage.Request.Type type = 1; + public static final int TYPE_FIELD_NUMBER = 1; + private org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.Type type_; + /** + * optional .signalservice.SyncMessage.Request.Type type = 1; + */ + public boolean hasType() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional .signalservice.SyncMessage.Request.Type type = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.Type getType() { + return type_; + } + + private void initFields() { + type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.Type.UNKNOWN; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeEnum(1, type_.getNumber()); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(1, type_.getNumber()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.SyncMessage.Request} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.RequestOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Request_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Request_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.class, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.Type.UNKNOWN; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Request_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request result = new org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.type_ = type_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.getDefaultInstance()) return this; + if (other.hasType()) { + setType(other.getType()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional .signalservice.SyncMessage.Request.Type type = 1; + private org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.Type type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.Type.UNKNOWN; + /** + * optional .signalservice.SyncMessage.Request.Type type = 1; + */ + public boolean hasType() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional .signalservice.SyncMessage.Request.Type type = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.Type getType() { + return type_; + } + /** + * optional .signalservice.SyncMessage.Request.Type type = 1; + */ + public Builder setType(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.Type value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + type_ = value; + onChanged(); + return this; + } + /** + * optional .signalservice.SyncMessage.Request.Type type = 1; + */ + public Builder clearType() { + bitField0_ = (bitField0_ & ~0x00000001); + type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.Type.UNKNOWN; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.SyncMessage.Request) + } + + static { + defaultInstance = new Request(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.SyncMessage.Request) + } + + public interface ReadOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional string sender = 1; + /** + * optional string sender = 1; + */ + boolean hasSender(); + /** + * optional string sender = 1; + */ + String getSender(); + /** + * optional string sender = 1; + */ + com.google.protobuf.ByteString + getSenderBytes(); + + // optional uint64 timestamp = 2; + /** + * optional uint64 timestamp = 2; + */ + boolean hasTimestamp(); + /** + * optional uint64 timestamp = 2; + */ + long getTimestamp(); + } + /** + * Protobuf type {@code signalservice.SyncMessage.Read} + */ + public static final class Read extends + com.google.protobuf.GeneratedMessage + implements ReadOrBuilder { + // Use Read.newBuilder() to construct. + private Read(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Read(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Read defaultInstance; + public static Read getDefaultInstance() { + return defaultInstance; + } + + public Read getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Read( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + sender_ = input.readBytes(); + break; + } + case 16: { + bitField0_ |= 0x00000002; + timestamp_ = input.readUInt64(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Read_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Read_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read.class, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Read parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Read(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional string sender = 1; + public static final int SENDER_FIELD_NUMBER = 1; + private Object sender_; + /** + * optional string sender = 1; + */ + public boolean hasSender() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string sender = 1; + */ + public String getSender() { + Object ref = sender_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + sender_ = s; + } + return s; + } + } + /** + * optional string sender = 1; + */ + public com.google.protobuf.ByteString + getSenderBytes() { + Object ref = sender_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + sender_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional uint64 timestamp = 2; + public static final int TIMESTAMP_FIELD_NUMBER = 2; + private long timestamp_; + /** + * optional uint64 timestamp = 2; + */ + public boolean hasTimestamp() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional uint64 timestamp = 2; + */ + public long getTimestamp() { + return timestamp_; + } + + private void initFields() { + sender_ = ""; + timestamp_ = 0L; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getSenderBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeUInt64(2, timestamp_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getSenderBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(2, timestamp_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.SyncMessage.Read} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.ReadOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Read_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Read_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read.class, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + sender_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + timestamp_ = 0L; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Read_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read result = new org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.sender_ = sender_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.timestamp_ = timestamp_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read.getDefaultInstance()) return this; + if (other.hasSender()) { + bitField0_ |= 0x00000001; + sender_ = other.sender_; + onChanged(); + } + if (other.hasTimestamp()) { + setTimestamp(other.getTimestamp()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional string sender = 1; + private Object sender_ = ""; + /** + * optional string sender = 1; + */ + public boolean hasSender() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string sender = 1; + */ + public String getSender() { + Object ref = sender_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + sender_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string sender = 1; + */ + public com.google.protobuf.ByteString + getSenderBytes() { + Object ref = sender_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + sender_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string sender = 1; + */ + public Builder setSender( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + sender_ = value; + onChanged(); + return this; + } + /** + * optional string sender = 1; + */ + public Builder clearSender() { + bitField0_ = (bitField0_ & ~0x00000001); + sender_ = getDefaultInstance().getSender(); + onChanged(); + return this; + } + /** + * optional string sender = 1; + */ + public Builder setSenderBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + sender_ = value; + onChanged(); + return this; + } + + // optional uint64 timestamp = 2; + private long timestamp_ ; + /** + * optional uint64 timestamp = 2; + */ + public boolean hasTimestamp() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional uint64 timestamp = 2; + */ + public long getTimestamp() { + return timestamp_; + } + /** + * optional uint64 timestamp = 2; + */ + public Builder setTimestamp(long value) { + bitField0_ |= 0x00000002; + timestamp_ = value; + onChanged(); + return this; + } + /** + * optional uint64 timestamp = 2; + */ + public Builder clearTimestamp() { + bitField0_ = (bitField0_ & ~0x00000002); + timestamp_ = 0L; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.SyncMessage.Read) + } + + static { + defaultInstance = new Read(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.SyncMessage.Read) + } + + public interface ConfigurationOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional bool readReceipts = 1; + /** + * optional bool readReceipts = 1; + */ + boolean hasReadReceipts(); + /** + * optional bool readReceipts = 1; + */ + boolean getReadReceipts(); + + // optional bool unidentifiedDeliveryIndicators = 2; + /** + * optional bool unidentifiedDeliveryIndicators = 2; + */ + boolean hasUnidentifiedDeliveryIndicators(); + /** + * optional bool unidentifiedDeliveryIndicators = 2; + */ + boolean getUnidentifiedDeliveryIndicators(); + + // optional bool typingIndicators = 3; + /** + * optional bool typingIndicators = 3; + */ + boolean hasTypingIndicators(); + /** + * optional bool typingIndicators = 3; + */ + boolean getTypingIndicators(); + + // optional bool linkPreviews = 4; + /** + * optional bool linkPreviews = 4; + */ + boolean hasLinkPreviews(); + /** + * optional bool linkPreviews = 4; + */ + boolean getLinkPreviews(); + } + /** + * Protobuf type {@code signalservice.SyncMessage.Configuration} + */ + public static final class Configuration extends + com.google.protobuf.GeneratedMessage + implements ConfigurationOrBuilder { + // Use Configuration.newBuilder() to construct. + private Configuration(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Configuration(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Configuration defaultInstance; + public static Configuration getDefaultInstance() { + return defaultInstance; + } + + public Configuration getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Configuration( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + readReceipts_ = input.readBool(); + break; + } + case 16: { + bitField0_ |= 0x00000002; + unidentifiedDeliveryIndicators_ = input.readBool(); + break; + } + case 24: { + bitField0_ |= 0x00000004; + typingIndicators_ = input.readBool(); + break; + } + case 32: { + bitField0_ |= 0x00000008; + linkPreviews_ = input.readBool(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Configuration_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Configuration_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration.class, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Configuration parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Configuration(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional bool readReceipts = 1; + public static final int READRECEIPTS_FIELD_NUMBER = 1; + private boolean readReceipts_; + /** + * optional bool readReceipts = 1; + */ + public boolean hasReadReceipts() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bool readReceipts = 1; + */ + public boolean getReadReceipts() { + return readReceipts_; + } + + // optional bool unidentifiedDeliveryIndicators = 2; + public static final int UNIDENTIFIEDDELIVERYINDICATORS_FIELD_NUMBER = 2; + private boolean unidentifiedDeliveryIndicators_; + /** + * optional bool unidentifiedDeliveryIndicators = 2; + */ + public boolean hasUnidentifiedDeliveryIndicators() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bool unidentifiedDeliveryIndicators = 2; + */ + public boolean getUnidentifiedDeliveryIndicators() { + return unidentifiedDeliveryIndicators_; + } + + // optional bool typingIndicators = 3; + public static final int TYPINGINDICATORS_FIELD_NUMBER = 3; + private boolean typingIndicators_; + /** + * optional bool typingIndicators = 3; + */ + public boolean hasTypingIndicators() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bool typingIndicators = 3; + */ + public boolean getTypingIndicators() { + return typingIndicators_; + } + + // optional bool linkPreviews = 4; + public static final int LINKPREVIEWS_FIELD_NUMBER = 4; + private boolean linkPreviews_; + /** + * optional bool linkPreviews = 4; + */ + public boolean hasLinkPreviews() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional bool linkPreviews = 4; + */ + public boolean getLinkPreviews() { + return linkPreviews_; + } + + private void initFields() { + readReceipts_ = false; + unidentifiedDeliveryIndicators_ = false; + typingIndicators_ = false; + linkPreviews_ = false; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBool(1, readReceipts_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBool(2, unidentifiedDeliveryIndicators_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBool(3, typingIndicators_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeBool(4, linkPreviews_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(1, readReceipts_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(2, unidentifiedDeliveryIndicators_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(3, typingIndicators_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(4, linkPreviews_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.SyncMessage.Configuration} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.ConfigurationOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Configuration_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Configuration_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration.class, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + readReceipts_ = false; + bitField0_ = (bitField0_ & ~0x00000001); + unidentifiedDeliveryIndicators_ = false; + bitField0_ = (bitField0_ & ~0x00000002); + typingIndicators_ = false; + bitField0_ = (bitField0_ & ~0x00000004); + linkPreviews_ = false; + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_Configuration_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration result = new org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.readReceipts_ = readReceipts_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.unidentifiedDeliveryIndicators_ = unidentifiedDeliveryIndicators_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.typingIndicators_ = typingIndicators_; + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000008; + } + result.linkPreviews_ = linkPreviews_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration.getDefaultInstance()) return this; + if (other.hasReadReceipts()) { + setReadReceipts(other.getReadReceipts()); + } + if (other.hasUnidentifiedDeliveryIndicators()) { + setUnidentifiedDeliveryIndicators(other.getUnidentifiedDeliveryIndicators()); + } + if (other.hasTypingIndicators()) { + setTypingIndicators(other.getTypingIndicators()); + } + if (other.hasLinkPreviews()) { + setLinkPreviews(other.getLinkPreviews()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional bool readReceipts = 1; + private boolean readReceipts_ ; + /** + * optional bool readReceipts = 1; + */ + public boolean hasReadReceipts() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bool readReceipts = 1; + */ + public boolean getReadReceipts() { + return readReceipts_; + } + /** + * optional bool readReceipts = 1; + */ + public Builder setReadReceipts(boolean value) { + bitField0_ |= 0x00000001; + readReceipts_ = value; + onChanged(); + return this; + } + /** + * optional bool readReceipts = 1; + */ + public Builder clearReadReceipts() { + bitField0_ = (bitField0_ & ~0x00000001); + readReceipts_ = false; + onChanged(); + return this; + } + + // optional bool unidentifiedDeliveryIndicators = 2; + private boolean unidentifiedDeliveryIndicators_ ; + /** + * optional bool unidentifiedDeliveryIndicators = 2; + */ + public boolean hasUnidentifiedDeliveryIndicators() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bool unidentifiedDeliveryIndicators = 2; + */ + public boolean getUnidentifiedDeliveryIndicators() { + return unidentifiedDeliveryIndicators_; + } + /** + * optional bool unidentifiedDeliveryIndicators = 2; + */ + public Builder setUnidentifiedDeliveryIndicators(boolean value) { + bitField0_ |= 0x00000002; + unidentifiedDeliveryIndicators_ = value; + onChanged(); + return this; + } + /** + * optional bool unidentifiedDeliveryIndicators = 2; + */ + public Builder clearUnidentifiedDeliveryIndicators() { + bitField0_ = (bitField0_ & ~0x00000002); + unidentifiedDeliveryIndicators_ = false; + onChanged(); + return this; + } + + // optional bool typingIndicators = 3; + private boolean typingIndicators_ ; + /** + * optional bool typingIndicators = 3; + */ + public boolean hasTypingIndicators() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bool typingIndicators = 3; + */ + public boolean getTypingIndicators() { + return typingIndicators_; + } + /** + * optional bool typingIndicators = 3; + */ + public Builder setTypingIndicators(boolean value) { + bitField0_ |= 0x00000004; + typingIndicators_ = value; + onChanged(); + return this; + } + /** + * optional bool typingIndicators = 3; + */ + public Builder clearTypingIndicators() { + bitField0_ = (bitField0_ & ~0x00000004); + typingIndicators_ = false; + onChanged(); + return this; + } + + // optional bool linkPreviews = 4; + private boolean linkPreviews_ ; + /** + * optional bool linkPreviews = 4; + */ + public boolean hasLinkPreviews() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional bool linkPreviews = 4; + */ + public boolean getLinkPreviews() { + return linkPreviews_; + } + /** + * optional bool linkPreviews = 4; + */ + public Builder setLinkPreviews(boolean value) { + bitField0_ |= 0x00000008; + linkPreviews_ = value; + onChanged(); + return this; + } + /** + * optional bool linkPreviews = 4; + */ + public Builder clearLinkPreviews() { + bitField0_ = (bitField0_ & ~0x00000008); + linkPreviews_ = false; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.SyncMessage.Configuration) + } + + static { + defaultInstance = new Configuration(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.SyncMessage.Configuration) + } + + public interface StickerPackOperationOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional bytes packId = 1; + /** + * optional bytes packId = 1; + */ + boolean hasPackId(); + /** + * optional bytes packId = 1; + */ + com.google.protobuf.ByteString getPackId(); + + // optional bytes packKey = 2; + /** + * optional bytes packKey = 2; + */ + boolean hasPackKey(); + /** + * optional bytes packKey = 2; + */ + com.google.protobuf.ByteString getPackKey(); + + // optional .signalservice.SyncMessage.StickerPackOperation.Type type = 3; + /** + * optional .signalservice.SyncMessage.StickerPackOperation.Type type = 3; + */ + boolean hasType(); + /** + * optional .signalservice.SyncMessage.StickerPackOperation.Type type = 3; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.Type getType(); + } + /** + * Protobuf type {@code signalservice.SyncMessage.StickerPackOperation} + */ + public static final class StickerPackOperation extends + com.google.protobuf.GeneratedMessage + implements StickerPackOperationOrBuilder { + // Use StickerPackOperation.newBuilder() to construct. + private StickerPackOperation(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private StickerPackOperation(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final StickerPackOperation defaultInstance; + public static StickerPackOperation getDefaultInstance() { + return defaultInstance; + } + + public StickerPackOperation getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private StickerPackOperation( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + packId_ = input.readBytes(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + packKey_ = input.readBytes(); + break; + } + case 24: { + int rawValue = input.readEnum(); + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.Type value = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.Type.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(3, rawValue); + } else { + bitField0_ |= 0x00000004; + type_ = value; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_StickerPackOperation_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_StickerPackOperation_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.class, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public StickerPackOperation parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new StickerPackOperation(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + /** + * Protobuf enum {@code signalservice.SyncMessage.StickerPackOperation.Type} + */ + public enum Type + implements com.google.protobuf.ProtocolMessageEnum { + /** + * INSTALL = 0; + */ + INSTALL(0, 0), + /** + * REMOVE = 1; + */ + REMOVE(1, 1), + ; + + /** + * INSTALL = 0; + */ + public static final int INSTALL_VALUE = 0; + /** + * REMOVE = 1; + */ + public static final int REMOVE_VALUE = 1; + + + public final int getNumber() { return value; } + + public static Type valueOf(int value) { + switch (value) { + case 0: return INSTALL; + case 1: return REMOVE; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static com.google.protobuf.Internal.EnumLiteMap + internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Type findValueByNumber(int number) { + return Type.valueOf(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(index); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.getDescriptor().getEnumTypes().get(0); + } + + private static final Type[] VALUES = values(); + + public static Type valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int index; + private final int value; + + private Type(int index, int value) { + this.index = index; + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:signalservice.SyncMessage.StickerPackOperation.Type) + } + + private int bitField0_; + // optional bytes packId = 1; + public static final int PACKID_FIELD_NUMBER = 1; + private com.google.protobuf.ByteString packId_; + /** + * optional bytes packId = 1; + */ + public boolean hasPackId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes packId = 1; + */ + public com.google.protobuf.ByteString getPackId() { + return packId_; + } + + // optional bytes packKey = 2; + public static final int PACKKEY_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString packKey_; + /** + * optional bytes packKey = 2; + */ + public boolean hasPackKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes packKey = 2; + */ + public com.google.protobuf.ByteString getPackKey() { + return packKey_; + } + + // optional .signalservice.SyncMessage.StickerPackOperation.Type type = 3; + public static final int TYPE_FIELD_NUMBER = 3; + private org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.Type type_; + /** + * optional .signalservice.SyncMessage.StickerPackOperation.Type type = 3; + */ + public boolean hasType() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .signalservice.SyncMessage.StickerPackOperation.Type type = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.Type getType() { + return type_; + } + + private void initFields() { + packId_ = com.google.protobuf.ByteString.EMPTY; + packKey_ = com.google.protobuf.ByteString.EMPTY; + type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.Type.INSTALL; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, packId_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, packKey_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeEnum(3, type_.getNumber()); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, packId_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, packKey_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(3, type_.getNumber()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.SyncMessage.StickerPackOperation} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperationOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_StickerPackOperation_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_StickerPackOperation_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.class, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + packId_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + packKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.Type.INSTALL; + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_StickerPackOperation_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation result = new org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.packId_ = packId_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.packKey_ = packKey_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.type_ = type_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.getDefaultInstance()) return this; + if (other.hasPackId()) { + setPackId(other.getPackId()); + } + if (other.hasPackKey()) { + setPackKey(other.getPackKey()); + } + if (other.hasType()) { + setType(other.getType()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional bytes packId = 1; + private com.google.protobuf.ByteString packId_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes packId = 1; + */ + public boolean hasPackId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes packId = 1; + */ + public com.google.protobuf.ByteString getPackId() { + return packId_; + } + /** + * optional bytes packId = 1; + */ + public Builder setPackId(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + packId_ = value; + onChanged(); + return this; + } + /** + * optional bytes packId = 1; + */ + public Builder clearPackId() { + bitField0_ = (bitField0_ & ~0x00000001); + packId_ = getDefaultInstance().getPackId(); + onChanged(); + return this; + } + + // optional bytes packKey = 2; + private com.google.protobuf.ByteString packKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes packKey = 2; + */ + public boolean hasPackKey() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bytes packKey = 2; + */ + public com.google.protobuf.ByteString getPackKey() { + return packKey_; + } + /** + * optional bytes packKey = 2; + */ + public Builder setPackKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + packKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes packKey = 2; + */ + public Builder clearPackKey() { + bitField0_ = (bitField0_ & ~0x00000002); + packKey_ = getDefaultInstance().getPackKey(); + onChanged(); + return this; + } + + // optional .signalservice.SyncMessage.StickerPackOperation.Type type = 3; + private org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.Type type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.Type.INSTALL; + /** + * optional .signalservice.SyncMessage.StickerPackOperation.Type type = 3; + */ + public boolean hasType() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .signalservice.SyncMessage.StickerPackOperation.Type type = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.Type getType() { + return type_; + } + /** + * optional .signalservice.SyncMessage.StickerPackOperation.Type type = 3; + */ + public Builder setType(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.Type value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + type_ = value; + onChanged(); + return this; + } + /** + * optional .signalservice.SyncMessage.StickerPackOperation.Type type = 3; + */ + public Builder clearType() { + bitField0_ = (bitField0_ & ~0x00000004); + type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.Type.INSTALL; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.SyncMessage.StickerPackOperation) + } + + static { + defaultInstance = new StickerPackOperation(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.SyncMessage.StickerPackOperation) + } + + public interface OpenGroupDetailsOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional string url = 1; + /** + * optional string url = 1; + */ + boolean hasUrl(); + /** + * optional string url = 1; + */ + String getUrl(); + /** + * optional string url = 1; + */ + com.google.protobuf.ByteString + getUrlBytes(); + + // optional uint32 channelID = 2; + /** + * optional uint32 channelID = 2; + */ + boolean hasChannelID(); + /** + * optional uint32 channelID = 2; + */ + int getChannelID(); + } + /** + * Protobuf type {@code signalservice.SyncMessage.OpenGroupDetails} + */ + public static final class OpenGroupDetails extends + com.google.protobuf.GeneratedMessage + implements OpenGroupDetailsOrBuilder { + // Use OpenGroupDetails.newBuilder() to construct. + private OpenGroupDetails(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private OpenGroupDetails(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final OpenGroupDetails defaultInstance; + public static OpenGroupDetails getDefaultInstance() { + return defaultInstance; + } + + public OpenGroupDetails getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private OpenGroupDetails( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + url_ = input.readBytes(); + break; + } + case 16: { + bitField0_ |= 0x00000002; + channelID_ = input.readUInt32(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_OpenGroupDetails_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_OpenGroupDetails_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails.class, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public OpenGroupDetails parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new OpenGroupDetails(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional string url = 1; + public static final int URL_FIELD_NUMBER = 1; + private Object url_; + /** + * optional string url = 1; + */ + public boolean hasUrl() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string url = 1; + */ + public String getUrl() { + Object ref = url_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + url_ = s; + } + return s; + } + } + /** + * optional string url = 1; + */ + public com.google.protobuf.ByteString + getUrlBytes() { + Object ref = url_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + url_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional uint32 channelID = 2; + public static final int CHANNELID_FIELD_NUMBER = 2; + private int channelID_; + /** + * optional uint32 channelID = 2; + */ + public boolean hasChannelID() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional uint32 channelID = 2; + */ + public int getChannelID() { + return channelID_; + } + + private void initFields() { + url_ = ""; + channelID_ = 0; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getUrlBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeUInt32(2, channelID_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getUrlBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(2, channelID_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.SyncMessage.OpenGroupDetails} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetailsOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_OpenGroupDetails_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_OpenGroupDetails_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails.class, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + url_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + channelID_ = 0; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_OpenGroupDetails_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails result = new org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.url_ = url_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.channelID_ = channelID_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails.getDefaultInstance()) return this; + if (other.hasUrl()) { + bitField0_ |= 0x00000001; + url_ = other.url_; + onChanged(); + } + if (other.hasChannelID()) { + setChannelID(other.getChannelID()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional string url = 1; + private Object url_ = ""; + /** + * optional string url = 1; + */ + public boolean hasUrl() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string url = 1; + */ + public String getUrl() { + Object ref = url_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + url_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string url = 1; + */ + public com.google.protobuf.ByteString + getUrlBytes() { + Object ref = url_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + url_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string url = 1; + */ + public Builder setUrl( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + url_ = value; + onChanged(); + return this; + } + /** + * optional string url = 1; + */ + public Builder clearUrl() { + bitField0_ = (bitField0_ & ~0x00000001); + url_ = getDefaultInstance().getUrl(); + onChanged(); + return this; + } + /** + * optional string url = 1; + */ + public Builder setUrlBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + url_ = value; + onChanged(); + return this; + } + + // optional uint32 channelID = 2; + private int channelID_ ; + /** + * optional uint32 channelID = 2; + */ + public boolean hasChannelID() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional uint32 channelID = 2; + */ + public int getChannelID() { + return channelID_; + } + /** + * optional uint32 channelID = 2; + */ + public Builder setChannelID(int value) { + bitField0_ |= 0x00000002; + channelID_ = value; + onChanged(); + return this; + } + /** + * optional uint32 channelID = 2; + */ + public Builder clearChannelID() { + bitField0_ = (bitField0_ & ~0x00000002); + channelID_ = 0; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.SyncMessage.OpenGroupDetails) + } + + static { + defaultInstance = new OpenGroupDetails(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.SyncMessage.OpenGroupDetails) + } + + private int bitField0_; + // optional .signalservice.SyncMessage.Sent sent = 1; + public static final int SENT_FIELD_NUMBER = 1; + private org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent sent_; + /** + * optional .signalservice.SyncMessage.Sent sent = 1; + */ + public boolean hasSent() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional .signalservice.SyncMessage.Sent sent = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent getSent() { + return sent_; + } + /** + * optional .signalservice.SyncMessage.Sent sent = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.SentOrBuilder getSentOrBuilder() { + return sent_; + } + + // optional .signalservice.SyncMessage.Contacts contacts = 2; + public static final int CONTACTS_FIELD_NUMBER = 2; + private org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts contacts_; + /** + * optional .signalservice.SyncMessage.Contacts contacts = 2; + */ + public boolean hasContacts() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .signalservice.SyncMessage.Contacts contacts = 2; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts getContacts() { + return contacts_; + } + /** + * optional .signalservice.SyncMessage.Contacts contacts = 2; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.ContactsOrBuilder getContactsOrBuilder() { + return contacts_; + } + + // optional .signalservice.SyncMessage.Groups groups = 3; + public static final int GROUPS_FIELD_NUMBER = 3; + private org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups groups_; + /** + * optional .signalservice.SyncMessage.Groups groups = 3; + */ + public boolean hasGroups() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .signalservice.SyncMessage.Groups groups = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups getGroups() { + return groups_; + } + /** + * optional .signalservice.SyncMessage.Groups groups = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.GroupsOrBuilder getGroupsOrBuilder() { + return groups_; + } + + // optional .signalservice.SyncMessage.Request request = 4; + public static final int REQUEST_FIELD_NUMBER = 4; + private org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request request_; + /** + * optional .signalservice.SyncMessage.Request request = 4; + */ + public boolean hasRequest() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional .signalservice.SyncMessage.Request request = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request getRequest() { + return request_; + } + /** + * optional .signalservice.SyncMessage.Request request = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.RequestOrBuilder getRequestOrBuilder() { + return request_; + } + + // repeated .signalservice.SyncMessage.Read read = 5; + public static final int READ_FIELD_NUMBER = 5; + private java.util.List read_; + /** + * repeated .signalservice.SyncMessage.Read read = 5; + */ + public java.util.List getReadList() { + return read_; + } + /** + * repeated .signalservice.SyncMessage.Read read = 5; + */ + public java.util.List + getReadOrBuilderList() { + return read_; + } + /** + * repeated .signalservice.SyncMessage.Read read = 5; + */ + public int getReadCount() { + return read_.size(); + } + /** + * repeated .signalservice.SyncMessage.Read read = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read getRead(int index) { + return read_.get(index); + } + /** + * repeated .signalservice.SyncMessage.Read read = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.ReadOrBuilder getReadOrBuilder( + int index) { + return read_.get(index); + } + + // optional .signalservice.SyncMessage.Blocked blocked = 6; + public static final int BLOCKED_FIELD_NUMBER = 6; + private org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked blocked_; + /** + * optional .signalservice.SyncMessage.Blocked blocked = 6; + */ + public boolean hasBlocked() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional .signalservice.SyncMessage.Blocked blocked = 6; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked getBlocked() { + return blocked_; + } + /** + * optional .signalservice.SyncMessage.Blocked blocked = 6; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.BlockedOrBuilder getBlockedOrBuilder() { + return blocked_; + } + + // optional .signalservice.Verified verified = 7; + public static final int VERIFIED_FIELD_NUMBER = 7; + private org.session.libsignal.service.internal.push.SignalServiceProtos.Verified verified_; + /** + * optional .signalservice.Verified verified = 7; + */ + public boolean hasVerified() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional .signalservice.Verified verified = 7; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.Verified getVerified() { + return verified_; + } + /** + * optional .signalservice.Verified verified = 7; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.VerifiedOrBuilder getVerifiedOrBuilder() { + return verified_; + } + + // optional .signalservice.SyncMessage.Configuration configuration = 9; + public static final int CONFIGURATION_FIELD_NUMBER = 9; + private org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration configuration_; + /** + * optional .signalservice.SyncMessage.Configuration configuration = 9; + */ + public boolean hasConfiguration() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * optional .signalservice.SyncMessage.Configuration configuration = 9; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration getConfiguration() { + return configuration_; + } + /** + * optional .signalservice.SyncMessage.Configuration configuration = 9; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.ConfigurationOrBuilder getConfigurationOrBuilder() { + return configuration_; + } + + // optional bytes padding = 8; + public static final int PADDING_FIELD_NUMBER = 8; + private com.google.protobuf.ByteString padding_; + /** + * optional bytes padding = 8; + */ + public boolean hasPadding() { + return ((bitField0_ & 0x00000080) == 0x00000080); + } + /** + * optional bytes padding = 8; + */ + public com.google.protobuf.ByteString getPadding() { + return padding_; + } + + // repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + public static final int STICKERPACKOPERATION_FIELD_NUMBER = 10; + private java.util.List stickerPackOperation_; + /** + * repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + */ + public java.util.List getStickerPackOperationList() { + return stickerPackOperation_; + } + /** + * repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + */ + public java.util.List + getStickerPackOperationOrBuilderList() { + return stickerPackOperation_; + } + /** + * repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + */ + public int getStickerPackOperationCount() { + return stickerPackOperation_.size(); + } + /** + * repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation getStickerPackOperation(int index) { + return stickerPackOperation_.get(index); + } + /** + * repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperationOrBuilder getStickerPackOperationOrBuilder( + int index) { + return stickerPackOperation_.get(index); + } + + // repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + public static final int OPENGROUPS_FIELD_NUMBER = 100; + private java.util.List openGroups_; + /** + * repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + */ + public java.util.List getOpenGroupsList() { + return openGroups_; + } + /** + * repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + */ + public java.util.List + getOpenGroupsOrBuilderList() { + return openGroups_; + } + /** + * repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + */ + public int getOpenGroupsCount() { + return openGroups_.size(); + } + /** + * repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails getOpenGroups(int index) { + return openGroups_.get(index); + } + /** + * repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetailsOrBuilder getOpenGroupsOrBuilder( + int index) { + return openGroups_.get(index); + } + + private void initFields() { + sent_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.getDefaultInstance(); + contacts_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts.getDefaultInstance(); + groups_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups.getDefaultInstance(); + request_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.getDefaultInstance(); + read_ = java.util.Collections.emptyList(); + blocked_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked.getDefaultInstance(); + verified_ = org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.getDefaultInstance(); + configuration_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration.getDefaultInstance(); + padding_ = com.google.protobuf.ByteString.EMPTY; + stickerPackOperation_ = java.util.Collections.emptyList(); + openGroups_ = java.util.Collections.emptyList(); + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeMessage(1, sent_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeMessage(2, contacts_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeMessage(3, groups_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeMessage(4, request_); + } + for (int i = 0; i < read_.size(); i++) { + output.writeMessage(5, read_.get(i)); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + output.writeMessage(6, blocked_); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + output.writeMessage(7, verified_); + } + if (((bitField0_ & 0x00000080) == 0x00000080)) { + output.writeBytes(8, padding_); + } + if (((bitField0_ & 0x00000040) == 0x00000040)) { + output.writeMessage(9, configuration_); + } + for (int i = 0; i < stickerPackOperation_.size(); i++) { + output.writeMessage(10, stickerPackOperation_.get(i)); + } + for (int i = 0; i < openGroups_.size(); i++) { + output.writeMessage(100, openGroups_.get(i)); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, sent_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, contacts_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, groups_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(4, request_); + } + for (int i = 0; i < read_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(5, read_.get(i)); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(6, blocked_); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(7, verified_); + } + if (((bitField0_ & 0x00000080) == 0x00000080)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(8, padding_); + } + if (((bitField0_ & 0x00000040) == 0x00000040)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(9, configuration_); + } + for (int i = 0; i < stickerPackOperation_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(10, stickerPackOperation_.get(i)); + } + for (int i = 0; i < openGroups_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(100, openGroups_.get(i)); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.SyncMessage} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.class, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getSentFieldBuilder(); + getContactsFieldBuilder(); + getGroupsFieldBuilder(); + getRequestFieldBuilder(); + getReadFieldBuilder(); + getBlockedFieldBuilder(); + getVerifiedFieldBuilder(); + getConfigurationFieldBuilder(); + getStickerPackOperationFieldBuilder(); + getOpenGroupsFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + if (sentBuilder_ == null) { + sent_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.getDefaultInstance(); + } else { + sentBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + if (contactsBuilder_ == null) { + contacts_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts.getDefaultInstance(); + } else { + contactsBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + if (groupsBuilder_ == null) { + groups_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups.getDefaultInstance(); + } else { + groupsBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + if (requestBuilder_ == null) { + request_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.getDefaultInstance(); + } else { + requestBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000008); + if (readBuilder_ == null) { + read_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000010); + } else { + readBuilder_.clear(); + } + if (blockedBuilder_ == null) { + blocked_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked.getDefaultInstance(); + } else { + blockedBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000020); + if (verifiedBuilder_ == null) { + verified_ = org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.getDefaultInstance(); + } else { + verifiedBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000040); + if (configurationBuilder_ == null) { + configuration_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration.getDefaultInstance(); + } else { + configurationBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000080); + padding_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000100); + if (stickerPackOperationBuilder_ == null) { + stickerPackOperation_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000200); + } else { + stickerPackOperationBuilder_.clear(); + } + if (openGroupsBuilder_ == null) { + openGroups_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000400); + } else { + openGroupsBuilder_.clear(); + } + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_SyncMessage_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage result = new org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + if (sentBuilder_ == null) { + result.sent_ = sent_; + } else { + result.sent_ = sentBuilder_.build(); + } + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + if (contactsBuilder_ == null) { + result.contacts_ = contacts_; + } else { + result.contacts_ = contactsBuilder_.build(); + } + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + if (groupsBuilder_ == null) { + result.groups_ = groups_; + } else { + result.groups_ = groupsBuilder_.build(); + } + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000008; + } + if (requestBuilder_ == null) { + result.request_ = request_; + } else { + result.request_ = requestBuilder_.build(); + } + if (readBuilder_ == null) { + if (((bitField0_ & 0x00000010) == 0x00000010)) { + read_ = java.util.Collections.unmodifiableList(read_); + bitField0_ = (bitField0_ & ~0x00000010); + } + result.read_ = read_; + } else { + result.read_ = readBuilder_.build(); + } + if (((from_bitField0_ & 0x00000020) == 0x00000020)) { + to_bitField0_ |= 0x00000010; + } + if (blockedBuilder_ == null) { + result.blocked_ = blocked_; + } else { + result.blocked_ = blockedBuilder_.build(); + } + if (((from_bitField0_ & 0x00000040) == 0x00000040)) { + to_bitField0_ |= 0x00000020; + } + if (verifiedBuilder_ == null) { + result.verified_ = verified_; + } else { + result.verified_ = verifiedBuilder_.build(); + } + if (((from_bitField0_ & 0x00000080) == 0x00000080)) { + to_bitField0_ |= 0x00000040; + } + if (configurationBuilder_ == null) { + result.configuration_ = configuration_; + } else { + result.configuration_ = configurationBuilder_.build(); + } + if (((from_bitField0_ & 0x00000100) == 0x00000100)) { + to_bitField0_ |= 0x00000080; + } + result.padding_ = padding_; + if (stickerPackOperationBuilder_ == null) { + if (((bitField0_ & 0x00000200) == 0x00000200)) { + stickerPackOperation_ = java.util.Collections.unmodifiableList(stickerPackOperation_); + bitField0_ = (bitField0_ & ~0x00000200); + } + result.stickerPackOperation_ = stickerPackOperation_; + } else { + result.stickerPackOperation_ = stickerPackOperationBuilder_.build(); + } + if (openGroupsBuilder_ == null) { + if (((bitField0_ & 0x00000400) == 0x00000400)) { + openGroups_ = java.util.Collections.unmodifiableList(openGroups_); + bitField0_ = (bitField0_ & ~0x00000400); + } + result.openGroups_ = openGroups_; + } else { + result.openGroups_ = openGroupsBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.getDefaultInstance()) return this; + if (other.hasSent()) { + mergeSent(other.getSent()); + } + if (other.hasContacts()) { + mergeContacts(other.getContacts()); + } + if (other.hasGroups()) { + mergeGroups(other.getGroups()); + } + if (other.hasRequest()) { + mergeRequest(other.getRequest()); + } + if (readBuilder_ == null) { + if (!other.read_.isEmpty()) { + if (read_.isEmpty()) { + read_ = other.read_; + bitField0_ = (bitField0_ & ~0x00000010); + } else { + ensureReadIsMutable(); + read_.addAll(other.read_); + } + onChanged(); + } + } else { + if (!other.read_.isEmpty()) { + if (readBuilder_.isEmpty()) { + readBuilder_.dispose(); + readBuilder_ = null; + read_ = other.read_; + bitField0_ = (bitField0_ & ~0x00000010); + readBuilder_ = + com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ? + getReadFieldBuilder() : null; + } else { + readBuilder_.addAllMessages(other.read_); + } + } + } + if (other.hasBlocked()) { + mergeBlocked(other.getBlocked()); + } + if (other.hasVerified()) { + mergeVerified(other.getVerified()); + } + if (other.hasConfiguration()) { + mergeConfiguration(other.getConfiguration()); + } + if (other.hasPadding()) { + setPadding(other.getPadding()); + } + if (stickerPackOperationBuilder_ == null) { + if (!other.stickerPackOperation_.isEmpty()) { + if (stickerPackOperation_.isEmpty()) { + stickerPackOperation_ = other.stickerPackOperation_; + bitField0_ = (bitField0_ & ~0x00000200); + } else { + ensureStickerPackOperationIsMutable(); + stickerPackOperation_.addAll(other.stickerPackOperation_); + } + onChanged(); + } + } else { + if (!other.stickerPackOperation_.isEmpty()) { + if (stickerPackOperationBuilder_.isEmpty()) { + stickerPackOperationBuilder_.dispose(); + stickerPackOperationBuilder_ = null; + stickerPackOperation_ = other.stickerPackOperation_; + bitField0_ = (bitField0_ & ~0x00000200); + stickerPackOperationBuilder_ = + com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ? + getStickerPackOperationFieldBuilder() : null; + } else { + stickerPackOperationBuilder_.addAllMessages(other.stickerPackOperation_); + } + } + } + if (openGroupsBuilder_ == null) { + if (!other.openGroups_.isEmpty()) { + if (openGroups_.isEmpty()) { + openGroups_ = other.openGroups_; + bitField0_ = (bitField0_ & ~0x00000400); + } else { + ensureOpenGroupsIsMutable(); + openGroups_.addAll(other.openGroups_); + } + onChanged(); + } + } else { + if (!other.openGroups_.isEmpty()) { + if (openGroupsBuilder_.isEmpty()) { + openGroupsBuilder_.dispose(); + openGroupsBuilder_ = null; + openGroups_ = other.openGroups_; + bitField0_ = (bitField0_ & ~0x00000400); + openGroupsBuilder_ = + com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ? + getOpenGroupsFieldBuilder() : null; + } else { + openGroupsBuilder_.addAllMessages(other.openGroups_); + } + } + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional .signalservice.SyncMessage.Sent sent = 1; + private org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent sent_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.SentOrBuilder> sentBuilder_; + /** + * optional .signalservice.SyncMessage.Sent sent = 1; + */ + public boolean hasSent() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional .signalservice.SyncMessage.Sent sent = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent getSent() { + if (sentBuilder_ == null) { + return sent_; + } else { + return sentBuilder_.getMessage(); + } + } + /** + * optional .signalservice.SyncMessage.Sent sent = 1; + */ + public Builder setSent(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent value) { + if (sentBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + sent_ = value; + onChanged(); + } else { + sentBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * optional .signalservice.SyncMessage.Sent sent = 1; + */ + public Builder setSent( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.Builder builderForValue) { + if (sentBuilder_ == null) { + sent_ = builderForValue.build(); + onChanged(); + } else { + sentBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * optional .signalservice.SyncMessage.Sent sent = 1; + */ + public Builder mergeSent(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent value) { + if (sentBuilder_ == null) { + if (((bitField0_ & 0x00000001) == 0x00000001) && + sent_ != org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.getDefaultInstance()) { + sent_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.newBuilder(sent_).mergeFrom(value).buildPartial(); + } else { + sent_ = value; + } + onChanged(); + } else { + sentBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * optional .signalservice.SyncMessage.Sent sent = 1; + */ + public Builder clearSent() { + if (sentBuilder_ == null) { + sent_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.getDefaultInstance(); + onChanged(); + } else { + sentBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + /** + * optional .signalservice.SyncMessage.Sent sent = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.Builder getSentBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getSentFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.SyncMessage.Sent sent = 1; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.SentOrBuilder getSentOrBuilder() { + if (sentBuilder_ != null) { + return sentBuilder_.getMessageOrBuilder(); + } else { + return sent_; + } + } + /** + * optional .signalservice.SyncMessage.Sent sent = 1; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.SentOrBuilder> + getSentFieldBuilder() { + if (sentBuilder_ == null) { + sentBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Sent.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.SentOrBuilder>( + sent_, + getParentForChildren(), + isClean()); + sent_ = null; + } + return sentBuilder_; + } + + // optional .signalservice.SyncMessage.Contacts contacts = 2; + private org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts contacts_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.ContactsOrBuilder> contactsBuilder_; + /** + * optional .signalservice.SyncMessage.Contacts contacts = 2; + */ + public boolean hasContacts() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .signalservice.SyncMessage.Contacts contacts = 2; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts getContacts() { + if (contactsBuilder_ == null) { + return contacts_; + } else { + return contactsBuilder_.getMessage(); + } + } + /** + * optional .signalservice.SyncMessage.Contacts contacts = 2; + */ + public Builder setContacts(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts value) { + if (contactsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + contacts_ = value; + onChanged(); + } else { + contactsBuilder_.setMessage(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .signalservice.SyncMessage.Contacts contacts = 2; + */ + public Builder setContacts( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts.Builder builderForValue) { + if (contactsBuilder_ == null) { + contacts_ = builderForValue.build(); + onChanged(); + } else { + contactsBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .signalservice.SyncMessage.Contacts contacts = 2; + */ + public Builder mergeContacts(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts value) { + if (contactsBuilder_ == null) { + if (((bitField0_ & 0x00000002) == 0x00000002) && + contacts_ != org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts.getDefaultInstance()) { + contacts_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts.newBuilder(contacts_).mergeFrom(value).buildPartial(); + } else { + contacts_ = value; + } + onChanged(); + } else { + contactsBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .signalservice.SyncMessage.Contacts contacts = 2; + */ + public Builder clearContacts() { + if (contactsBuilder_ == null) { + contacts_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts.getDefaultInstance(); + onChanged(); + } else { + contactsBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + /** + * optional .signalservice.SyncMessage.Contacts contacts = 2; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts.Builder getContactsBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getContactsFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.SyncMessage.Contacts contacts = 2; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.ContactsOrBuilder getContactsOrBuilder() { + if (contactsBuilder_ != null) { + return contactsBuilder_.getMessageOrBuilder(); + } else { + return contacts_; + } + } + /** + * optional .signalservice.SyncMessage.Contacts contacts = 2; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.ContactsOrBuilder> + getContactsFieldBuilder() { + if (contactsBuilder_ == null) { + contactsBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Contacts.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.ContactsOrBuilder>( + contacts_, + getParentForChildren(), + isClean()); + contacts_ = null; + } + return contactsBuilder_; + } + + // optional .signalservice.SyncMessage.Groups groups = 3; + private org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups groups_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.GroupsOrBuilder> groupsBuilder_; + /** + * optional .signalservice.SyncMessage.Groups groups = 3; + */ + public boolean hasGroups() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .signalservice.SyncMessage.Groups groups = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups getGroups() { + if (groupsBuilder_ == null) { + return groups_; + } else { + return groupsBuilder_.getMessage(); + } + } + /** + * optional .signalservice.SyncMessage.Groups groups = 3; + */ + public Builder setGroups(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups value) { + if (groupsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + groups_ = value; + onChanged(); + } else { + groupsBuilder_.setMessage(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .signalservice.SyncMessage.Groups groups = 3; + */ + public Builder setGroups( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups.Builder builderForValue) { + if (groupsBuilder_ == null) { + groups_ = builderForValue.build(); + onChanged(); + } else { + groupsBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .signalservice.SyncMessage.Groups groups = 3; + */ + public Builder mergeGroups(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups value) { + if (groupsBuilder_ == null) { + if (((bitField0_ & 0x00000004) == 0x00000004) && + groups_ != org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups.getDefaultInstance()) { + groups_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups.newBuilder(groups_).mergeFrom(value).buildPartial(); + } else { + groups_ = value; + } + onChanged(); + } else { + groupsBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .signalservice.SyncMessage.Groups groups = 3; + */ + public Builder clearGroups() { + if (groupsBuilder_ == null) { + groups_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups.getDefaultInstance(); + onChanged(); + } else { + groupsBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + /** + * optional .signalservice.SyncMessage.Groups groups = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups.Builder getGroupsBuilder() { + bitField0_ |= 0x00000004; + onChanged(); + return getGroupsFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.SyncMessage.Groups groups = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.GroupsOrBuilder getGroupsOrBuilder() { + if (groupsBuilder_ != null) { + return groupsBuilder_.getMessageOrBuilder(); + } else { + return groups_; + } + } + /** + * optional .signalservice.SyncMessage.Groups groups = 3; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.GroupsOrBuilder> + getGroupsFieldBuilder() { + if (groupsBuilder_ == null) { + groupsBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Groups.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.GroupsOrBuilder>( + groups_, + getParentForChildren(), + isClean()); + groups_ = null; + } + return groupsBuilder_; + } + + // optional .signalservice.SyncMessage.Request request = 4; + private org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request request_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.RequestOrBuilder> requestBuilder_; + /** + * optional .signalservice.SyncMessage.Request request = 4; + */ + public boolean hasRequest() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional .signalservice.SyncMessage.Request request = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request getRequest() { + if (requestBuilder_ == null) { + return request_; + } else { + return requestBuilder_.getMessage(); + } + } + /** + * optional .signalservice.SyncMessage.Request request = 4; + */ + public Builder setRequest(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request value) { + if (requestBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + request_ = value; + onChanged(); + } else { + requestBuilder_.setMessage(value); + } + bitField0_ |= 0x00000008; + return this; + } + /** + * optional .signalservice.SyncMessage.Request request = 4; + */ + public Builder setRequest( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.Builder builderForValue) { + if (requestBuilder_ == null) { + request_ = builderForValue.build(); + onChanged(); + } else { + requestBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000008; + return this; + } + /** + * optional .signalservice.SyncMessage.Request request = 4; + */ + public Builder mergeRequest(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request value) { + if (requestBuilder_ == null) { + if (((bitField0_ & 0x00000008) == 0x00000008) && + request_ != org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.getDefaultInstance()) { + request_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.newBuilder(request_).mergeFrom(value).buildPartial(); + } else { + request_ = value; + } + onChanged(); + } else { + requestBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000008; + return this; + } + /** + * optional .signalservice.SyncMessage.Request request = 4; + */ + public Builder clearRequest() { + if (requestBuilder_ == null) { + request_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.getDefaultInstance(); + onChanged(); + } else { + requestBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + /** + * optional .signalservice.SyncMessage.Request request = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.Builder getRequestBuilder() { + bitField0_ |= 0x00000008; + onChanged(); + return getRequestFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.SyncMessage.Request request = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.RequestOrBuilder getRequestOrBuilder() { + if (requestBuilder_ != null) { + return requestBuilder_.getMessageOrBuilder(); + } else { + return request_; + } + } + /** + * optional .signalservice.SyncMessage.Request request = 4; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.RequestOrBuilder> + getRequestFieldBuilder() { + if (requestBuilder_ == null) { + requestBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Request.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.RequestOrBuilder>( + request_, + getParentForChildren(), + isClean()); + request_ = null; + } + return requestBuilder_; + } + + // repeated .signalservice.SyncMessage.Read read = 5; + private java.util.List read_ = + java.util.Collections.emptyList(); + private void ensureReadIsMutable() { + if (!((bitField0_ & 0x00000010) == 0x00000010)) { + read_ = new java.util.ArrayList(read_); + bitField0_ |= 0x00000010; + } + } + + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.ReadOrBuilder> readBuilder_; + + /** + * repeated .signalservice.SyncMessage.Read read = 5; + */ + public java.util.List getReadList() { + if (readBuilder_ == null) { + return java.util.Collections.unmodifiableList(read_); + } else { + return readBuilder_.getMessageList(); + } + } + /** + * repeated .signalservice.SyncMessage.Read read = 5; + */ + public int getReadCount() { + if (readBuilder_ == null) { + return read_.size(); + } else { + return readBuilder_.getCount(); + } + } + /** + * repeated .signalservice.SyncMessage.Read read = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read getRead(int index) { + if (readBuilder_ == null) { + return read_.get(index); + } else { + return readBuilder_.getMessage(index); + } + } + /** + * repeated .signalservice.SyncMessage.Read read = 5; + */ + public Builder setRead( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read value) { + if (readBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureReadIsMutable(); + read_.set(index, value); + onChanged(); + } else { + readBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.Read read = 5; + */ + public Builder setRead( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read.Builder builderForValue) { + if (readBuilder_ == null) { + ensureReadIsMutable(); + read_.set(index, builderForValue.build()); + onChanged(); + } else { + readBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.Read read = 5; + */ + public Builder addRead(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read value) { + if (readBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureReadIsMutable(); + read_.add(value); + onChanged(); + } else { + readBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.Read read = 5; + */ + public Builder addRead( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read value) { + if (readBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureReadIsMutable(); + read_.add(index, value); + onChanged(); + } else { + readBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.Read read = 5; + */ + public Builder addRead( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read.Builder builderForValue) { + if (readBuilder_ == null) { + ensureReadIsMutable(); + read_.add(builderForValue.build()); + onChanged(); + } else { + readBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.Read read = 5; + */ + public Builder addRead( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read.Builder builderForValue) { + if (readBuilder_ == null) { + ensureReadIsMutable(); + read_.add(index, builderForValue.build()); + onChanged(); + } else { + readBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.Read read = 5; + */ + public Builder addAllRead( + Iterable values) { + if (readBuilder_ == null) { + ensureReadIsMutable(); + super.addAll(values, read_); + onChanged(); + } else { + readBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.Read read = 5; + */ + public Builder clearRead() { + if (readBuilder_ == null) { + read_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000010); + onChanged(); + } else { + readBuilder_.clear(); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.Read read = 5; + */ + public Builder removeRead(int index) { + if (readBuilder_ == null) { + ensureReadIsMutable(); + read_.remove(index); + onChanged(); + } else { + readBuilder_.remove(index); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.Read read = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read.Builder getReadBuilder( + int index) { + return getReadFieldBuilder().getBuilder(index); + } + /** + * repeated .signalservice.SyncMessage.Read read = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.ReadOrBuilder getReadOrBuilder( + int index) { + if (readBuilder_ == null) { + return read_.get(index); } else { + return readBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .signalservice.SyncMessage.Read read = 5; + */ + public java.util.List + getReadOrBuilderList() { + if (readBuilder_ != null) { + return readBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(read_); + } + } + /** + * repeated .signalservice.SyncMessage.Read read = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read.Builder addReadBuilder() { + return getReadFieldBuilder().addBuilder( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read.getDefaultInstance()); + } + /** + * repeated .signalservice.SyncMessage.Read read = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read.Builder addReadBuilder( + int index) { + return getReadFieldBuilder().addBuilder( + index, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read.getDefaultInstance()); + } + /** + * repeated .signalservice.SyncMessage.Read read = 5; + */ + public java.util.List + getReadBuilderList() { + return getReadFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.ReadOrBuilder> + getReadFieldBuilder() { + if (readBuilder_ == null) { + readBuilder_ = new com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Read.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.ReadOrBuilder>( + read_, + ((bitField0_ & 0x00000010) == 0x00000010), + getParentForChildren(), + isClean()); + read_ = null; + } + return readBuilder_; + } + + // optional .signalservice.SyncMessage.Blocked blocked = 6; + private org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked blocked_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.BlockedOrBuilder> blockedBuilder_; + /** + * optional .signalservice.SyncMessage.Blocked blocked = 6; + */ + public boolean hasBlocked() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional .signalservice.SyncMessage.Blocked blocked = 6; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked getBlocked() { + if (blockedBuilder_ == null) { + return blocked_; + } else { + return blockedBuilder_.getMessage(); + } + } + /** + * optional .signalservice.SyncMessage.Blocked blocked = 6; + */ + public Builder setBlocked(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked value) { + if (blockedBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + blocked_ = value; + onChanged(); + } else { + blockedBuilder_.setMessage(value); + } + bitField0_ |= 0x00000020; + return this; + } + /** + * optional .signalservice.SyncMessage.Blocked blocked = 6; + */ + public Builder setBlocked( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked.Builder builderForValue) { + if (blockedBuilder_ == null) { + blocked_ = builderForValue.build(); + onChanged(); + } else { + blockedBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000020; + return this; + } + /** + * optional .signalservice.SyncMessage.Blocked blocked = 6; + */ + public Builder mergeBlocked(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked value) { + if (blockedBuilder_ == null) { + if (((bitField0_ & 0x00000020) == 0x00000020) && + blocked_ != org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked.getDefaultInstance()) { + blocked_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked.newBuilder(blocked_).mergeFrom(value).buildPartial(); + } else { + blocked_ = value; + } + onChanged(); + } else { + blockedBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000020; + return this; + } + /** + * optional .signalservice.SyncMessage.Blocked blocked = 6; + */ + public Builder clearBlocked() { + if (blockedBuilder_ == null) { + blocked_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked.getDefaultInstance(); + onChanged(); + } else { + blockedBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000020); + return this; + } + /** + * optional .signalservice.SyncMessage.Blocked blocked = 6; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked.Builder getBlockedBuilder() { + bitField0_ |= 0x00000020; + onChanged(); + return getBlockedFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.SyncMessage.Blocked blocked = 6; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.BlockedOrBuilder getBlockedOrBuilder() { + if (blockedBuilder_ != null) { + return blockedBuilder_.getMessageOrBuilder(); + } else { + return blocked_; + } + } + /** + * optional .signalservice.SyncMessage.Blocked blocked = 6; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.BlockedOrBuilder> + getBlockedFieldBuilder() { + if (blockedBuilder_ == null) { + blockedBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Blocked.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.BlockedOrBuilder>( + blocked_, + getParentForChildren(), + isClean()); + blocked_ = null; + } + return blockedBuilder_; + } + + // optional .signalservice.Verified verified = 7; + private org.session.libsignal.service.internal.push.SignalServiceProtos.Verified verified_ = org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.Verified, org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.VerifiedOrBuilder> verifiedBuilder_; + /** + * optional .signalservice.Verified verified = 7; + */ + public boolean hasVerified() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * optional .signalservice.Verified verified = 7; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.Verified getVerified() { + if (verifiedBuilder_ == null) { + return verified_; + } else { + return verifiedBuilder_.getMessage(); + } + } + /** + * optional .signalservice.Verified verified = 7; + */ + public Builder setVerified(org.session.libsignal.service.internal.push.SignalServiceProtos.Verified value) { + if (verifiedBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + verified_ = value; + onChanged(); + } else { + verifiedBuilder_.setMessage(value); + } + bitField0_ |= 0x00000040; + return this; + } + /** + * optional .signalservice.Verified verified = 7; + */ + public Builder setVerified( + org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.Builder builderForValue) { + if (verifiedBuilder_ == null) { + verified_ = builderForValue.build(); + onChanged(); + } else { + verifiedBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000040; + return this; + } + /** + * optional .signalservice.Verified verified = 7; + */ + public Builder mergeVerified(org.session.libsignal.service.internal.push.SignalServiceProtos.Verified value) { + if (verifiedBuilder_ == null) { + if (((bitField0_ & 0x00000040) == 0x00000040) && + verified_ != org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.getDefaultInstance()) { + verified_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.newBuilder(verified_).mergeFrom(value).buildPartial(); + } else { + verified_ = value; + } + onChanged(); + } else { + verifiedBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000040; + return this; + } + /** + * optional .signalservice.Verified verified = 7; + */ + public Builder clearVerified() { + if (verifiedBuilder_ == null) { + verified_ = org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.getDefaultInstance(); + onChanged(); + } else { + verifiedBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000040); + return this; + } + /** + * optional .signalservice.Verified verified = 7; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.Builder getVerifiedBuilder() { + bitField0_ |= 0x00000040; + onChanged(); + return getVerifiedFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.Verified verified = 7; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.VerifiedOrBuilder getVerifiedOrBuilder() { + if (verifiedBuilder_ != null) { + return verifiedBuilder_.getMessageOrBuilder(); + } else { + return verified_; + } + } + /** + * optional .signalservice.Verified verified = 7; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.Verified, org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.VerifiedOrBuilder> + getVerifiedFieldBuilder() { + if (verifiedBuilder_ == null) { + verifiedBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.Verified, org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.VerifiedOrBuilder>( + verified_, + getParentForChildren(), + isClean()); + verified_ = null; + } + return verifiedBuilder_; + } + + // optional .signalservice.SyncMessage.Configuration configuration = 9; + private org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration configuration_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.ConfigurationOrBuilder> configurationBuilder_; + /** + * optional .signalservice.SyncMessage.Configuration configuration = 9; + */ + public boolean hasConfiguration() { + return ((bitField0_ & 0x00000080) == 0x00000080); + } + /** + * optional .signalservice.SyncMessage.Configuration configuration = 9; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration getConfiguration() { + if (configurationBuilder_ == null) { + return configuration_; + } else { + return configurationBuilder_.getMessage(); + } + } + /** + * optional .signalservice.SyncMessage.Configuration configuration = 9; + */ + public Builder setConfiguration(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration value) { + if (configurationBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + configuration_ = value; + onChanged(); + } else { + configurationBuilder_.setMessage(value); + } + bitField0_ |= 0x00000080; + return this; + } + /** + * optional .signalservice.SyncMessage.Configuration configuration = 9; + */ + public Builder setConfiguration( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration.Builder builderForValue) { + if (configurationBuilder_ == null) { + configuration_ = builderForValue.build(); + onChanged(); + } else { + configurationBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000080; + return this; + } + /** + * optional .signalservice.SyncMessage.Configuration configuration = 9; + */ + public Builder mergeConfiguration(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration value) { + if (configurationBuilder_ == null) { + if (((bitField0_ & 0x00000080) == 0x00000080) && + configuration_ != org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration.getDefaultInstance()) { + configuration_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration.newBuilder(configuration_).mergeFrom(value).buildPartial(); + } else { + configuration_ = value; + } + onChanged(); + } else { + configurationBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000080; + return this; + } + /** + * optional .signalservice.SyncMessage.Configuration configuration = 9; + */ + public Builder clearConfiguration() { + if (configurationBuilder_ == null) { + configuration_ = org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration.getDefaultInstance(); + onChanged(); + } else { + configurationBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000080); + return this; + } + /** + * optional .signalservice.SyncMessage.Configuration configuration = 9; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration.Builder getConfigurationBuilder() { + bitField0_ |= 0x00000080; + onChanged(); + return getConfigurationFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.SyncMessage.Configuration configuration = 9; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.ConfigurationOrBuilder getConfigurationOrBuilder() { + if (configurationBuilder_ != null) { + return configurationBuilder_.getMessageOrBuilder(); + } else { + return configuration_; + } + } + /** + * optional .signalservice.SyncMessage.Configuration configuration = 9; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.ConfigurationOrBuilder> + getConfigurationFieldBuilder() { + if (configurationBuilder_ == null) { + configurationBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.Configuration.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.ConfigurationOrBuilder>( + configuration_, + getParentForChildren(), + isClean()); + configuration_ = null; + } + return configurationBuilder_; + } + + // optional bytes padding = 8; + private com.google.protobuf.ByteString padding_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes padding = 8; + */ + public boolean hasPadding() { + return ((bitField0_ & 0x00000100) == 0x00000100); + } + /** + * optional bytes padding = 8; + */ + public com.google.protobuf.ByteString getPadding() { + return padding_; + } + /** + * optional bytes padding = 8; + */ + public Builder setPadding(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000100; + padding_ = value; + onChanged(); + return this; + } + /** + * optional bytes padding = 8; + */ + public Builder clearPadding() { + bitField0_ = (bitField0_ & ~0x00000100); + padding_ = getDefaultInstance().getPadding(); + onChanged(); + return this; + } + + // repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + private java.util.List stickerPackOperation_ = + java.util.Collections.emptyList(); + private void ensureStickerPackOperationIsMutable() { + if (!((bitField0_ & 0x00000200) == 0x00000200)) { + stickerPackOperation_ = new java.util.ArrayList(stickerPackOperation_); + bitField0_ |= 0x00000200; + } + } + + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperationOrBuilder> stickerPackOperationBuilder_; + + /** + * repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + */ + public java.util.List getStickerPackOperationList() { + if (stickerPackOperationBuilder_ == null) { + return java.util.Collections.unmodifiableList(stickerPackOperation_); + } else { + return stickerPackOperationBuilder_.getMessageList(); + } + } + /** + * repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + */ + public int getStickerPackOperationCount() { + if (stickerPackOperationBuilder_ == null) { + return stickerPackOperation_.size(); + } else { + return stickerPackOperationBuilder_.getCount(); + } + } + /** + * repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation getStickerPackOperation(int index) { + if (stickerPackOperationBuilder_ == null) { + return stickerPackOperation_.get(index); + } else { + return stickerPackOperationBuilder_.getMessage(index); + } + } + /** + * repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + */ + public Builder setStickerPackOperation( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation value) { + if (stickerPackOperationBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureStickerPackOperationIsMutable(); + stickerPackOperation_.set(index, value); + onChanged(); + } else { + stickerPackOperationBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + */ + public Builder setStickerPackOperation( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.Builder builderForValue) { + if (stickerPackOperationBuilder_ == null) { + ensureStickerPackOperationIsMutable(); + stickerPackOperation_.set(index, builderForValue.build()); + onChanged(); + } else { + stickerPackOperationBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + */ + public Builder addStickerPackOperation(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation value) { + if (stickerPackOperationBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureStickerPackOperationIsMutable(); + stickerPackOperation_.add(value); + onChanged(); + } else { + stickerPackOperationBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + */ + public Builder addStickerPackOperation( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation value) { + if (stickerPackOperationBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureStickerPackOperationIsMutable(); + stickerPackOperation_.add(index, value); + onChanged(); + } else { + stickerPackOperationBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + */ + public Builder addStickerPackOperation( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.Builder builderForValue) { + if (stickerPackOperationBuilder_ == null) { + ensureStickerPackOperationIsMutable(); + stickerPackOperation_.add(builderForValue.build()); + onChanged(); + } else { + stickerPackOperationBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + */ + public Builder addStickerPackOperation( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.Builder builderForValue) { + if (stickerPackOperationBuilder_ == null) { + ensureStickerPackOperationIsMutable(); + stickerPackOperation_.add(index, builderForValue.build()); + onChanged(); + } else { + stickerPackOperationBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + */ + public Builder addAllStickerPackOperation( + Iterable values) { + if (stickerPackOperationBuilder_ == null) { + ensureStickerPackOperationIsMutable(); + super.addAll(values, stickerPackOperation_); + onChanged(); + } else { + stickerPackOperationBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + */ + public Builder clearStickerPackOperation() { + if (stickerPackOperationBuilder_ == null) { + stickerPackOperation_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000200); + onChanged(); + } else { + stickerPackOperationBuilder_.clear(); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + */ + public Builder removeStickerPackOperation(int index) { + if (stickerPackOperationBuilder_ == null) { + ensureStickerPackOperationIsMutable(); + stickerPackOperation_.remove(index); + onChanged(); + } else { + stickerPackOperationBuilder_.remove(index); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.Builder getStickerPackOperationBuilder( + int index) { + return getStickerPackOperationFieldBuilder().getBuilder(index); + } + /** + * repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperationOrBuilder getStickerPackOperationOrBuilder( + int index) { + if (stickerPackOperationBuilder_ == null) { + return stickerPackOperation_.get(index); } else { + return stickerPackOperationBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + */ + public java.util.List + getStickerPackOperationOrBuilderList() { + if (stickerPackOperationBuilder_ != null) { + return stickerPackOperationBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(stickerPackOperation_); + } + } + /** + * repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.Builder addStickerPackOperationBuilder() { + return getStickerPackOperationFieldBuilder().addBuilder( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.getDefaultInstance()); + } + /** + * repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.Builder addStickerPackOperationBuilder( + int index) { + return getStickerPackOperationFieldBuilder().addBuilder( + index, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.getDefaultInstance()); + } + /** + * repeated .signalservice.SyncMessage.StickerPackOperation stickerPackOperation = 10; + */ + public java.util.List + getStickerPackOperationBuilderList() { + return getStickerPackOperationFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperationOrBuilder> + getStickerPackOperationFieldBuilder() { + if (stickerPackOperationBuilder_ == null) { + stickerPackOperationBuilder_ = new com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperation.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.StickerPackOperationOrBuilder>( + stickerPackOperation_, + ((bitField0_ & 0x00000200) == 0x00000200), + getParentForChildren(), + isClean()); + stickerPackOperation_ = null; + } + return stickerPackOperationBuilder_; + } + + // repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + private java.util.List openGroups_ = + java.util.Collections.emptyList(); + private void ensureOpenGroupsIsMutable() { + if (!((bitField0_ & 0x00000400) == 0x00000400)) { + openGroups_ = new java.util.ArrayList(openGroups_); + bitField0_ |= 0x00000400; + } + } + + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetailsOrBuilder> openGroupsBuilder_; + + /** + * repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + */ + public java.util.List getOpenGroupsList() { + if (openGroupsBuilder_ == null) { + return java.util.Collections.unmodifiableList(openGroups_); + } else { + return openGroupsBuilder_.getMessageList(); + } + } + /** + * repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + */ + public int getOpenGroupsCount() { + if (openGroupsBuilder_ == null) { + return openGroups_.size(); + } else { + return openGroupsBuilder_.getCount(); + } + } + /** + * repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails getOpenGroups(int index) { + if (openGroupsBuilder_ == null) { + return openGroups_.get(index); + } else { + return openGroupsBuilder_.getMessage(index); + } + } + /** + * repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + */ + public Builder setOpenGroups( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails value) { + if (openGroupsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureOpenGroupsIsMutable(); + openGroups_.set(index, value); + onChanged(); + } else { + openGroupsBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + */ + public Builder setOpenGroups( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails.Builder builderForValue) { + if (openGroupsBuilder_ == null) { + ensureOpenGroupsIsMutable(); + openGroups_.set(index, builderForValue.build()); + onChanged(); + } else { + openGroupsBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + */ + public Builder addOpenGroups(org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails value) { + if (openGroupsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureOpenGroupsIsMutable(); + openGroups_.add(value); + onChanged(); + } else { + openGroupsBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + */ + public Builder addOpenGroups( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails value) { + if (openGroupsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureOpenGroupsIsMutable(); + openGroups_.add(index, value); + onChanged(); + } else { + openGroupsBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + */ + public Builder addOpenGroups( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails.Builder builderForValue) { + if (openGroupsBuilder_ == null) { + ensureOpenGroupsIsMutable(); + openGroups_.add(builderForValue.build()); + onChanged(); + } else { + openGroupsBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + */ + public Builder addOpenGroups( + int index, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails.Builder builderForValue) { + if (openGroupsBuilder_ == null) { + ensureOpenGroupsIsMutable(); + openGroups_.add(index, builderForValue.build()); + onChanged(); + } else { + openGroupsBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + */ + public Builder addAllOpenGroups( + Iterable values) { + if (openGroupsBuilder_ == null) { + ensureOpenGroupsIsMutable(); + super.addAll(values, openGroups_); + onChanged(); + } else { + openGroupsBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + */ + public Builder clearOpenGroups() { + if (openGroupsBuilder_ == null) { + openGroups_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000400); + onChanged(); + } else { + openGroupsBuilder_.clear(); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + */ + public Builder removeOpenGroups(int index) { + if (openGroupsBuilder_ == null) { + ensureOpenGroupsIsMutable(); + openGroups_.remove(index); + onChanged(); + } else { + openGroupsBuilder_.remove(index); + } + return this; + } + /** + * repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails.Builder getOpenGroupsBuilder( + int index) { + return getOpenGroupsFieldBuilder().getBuilder(index); + } + /** + * repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetailsOrBuilder getOpenGroupsOrBuilder( + int index) { + if (openGroupsBuilder_ == null) { + return openGroups_.get(index); } else { + return openGroupsBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + */ + public java.util.List + getOpenGroupsOrBuilderList() { + if (openGroupsBuilder_ != null) { + return openGroupsBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(openGroups_); + } + } + /** + * repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails.Builder addOpenGroupsBuilder() { + return getOpenGroupsFieldBuilder().addBuilder( + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails.getDefaultInstance()); + } + /** + * repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails.Builder addOpenGroupsBuilder( + int index) { + return getOpenGroupsFieldBuilder().addBuilder( + index, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails.getDefaultInstance()); + } + /** + * repeated .signalservice.SyncMessage.OpenGroupDetails openGroups = 100; + */ + public java.util.List + getOpenGroupsBuilderList() { + return getOpenGroupsFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetailsOrBuilder> + getOpenGroupsFieldBuilder() { + if (openGroupsBuilder_ == null) { + openGroupsBuilder_ = new com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetails.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.SyncMessage.OpenGroupDetailsOrBuilder>( + openGroups_, + ((bitField0_ & 0x00000400) == 0x00000400), + getParentForChildren(), + isClean()); + openGroups_ = null; + } + return openGroupsBuilder_; + } + + // @@protoc_insertion_point(builder_scope:signalservice.SyncMessage) + } + + static { + defaultInstance = new SyncMessage(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.SyncMessage) + } + + public interface AttachmentPointerOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional fixed64 id = 1; + /** + * optional fixed64 id = 1; + */ + boolean hasId(); + /** + * optional fixed64 id = 1; + */ + long getId(); + + // optional string contentType = 2; + /** + * optional string contentType = 2; + */ + boolean hasContentType(); + /** + * optional string contentType = 2; + */ + String getContentType(); + /** + * optional string contentType = 2; + */ + com.google.protobuf.ByteString + getContentTypeBytes(); + + // optional bytes key = 3; + /** + * optional bytes key = 3; + */ + boolean hasKey(); + /** + * optional bytes key = 3; + */ + com.google.protobuf.ByteString getKey(); + + // optional uint32 size = 4; + /** + * optional uint32 size = 4; + */ + boolean hasSize(); + /** + * optional uint32 size = 4; + */ + int getSize(); + + // optional bytes thumbnail = 5; + /** + * optional bytes thumbnail = 5; + */ + boolean hasThumbnail(); + /** + * optional bytes thumbnail = 5; + */ + com.google.protobuf.ByteString getThumbnail(); + + // optional bytes digest = 6; + /** + * optional bytes digest = 6; + */ + boolean hasDigest(); + /** + * optional bytes digest = 6; + */ + com.google.protobuf.ByteString getDigest(); + + // optional string fileName = 7; + /** + * optional string fileName = 7; + */ + boolean hasFileName(); + /** + * optional string fileName = 7; + */ + String getFileName(); + /** + * optional string fileName = 7; + */ + com.google.protobuf.ByteString + getFileNameBytes(); + + // optional uint32 flags = 8; + /** + * optional uint32 flags = 8; + */ + boolean hasFlags(); + /** + * optional uint32 flags = 8; + */ + int getFlags(); + + // optional uint32 width = 9; + /** + * optional uint32 width = 9; + */ + boolean hasWidth(); + /** + * optional uint32 width = 9; + */ + int getWidth(); + + // optional uint32 height = 10; + /** + * optional uint32 height = 10; + */ + boolean hasHeight(); + /** + * optional uint32 height = 10; + */ + int getHeight(); + + // optional string caption = 11; + /** + * optional string caption = 11; + */ + boolean hasCaption(); + /** + * optional string caption = 11; + */ + String getCaption(); + /** + * optional string caption = 11; + */ + com.google.protobuf.ByteString + getCaptionBytes(); + + // optional string url = 101; + /** + * optional string url = 101; + */ + boolean hasUrl(); + /** + * optional string url = 101; + */ + String getUrl(); + /** + * optional string url = 101; + */ + com.google.protobuf.ByteString + getUrlBytes(); + } + /** + * Protobuf type {@code signalservice.AttachmentPointer} + */ + public static final class AttachmentPointer extends + com.google.protobuf.GeneratedMessage + implements AttachmentPointerOrBuilder { + // Use AttachmentPointer.newBuilder() to construct. + private AttachmentPointer(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private AttachmentPointer(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final AttachmentPointer defaultInstance; + public static AttachmentPointer getDefaultInstance() { + return defaultInstance; + } + + public AttachmentPointer getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private AttachmentPointer( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 9: { + bitField0_ |= 0x00000001; + id_ = input.readFixed64(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + contentType_ = input.readBytes(); + break; + } + case 26: { + bitField0_ |= 0x00000004; + key_ = input.readBytes(); + break; + } + case 32: { + bitField0_ |= 0x00000008; + size_ = input.readUInt32(); + break; + } + case 42: { + bitField0_ |= 0x00000010; + thumbnail_ = input.readBytes(); + break; + } + case 50: { + bitField0_ |= 0x00000020; + digest_ = input.readBytes(); + break; + } + case 58: { + bitField0_ |= 0x00000040; + fileName_ = input.readBytes(); + break; + } + case 64: { + bitField0_ |= 0x00000080; + flags_ = input.readUInt32(); + break; + } + case 72: { + bitField0_ |= 0x00000100; + width_ = input.readUInt32(); + break; + } + case 80: { + bitField0_ |= 0x00000200; + height_ = input.readUInt32(); + break; + } + case 90: { + bitField0_ |= 0x00000400; + caption_ = input.readBytes(); + break; + } + case 810: { + bitField0_ |= 0x00000800; + url_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_AttachmentPointer_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_AttachmentPointer_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.class, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public AttachmentPointer parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new AttachmentPointer(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + /** + * Protobuf enum {@code signalservice.AttachmentPointer.Flags} + */ + public enum Flags + implements com.google.protobuf.ProtocolMessageEnum { + /** + * VOICE_MESSAGE = 1; + */ + VOICE_MESSAGE(0, 1), + ; + + /** + * VOICE_MESSAGE = 1; + */ + public static final int VOICE_MESSAGE_VALUE = 1; + + + public final int getNumber() { return value; } + + public static Flags valueOf(int value) { + switch (value) { + case 1: return VOICE_MESSAGE; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static com.google.protobuf.Internal.EnumLiteMap + internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Flags findValueByNumber(int number) { + return Flags.valueOf(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(index); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDescriptor().getEnumTypes().get(0); + } + + private static final Flags[] VALUES = values(); + + public static Flags valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int index; + private final int value; + + private Flags(int index, int value) { + this.index = index; + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:signalservice.AttachmentPointer.Flags) + } + + private int bitField0_; + // optional fixed64 id = 1; + public static final int ID_FIELD_NUMBER = 1; + private long id_; + /** + * optional fixed64 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional fixed64 id = 1; + */ + public long getId() { + return id_; + } + + // optional string contentType = 2; + public static final int CONTENTTYPE_FIELD_NUMBER = 2; + private Object contentType_; + /** + * optional string contentType = 2; + */ + public boolean hasContentType() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string contentType = 2; + */ + public String getContentType() { + Object ref = contentType_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + contentType_ = s; + } + return s; + } + } + /** + * optional string contentType = 2; + */ + public com.google.protobuf.ByteString + getContentTypeBytes() { + Object ref = contentType_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + contentType_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional bytes key = 3; + public static final int KEY_FIELD_NUMBER = 3; + private com.google.protobuf.ByteString key_; + /** + * optional bytes key = 3; + */ + public boolean hasKey() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes key = 3; + */ + public com.google.protobuf.ByteString getKey() { + return key_; + } + + // optional uint32 size = 4; + public static final int SIZE_FIELD_NUMBER = 4; + private int size_; + /** + * optional uint32 size = 4; + */ + public boolean hasSize() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional uint32 size = 4; + */ + public int getSize() { + return size_; + } + + // optional bytes thumbnail = 5; + public static final int THUMBNAIL_FIELD_NUMBER = 5; + private com.google.protobuf.ByteString thumbnail_; + /** + * optional bytes thumbnail = 5; + */ + public boolean hasThumbnail() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional bytes thumbnail = 5; + */ + public com.google.protobuf.ByteString getThumbnail() { + return thumbnail_; + } + + // optional bytes digest = 6; + public static final int DIGEST_FIELD_NUMBER = 6; + private com.google.protobuf.ByteString digest_; + /** + * optional bytes digest = 6; + */ + public boolean hasDigest() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional bytes digest = 6; + */ + public com.google.protobuf.ByteString getDigest() { + return digest_; + } + + // optional string fileName = 7; + public static final int FILENAME_FIELD_NUMBER = 7; + private Object fileName_; + /** + * optional string fileName = 7; + */ + public boolean hasFileName() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * optional string fileName = 7; + */ + public String getFileName() { + Object ref = fileName_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + fileName_ = s; + } + return s; + } + } + /** + * optional string fileName = 7; + */ + public com.google.protobuf.ByteString + getFileNameBytes() { + Object ref = fileName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + fileName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional uint32 flags = 8; + public static final int FLAGS_FIELD_NUMBER = 8; + private int flags_; + /** + * optional uint32 flags = 8; + */ + public boolean hasFlags() { + return ((bitField0_ & 0x00000080) == 0x00000080); + } + /** + * optional uint32 flags = 8; + */ + public int getFlags() { + return flags_; + } + + // optional uint32 width = 9; + public static final int WIDTH_FIELD_NUMBER = 9; + private int width_; + /** + * optional uint32 width = 9; + */ + public boolean hasWidth() { + return ((bitField0_ & 0x00000100) == 0x00000100); + } + /** + * optional uint32 width = 9; + */ + public int getWidth() { + return width_; + } + + // optional uint32 height = 10; + public static final int HEIGHT_FIELD_NUMBER = 10; + private int height_; + /** + * optional uint32 height = 10; + */ + public boolean hasHeight() { + return ((bitField0_ & 0x00000200) == 0x00000200); + } + /** + * optional uint32 height = 10; + */ + public int getHeight() { + return height_; + } + + // optional string caption = 11; + public static final int CAPTION_FIELD_NUMBER = 11; + private Object caption_; + /** + * optional string caption = 11; + */ + public boolean hasCaption() { + return ((bitField0_ & 0x00000400) == 0x00000400); + } + /** + * optional string caption = 11; + */ + public String getCaption() { + Object ref = caption_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + caption_ = s; + } + return s; + } + } + /** + * optional string caption = 11; + */ + public com.google.protobuf.ByteString + getCaptionBytes() { + Object ref = caption_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + caption_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional string url = 101; + public static final int URL_FIELD_NUMBER = 101; + private Object url_; + /** + * optional string url = 101; + */ + public boolean hasUrl() { + return ((bitField0_ & 0x00000800) == 0x00000800); + } + /** + * optional string url = 101; + */ + public String getUrl() { + Object ref = url_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + url_ = s; + } + return s; + } + } + /** + * optional string url = 101; + */ + public com.google.protobuf.ByteString + getUrlBytes() { + Object ref = url_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + url_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private void initFields() { + id_ = 0L; + contentType_ = ""; + key_ = com.google.protobuf.ByteString.EMPTY; + size_ = 0; + thumbnail_ = com.google.protobuf.ByteString.EMPTY; + digest_ = com.google.protobuf.ByteString.EMPTY; + fileName_ = ""; + flags_ = 0; + width_ = 0; + height_ = 0; + caption_ = ""; + url_ = ""; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeFixed64(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, getContentTypeBytes()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(3, key_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeUInt32(4, size_); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + output.writeBytes(5, thumbnail_); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + output.writeBytes(6, digest_); + } + if (((bitField0_ & 0x00000040) == 0x00000040)) { + output.writeBytes(7, getFileNameBytes()); + } + if (((bitField0_ & 0x00000080) == 0x00000080)) { + output.writeUInt32(8, flags_); + } + if (((bitField0_ & 0x00000100) == 0x00000100)) { + output.writeUInt32(9, width_); + } + if (((bitField0_ & 0x00000200) == 0x00000200)) { + output.writeUInt32(10, height_); + } + if (((bitField0_ & 0x00000400) == 0x00000400)) { + output.writeBytes(11, getCaptionBytes()); + } + if (((bitField0_ & 0x00000800) == 0x00000800)) { + output.writeBytes(101, getUrlBytes()); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeFixed64Size(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, getContentTypeBytes()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, key_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(4, size_); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(5, thumbnail_); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(6, digest_); + } + if (((bitField0_ & 0x00000040) == 0x00000040)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(7, getFileNameBytes()); + } + if (((bitField0_ & 0x00000080) == 0x00000080)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(8, flags_); + } + if (((bitField0_ & 0x00000100) == 0x00000100)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(9, width_); + } + if (((bitField0_ & 0x00000200) == 0x00000200)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(10, height_); + } + if (((bitField0_ & 0x00000400) == 0x00000400)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(11, getCaptionBytes()); + } + if (((bitField0_ & 0x00000800) == 0x00000800)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(101, getUrlBytes()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.AttachmentPointer} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_AttachmentPointer_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_AttachmentPointer_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.class, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + id_ = 0L; + bitField0_ = (bitField0_ & ~0x00000001); + contentType_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + key_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000004); + size_ = 0; + bitField0_ = (bitField0_ & ~0x00000008); + thumbnail_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000010); + digest_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000020); + fileName_ = ""; + bitField0_ = (bitField0_ & ~0x00000040); + flags_ = 0; + bitField0_ = (bitField0_ & ~0x00000080); + width_ = 0; + bitField0_ = (bitField0_ & ~0x00000100); + height_ = 0; + bitField0_ = (bitField0_ & ~0x00000200); + caption_ = ""; + bitField0_ = (bitField0_ & ~0x00000400); + url_ = ""; + bitField0_ = (bitField0_ & ~0x00000800); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_AttachmentPointer_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer result = new org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.id_ = id_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.contentType_ = contentType_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.key_ = key_; + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000008; + } + result.size_ = size_; + if (((from_bitField0_ & 0x00000010) == 0x00000010)) { + to_bitField0_ |= 0x00000010; + } + result.thumbnail_ = thumbnail_; + if (((from_bitField0_ & 0x00000020) == 0x00000020)) { + to_bitField0_ |= 0x00000020; + } + result.digest_ = digest_; + if (((from_bitField0_ & 0x00000040) == 0x00000040)) { + to_bitField0_ |= 0x00000040; + } + result.fileName_ = fileName_; + if (((from_bitField0_ & 0x00000080) == 0x00000080)) { + to_bitField0_ |= 0x00000080; + } + result.flags_ = flags_; + if (((from_bitField0_ & 0x00000100) == 0x00000100)) { + to_bitField0_ |= 0x00000100; + } + result.width_ = width_; + if (((from_bitField0_ & 0x00000200) == 0x00000200)) { + to_bitField0_ |= 0x00000200; + } + result.height_ = height_; + if (((from_bitField0_ & 0x00000400) == 0x00000400)) { + to_bitField0_ |= 0x00000400; + } + result.caption_ = caption_; + if (((from_bitField0_ & 0x00000800) == 0x00000800)) { + to_bitField0_ |= 0x00000800; + } + result.url_ = url_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance()) return this; + if (other.hasId()) { + setId(other.getId()); + } + if (other.hasContentType()) { + bitField0_ |= 0x00000002; + contentType_ = other.contentType_; + onChanged(); + } + if (other.hasKey()) { + setKey(other.getKey()); + } + if (other.hasSize()) { + setSize(other.getSize()); + } + if (other.hasThumbnail()) { + setThumbnail(other.getThumbnail()); + } + if (other.hasDigest()) { + setDigest(other.getDigest()); + } + if (other.hasFileName()) { + bitField0_ |= 0x00000040; + fileName_ = other.fileName_; + onChanged(); + } + if (other.hasFlags()) { + setFlags(other.getFlags()); + } + if (other.hasWidth()) { + setWidth(other.getWidth()); + } + if (other.hasHeight()) { + setHeight(other.getHeight()); + } + if (other.hasCaption()) { + bitField0_ |= 0x00000400; + caption_ = other.caption_; + onChanged(); + } + if (other.hasUrl()) { + bitField0_ |= 0x00000800; + url_ = other.url_; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional fixed64 id = 1; + private long id_ ; + /** + * optional fixed64 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional fixed64 id = 1; + */ + public long getId() { + return id_; + } + /** + * optional fixed64 id = 1; + */ + public Builder setId(long value) { + bitField0_ |= 0x00000001; + id_ = value; + onChanged(); + return this; + } + /** + * optional fixed64 id = 1; + */ + public Builder clearId() { + bitField0_ = (bitField0_ & ~0x00000001); + id_ = 0L; + onChanged(); + return this; + } + + // optional string contentType = 2; + private Object contentType_ = ""; + /** + * optional string contentType = 2; + */ + public boolean hasContentType() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string contentType = 2; + */ + public String getContentType() { + Object ref = contentType_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + contentType_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string contentType = 2; + */ + public com.google.protobuf.ByteString + getContentTypeBytes() { + Object ref = contentType_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + contentType_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string contentType = 2; + */ + public Builder setContentType( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + contentType_ = value; + onChanged(); + return this; + } + /** + * optional string contentType = 2; + */ + public Builder clearContentType() { + bitField0_ = (bitField0_ & ~0x00000002); + contentType_ = getDefaultInstance().getContentType(); + onChanged(); + return this; + } + /** + * optional string contentType = 2; + */ + public Builder setContentTypeBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + contentType_ = value; + onChanged(); + return this; + } + + // optional bytes key = 3; + private com.google.protobuf.ByteString key_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes key = 3; + */ + public boolean hasKey() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes key = 3; + */ + public com.google.protobuf.ByteString getKey() { + return key_; + } + /** + * optional bytes key = 3; + */ + public Builder setKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + key_ = value; + onChanged(); + return this; + } + /** + * optional bytes key = 3; + */ + public Builder clearKey() { + bitField0_ = (bitField0_ & ~0x00000004); + key_ = getDefaultInstance().getKey(); + onChanged(); + return this; + } + + // optional uint32 size = 4; + private int size_ ; + /** + * optional uint32 size = 4; + */ + public boolean hasSize() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional uint32 size = 4; + */ + public int getSize() { + return size_; + } + /** + * optional uint32 size = 4; + */ + public Builder setSize(int value) { + bitField0_ |= 0x00000008; + size_ = value; + onChanged(); + return this; + } + /** + * optional uint32 size = 4; + */ + public Builder clearSize() { + bitField0_ = (bitField0_ & ~0x00000008); + size_ = 0; + onChanged(); + return this; + } + + // optional bytes thumbnail = 5; + private com.google.protobuf.ByteString thumbnail_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes thumbnail = 5; + */ + public boolean hasThumbnail() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional bytes thumbnail = 5; + */ + public com.google.protobuf.ByteString getThumbnail() { + return thumbnail_; + } + /** + * optional bytes thumbnail = 5; + */ + public Builder setThumbnail(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000010; + thumbnail_ = value; + onChanged(); + return this; + } + /** + * optional bytes thumbnail = 5; + */ + public Builder clearThumbnail() { + bitField0_ = (bitField0_ & ~0x00000010); + thumbnail_ = getDefaultInstance().getThumbnail(); + onChanged(); + return this; + } + + // optional bytes digest = 6; + private com.google.protobuf.ByteString digest_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes digest = 6; + */ + public boolean hasDigest() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional bytes digest = 6; + */ + public com.google.protobuf.ByteString getDigest() { + return digest_; + } + /** + * optional bytes digest = 6; + */ + public Builder setDigest(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000020; + digest_ = value; + onChanged(); + return this; + } + /** + * optional bytes digest = 6; + */ + public Builder clearDigest() { + bitField0_ = (bitField0_ & ~0x00000020); + digest_ = getDefaultInstance().getDigest(); + onChanged(); + return this; + } + + // optional string fileName = 7; + private Object fileName_ = ""; + /** + * optional string fileName = 7; + */ + public boolean hasFileName() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * optional string fileName = 7; + */ + public String getFileName() { + Object ref = fileName_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + fileName_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string fileName = 7; + */ + public com.google.protobuf.ByteString + getFileNameBytes() { + Object ref = fileName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + fileName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string fileName = 7; + */ + public Builder setFileName( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000040; + fileName_ = value; + onChanged(); + return this; + } + /** + * optional string fileName = 7; + */ + public Builder clearFileName() { + bitField0_ = (bitField0_ & ~0x00000040); + fileName_ = getDefaultInstance().getFileName(); + onChanged(); + return this; + } + /** + * optional string fileName = 7; + */ + public Builder setFileNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000040; + fileName_ = value; + onChanged(); + return this; + } + + // optional uint32 flags = 8; + private int flags_ ; + /** + * optional uint32 flags = 8; + */ + public boolean hasFlags() { + return ((bitField0_ & 0x00000080) == 0x00000080); + } + /** + * optional uint32 flags = 8; + */ + public int getFlags() { + return flags_; + } + /** + * optional uint32 flags = 8; + */ + public Builder setFlags(int value) { + bitField0_ |= 0x00000080; + flags_ = value; + onChanged(); + return this; + } + /** + * optional uint32 flags = 8; + */ + public Builder clearFlags() { + bitField0_ = (bitField0_ & ~0x00000080); + flags_ = 0; + onChanged(); + return this; + } + + // optional uint32 width = 9; + private int width_ ; + /** + * optional uint32 width = 9; + */ + public boolean hasWidth() { + return ((bitField0_ & 0x00000100) == 0x00000100); + } + /** + * optional uint32 width = 9; + */ + public int getWidth() { + return width_; + } + /** + * optional uint32 width = 9; + */ + public Builder setWidth(int value) { + bitField0_ |= 0x00000100; + width_ = value; + onChanged(); + return this; + } + /** + * optional uint32 width = 9; + */ + public Builder clearWidth() { + bitField0_ = (bitField0_ & ~0x00000100); + width_ = 0; + onChanged(); + return this; + } + + // optional uint32 height = 10; + private int height_ ; + /** + * optional uint32 height = 10; + */ + public boolean hasHeight() { + return ((bitField0_ & 0x00000200) == 0x00000200); + } + /** + * optional uint32 height = 10; + */ + public int getHeight() { + return height_; + } + /** + * optional uint32 height = 10; + */ + public Builder setHeight(int value) { + bitField0_ |= 0x00000200; + height_ = value; + onChanged(); + return this; + } + /** + * optional uint32 height = 10; + */ + public Builder clearHeight() { + bitField0_ = (bitField0_ & ~0x00000200); + height_ = 0; + onChanged(); + return this; + } + + // optional string caption = 11; + private Object caption_ = ""; + /** + * optional string caption = 11; + */ + public boolean hasCaption() { + return ((bitField0_ & 0x00000400) == 0x00000400); + } + /** + * optional string caption = 11; + */ + public String getCaption() { + Object ref = caption_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + caption_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string caption = 11; + */ + public com.google.protobuf.ByteString + getCaptionBytes() { + Object ref = caption_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + caption_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string caption = 11; + */ + public Builder setCaption( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000400; + caption_ = value; + onChanged(); + return this; + } + /** + * optional string caption = 11; + */ + public Builder clearCaption() { + bitField0_ = (bitField0_ & ~0x00000400); + caption_ = getDefaultInstance().getCaption(); + onChanged(); + return this; + } + /** + * optional string caption = 11; + */ + public Builder setCaptionBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000400; + caption_ = value; + onChanged(); + return this; + } + + // optional string url = 101; + private Object url_ = ""; + /** + * optional string url = 101; + */ + public boolean hasUrl() { + return ((bitField0_ & 0x00000800) == 0x00000800); + } + /** + * optional string url = 101; + */ + public String getUrl() { + Object ref = url_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + url_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string url = 101; + */ + public com.google.protobuf.ByteString + getUrlBytes() { + Object ref = url_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + url_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string url = 101; + */ + public Builder setUrl( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000800; + url_ = value; + onChanged(); + return this; + } + /** + * optional string url = 101; + */ + public Builder clearUrl() { + bitField0_ = (bitField0_ & ~0x00000800); + url_ = getDefaultInstance().getUrl(); + onChanged(); + return this; + } + /** + * optional string url = 101; + */ + public Builder setUrlBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000800; + url_ = value; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.AttachmentPointer) + } + + static { + defaultInstance = new AttachmentPointer(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.AttachmentPointer) + } + + public interface GroupContextOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional bytes id = 1; + /** + * optional bytes id = 1; + */ + boolean hasId(); + /** + * optional bytes id = 1; + */ + com.google.protobuf.ByteString getId(); + + // optional .signalservice.GroupContext.Type type = 2; + /** + * optional .signalservice.GroupContext.Type type = 2; + */ + boolean hasType(); + /** + * optional .signalservice.GroupContext.Type type = 2; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.Type getType(); + + // optional string name = 3; + /** + * optional string name = 3; + */ + boolean hasName(); + /** + * optional string name = 3; + */ + String getName(); + /** + * optional string name = 3; + */ + com.google.protobuf.ByteString + getNameBytes(); + + // repeated string members = 4; + /** + * repeated string members = 4; + */ + java.util.List + getMembersList(); + /** + * repeated string members = 4; + */ + int getMembersCount(); + /** + * repeated string members = 4; + */ + String getMembers(int index); + /** + * repeated string members = 4; + */ + com.google.protobuf.ByteString + getMembersBytes(int index); + + // optional .signalservice.AttachmentPointer avatar = 5; + /** + * optional .signalservice.AttachmentPointer avatar = 5; + */ + boolean hasAvatar(); + /** + * optional .signalservice.AttachmentPointer avatar = 5; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer getAvatar(); + /** + * optional .signalservice.AttachmentPointer avatar = 5; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder getAvatarOrBuilder(); + + // repeated string admins = 6; + /** + * repeated string admins = 6; + */ + java.util.List + getAdminsList(); + /** + * repeated string admins = 6; + */ + int getAdminsCount(); + /** + * repeated string admins = 6; + */ + String getAdmins(int index); + /** + * repeated string admins = 6; + */ + com.google.protobuf.ByteString + getAdminsBytes(int index); + + // repeated string newMembers = 998; + /** + * repeated string newMembers = 998; + * + *
+     * Loki - These fields are only used internally for the Android code base.
+     * This is so that we can differentiate adding/kicking.
+     * DO NOT USE WHEN SENDING MESSAGES.
+     * 
+ */ + java.util.List + getNewMembersList(); + /** + * repeated string newMembers = 998; + * + *
+     * Loki - These fields are only used internally for the Android code base.
+     * This is so that we can differentiate adding/kicking.
+     * DO NOT USE WHEN SENDING MESSAGES.
+     * 
+ */ + int getNewMembersCount(); + /** + * repeated string newMembers = 998; + * + *
+     * Loki - These fields are only used internally for the Android code base.
+     * This is so that we can differentiate adding/kicking.
+     * DO NOT USE WHEN SENDING MESSAGES.
+     * 
+ */ + String getNewMembers(int index); + /** + * repeated string newMembers = 998; + * + *
+     * Loki - These fields are only used internally for the Android code base.
+     * This is so that we can differentiate adding/kicking.
+     * DO NOT USE WHEN SENDING MESSAGES.
+     * 
+ */ + com.google.protobuf.ByteString + getNewMembersBytes(int index); + + // repeated string removedMembers = 999; + /** + * repeated string removedMembers = 999; + */ + java.util.List + getRemovedMembersList(); + /** + * repeated string removedMembers = 999; + */ + int getRemovedMembersCount(); + /** + * repeated string removedMembers = 999; + */ + String getRemovedMembers(int index); + /** + * repeated string removedMembers = 999; + */ + com.google.protobuf.ByteString + getRemovedMembersBytes(int index); + } + /** + * Protobuf type {@code signalservice.GroupContext} + */ + public static final class GroupContext extends + com.google.protobuf.GeneratedMessage + implements GroupContextOrBuilder { + // Use GroupContext.newBuilder() to construct. + private GroupContext(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private GroupContext(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final GroupContext defaultInstance; + public static GroupContext getDefaultInstance() { + return defaultInstance; + } + + public GroupContext getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private GroupContext( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + id_ = input.readBytes(); + break; + } + case 16: { + int rawValue = input.readEnum(); + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.Type value = org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.Type.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(2, rawValue); + } else { + bitField0_ |= 0x00000002; + type_ = value; + } + break; + } + case 26: { + bitField0_ |= 0x00000004; + name_ = input.readBytes(); + break; + } + case 34: { + if (!((mutable_bitField0_ & 0x00000008) == 0x00000008)) { + members_ = new com.google.protobuf.LazyStringArrayList(); + mutable_bitField0_ |= 0x00000008; + } + members_.add(input.readBytes()); + break; + } + case 42: { + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder subBuilder = null; + if (((bitField0_ & 0x00000008) == 0x00000008)) { + subBuilder = avatar_.toBuilder(); + } + avatar_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(avatar_); + avatar_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000008; + break; + } + case 50: { + if (!((mutable_bitField0_ & 0x00000020) == 0x00000020)) { + admins_ = new com.google.protobuf.LazyStringArrayList(); + mutable_bitField0_ |= 0x00000020; + } + admins_.add(input.readBytes()); + break; + } + case 7986: { + if (!((mutable_bitField0_ & 0x00000040) == 0x00000040)) { + newMembers_ = new com.google.protobuf.LazyStringArrayList(); + mutable_bitField0_ |= 0x00000040; + } + newMembers_.add(input.readBytes()); + break; + } + case 7994: { + if (!((mutable_bitField0_ & 0x00000080) == 0x00000080)) { + removedMembers_ = new com.google.protobuf.LazyStringArrayList(); + mutable_bitField0_ |= 0x00000080; + } + removedMembers_.add(input.readBytes()); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000008) == 0x00000008)) { + members_ = new com.google.protobuf.UnmodifiableLazyStringList(members_); + } + if (((mutable_bitField0_ & 0x00000020) == 0x00000020)) { + admins_ = new com.google.protobuf.UnmodifiableLazyStringList(admins_); + } + if (((mutable_bitField0_ & 0x00000040) == 0x00000040)) { + newMembers_ = new com.google.protobuf.UnmodifiableLazyStringList(newMembers_); + } + if (((mutable_bitField0_ & 0x00000080) == 0x00000080)) { + removedMembers_ = new com.google.protobuf.UnmodifiableLazyStringList(removedMembers_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_GroupContext_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_GroupContext_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.class, org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public GroupContext parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new GroupContext(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + /** + * Protobuf enum {@code signalservice.GroupContext.Type} + */ + public enum Type + implements com.google.protobuf.ProtocolMessageEnum { + /** + * UNKNOWN = 0; + */ + UNKNOWN(0, 0), + /** + * UPDATE = 1; + */ + UPDATE(1, 1), + /** + * DELIVER = 2; + */ + DELIVER(2, 2), + /** + * QUIT = 3; + */ + QUIT(3, 3), + /** + * REQUEST_INFO = 4; + */ + REQUEST_INFO(4, 4), + ; + + /** + * UNKNOWN = 0; + */ + public static final int UNKNOWN_VALUE = 0; + /** + * UPDATE = 1; + */ + public static final int UPDATE_VALUE = 1; + /** + * DELIVER = 2; + */ + public static final int DELIVER_VALUE = 2; + /** + * QUIT = 3; + */ + public static final int QUIT_VALUE = 3; + /** + * REQUEST_INFO = 4; + */ + public static final int REQUEST_INFO_VALUE = 4; + + + public final int getNumber() { return value; } + + public static Type valueOf(int value) { + switch (value) { + case 0: return UNKNOWN; + case 1: return UPDATE; + case 2: return DELIVER; + case 3: return QUIT; + case 4: return REQUEST_INFO; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static com.google.protobuf.Internal.EnumLiteMap + internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Type findValueByNumber(int number) { + return Type.valueOf(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(index); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.getDescriptor().getEnumTypes().get(0); + } + + private static final Type[] VALUES = values(); + + public static Type valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int index; + private final int value; + + private Type(int index, int value) { + this.index = index; + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:signalservice.GroupContext.Type) + } + + private int bitField0_; + // optional bytes id = 1; + public static final int ID_FIELD_NUMBER = 1; + private com.google.protobuf.ByteString id_; + /** + * optional bytes id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes id = 1; + */ + public com.google.protobuf.ByteString getId() { + return id_; + } + + // optional .signalservice.GroupContext.Type type = 2; + public static final int TYPE_FIELD_NUMBER = 2; + private org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.Type type_; + /** + * optional .signalservice.GroupContext.Type type = 2; + */ + public boolean hasType() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .signalservice.GroupContext.Type type = 2; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.Type getType() { + return type_; + } + + // optional string name = 3; + public static final int NAME_FIELD_NUMBER = 3; + private Object name_; + /** + * optional string name = 3; + */ + public boolean hasName() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional string name = 3; + */ + public String getName() { + Object ref = name_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } + } + /** + * optional string name = 3; + */ + public com.google.protobuf.ByteString + getNameBytes() { + Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // repeated string members = 4; + public static final int MEMBERS_FIELD_NUMBER = 4; + private com.google.protobuf.LazyStringList members_; + /** + * repeated string members = 4; + */ + public java.util.List + getMembersList() { + return members_; + } + /** + * repeated string members = 4; + */ + public int getMembersCount() { + return members_.size(); + } + /** + * repeated string members = 4; + */ + public String getMembers(int index) { + return members_.get(index); + } + /** + * repeated string members = 4; + */ + public com.google.protobuf.ByteString + getMembersBytes(int index) { + return members_.getByteString(index); + } + + // optional .signalservice.AttachmentPointer avatar = 5; + public static final int AVATAR_FIELD_NUMBER = 5; + private org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer avatar_; + /** + * optional .signalservice.AttachmentPointer avatar = 5; + */ + public boolean hasAvatar() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional .signalservice.AttachmentPointer avatar = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer getAvatar() { + return avatar_; + } + /** + * optional .signalservice.AttachmentPointer avatar = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder getAvatarOrBuilder() { + return avatar_; + } + + // repeated string admins = 6; + public static final int ADMINS_FIELD_NUMBER = 6; + private com.google.protobuf.LazyStringList admins_; + /** + * repeated string admins = 6; + */ + public java.util.List + getAdminsList() { + return admins_; + } + /** + * repeated string admins = 6; + */ + public int getAdminsCount() { + return admins_.size(); + } + /** + * repeated string admins = 6; + */ + public String getAdmins(int index) { + return admins_.get(index); + } + /** + * repeated string admins = 6; + */ + public com.google.protobuf.ByteString + getAdminsBytes(int index) { + return admins_.getByteString(index); + } + + // repeated string newMembers = 998; + public static final int NEWMEMBERS_FIELD_NUMBER = 998; + private com.google.protobuf.LazyStringList newMembers_; + /** + * repeated string newMembers = 998; + * + *
+     * Loki - These fields are only used internally for the Android code base.
+     * This is so that we can differentiate adding/kicking.
+     * DO NOT USE WHEN SENDING MESSAGES.
+     * 
+ */ + public java.util.List + getNewMembersList() { + return newMembers_; + } + /** + * repeated string newMembers = 998; + * + *
+     * Loki - These fields are only used internally for the Android code base.
+     * This is so that we can differentiate adding/kicking.
+     * DO NOT USE WHEN SENDING MESSAGES.
+     * 
+ */ + public int getNewMembersCount() { + return newMembers_.size(); + } + /** + * repeated string newMembers = 998; + * + *
+     * Loki - These fields are only used internally for the Android code base.
+     * This is so that we can differentiate adding/kicking.
+     * DO NOT USE WHEN SENDING MESSAGES.
+     * 
+ */ + public String getNewMembers(int index) { + return newMembers_.get(index); + } + /** + * repeated string newMembers = 998; + * + *
+     * Loki - These fields are only used internally for the Android code base.
+     * This is so that we can differentiate adding/kicking.
+     * DO NOT USE WHEN SENDING MESSAGES.
+     * 
+ */ + public com.google.protobuf.ByteString + getNewMembersBytes(int index) { + return newMembers_.getByteString(index); + } + + // repeated string removedMembers = 999; + public static final int REMOVEDMEMBERS_FIELD_NUMBER = 999; + private com.google.protobuf.LazyStringList removedMembers_; + /** + * repeated string removedMembers = 999; + */ + public java.util.List + getRemovedMembersList() { + return removedMembers_; + } + /** + * repeated string removedMembers = 999; + */ + public int getRemovedMembersCount() { + return removedMembers_.size(); + } + /** + * repeated string removedMembers = 999; + */ + public String getRemovedMembers(int index) { + return removedMembers_.get(index); + } + /** + * repeated string removedMembers = 999; + */ + public com.google.protobuf.ByteString + getRemovedMembersBytes(int index) { + return removedMembers_.getByteString(index); + } + + private void initFields() { + id_ = com.google.protobuf.ByteString.EMPTY; + type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.Type.UNKNOWN; + name_ = ""; + members_ = com.google.protobuf.LazyStringArrayList.EMPTY; + avatar_ = org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance(); + admins_ = com.google.protobuf.LazyStringArrayList.EMPTY; + newMembers_ = com.google.protobuf.LazyStringArrayList.EMPTY; + removedMembers_ = com.google.protobuf.LazyStringArrayList.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeEnum(2, type_.getNumber()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(3, getNameBytes()); + } + for (int i = 0; i < members_.size(); i++) { + output.writeBytes(4, members_.getByteString(i)); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeMessage(5, avatar_); + } + for (int i = 0; i < admins_.size(); i++) { + output.writeBytes(6, admins_.getByteString(i)); + } + for (int i = 0; i < newMembers_.size(); i++) { + output.writeBytes(998, newMembers_.getByteString(i)); + } + for (int i = 0; i < removedMembers_.size(); i++) { + output.writeBytes(999, removedMembers_.getByteString(i)); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(2, type_.getNumber()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, getNameBytes()); + } + { + int dataSize = 0; + for (int i = 0; i < members_.size(); i++) { + dataSize += com.google.protobuf.CodedOutputStream + .computeBytesSizeNoTag(members_.getByteString(i)); + } + size += dataSize; + size += 1 * getMembersList().size(); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(5, avatar_); + } + { + int dataSize = 0; + for (int i = 0; i < admins_.size(); i++) { + dataSize += com.google.protobuf.CodedOutputStream + .computeBytesSizeNoTag(admins_.getByteString(i)); + } + size += dataSize; + size += 1 * getAdminsList().size(); + } + { + int dataSize = 0; + for (int i = 0; i < newMembers_.size(); i++) { + dataSize += com.google.protobuf.CodedOutputStream + .computeBytesSizeNoTag(newMembers_.getByteString(i)); + } + size += dataSize; + size += 2 * getNewMembersList().size(); + } + { + int dataSize = 0; + for (int i = 0; i < removedMembers_.size(); i++) { + dataSize += com.google.protobuf.CodedOutputStream + .computeBytesSizeNoTag(removedMembers_.getByteString(i)); + } + size += dataSize; + size += 2 * getRemovedMembersList().size(); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.GroupContext} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContextOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_GroupContext_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_GroupContext_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.class, org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getAvatarFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + id_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.Type.UNKNOWN; + bitField0_ = (bitField0_ & ~0x00000002); + name_ = ""; + bitField0_ = (bitField0_ & ~0x00000004); + members_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000008); + if (avatarBuilder_ == null) { + avatar_ = org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance(); + } else { + avatarBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000010); + admins_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000020); + newMembers_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000040); + removedMembers_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000080); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_GroupContext_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext result = new org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.id_ = id_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.type_ = type_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.name_ = name_; + if (((bitField0_ & 0x00000008) == 0x00000008)) { + members_ = new com.google.protobuf.UnmodifiableLazyStringList( + members_); + bitField0_ = (bitField0_ & ~0x00000008); + } + result.members_ = members_; + if (((from_bitField0_ & 0x00000010) == 0x00000010)) { + to_bitField0_ |= 0x00000008; + } + if (avatarBuilder_ == null) { + result.avatar_ = avatar_; + } else { + result.avatar_ = avatarBuilder_.build(); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + admins_ = new com.google.protobuf.UnmodifiableLazyStringList( + admins_); + bitField0_ = (bitField0_ & ~0x00000020); + } + result.admins_ = admins_; + if (((bitField0_ & 0x00000040) == 0x00000040)) { + newMembers_ = new com.google.protobuf.UnmodifiableLazyStringList( + newMembers_); + bitField0_ = (bitField0_ & ~0x00000040); + } + result.newMembers_ = newMembers_; + if (((bitField0_ & 0x00000080) == 0x00000080)) { + removedMembers_ = new com.google.protobuf.UnmodifiableLazyStringList( + removedMembers_); + bitField0_ = (bitField0_ & ~0x00000080); + } + result.removedMembers_ = removedMembers_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.getDefaultInstance()) return this; + if (other.hasId()) { + setId(other.getId()); + } + if (other.hasType()) { + setType(other.getType()); + } + if (other.hasName()) { + bitField0_ |= 0x00000004; + name_ = other.name_; + onChanged(); + } + if (!other.members_.isEmpty()) { + if (members_.isEmpty()) { + members_ = other.members_; + bitField0_ = (bitField0_ & ~0x00000008); + } else { + ensureMembersIsMutable(); + members_.addAll(other.members_); + } + onChanged(); + } + if (other.hasAvatar()) { + mergeAvatar(other.getAvatar()); + } + if (!other.admins_.isEmpty()) { + if (admins_.isEmpty()) { + admins_ = other.admins_; + bitField0_ = (bitField0_ & ~0x00000020); + } else { + ensureAdminsIsMutable(); + admins_.addAll(other.admins_); + } + onChanged(); + } + if (!other.newMembers_.isEmpty()) { + if (newMembers_.isEmpty()) { + newMembers_ = other.newMembers_; + bitField0_ = (bitField0_ & ~0x00000040); + } else { + ensureNewMembersIsMutable(); + newMembers_.addAll(other.newMembers_); + } + onChanged(); + } + if (!other.removedMembers_.isEmpty()) { + if (removedMembers_.isEmpty()) { + removedMembers_ = other.removedMembers_; + bitField0_ = (bitField0_ & ~0x00000080); + } else { + ensureRemovedMembersIsMutable(); + removedMembers_.addAll(other.removedMembers_); + } + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional bytes id = 1; + private com.google.protobuf.ByteString id_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes id = 1; + */ + public com.google.protobuf.ByteString getId() { + return id_; + } + /** + * optional bytes id = 1; + */ + public Builder setId(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + id_ = value; + onChanged(); + return this; + } + /** + * optional bytes id = 1; + */ + public Builder clearId() { + bitField0_ = (bitField0_ & ~0x00000001); + id_ = getDefaultInstance().getId(); + onChanged(); + return this; + } + + // optional .signalservice.GroupContext.Type type = 2; + private org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.Type type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.Type.UNKNOWN; + /** + * optional .signalservice.GroupContext.Type type = 2; + */ + public boolean hasType() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .signalservice.GroupContext.Type type = 2; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.Type getType() { + return type_; + } + /** + * optional .signalservice.GroupContext.Type type = 2; + */ + public Builder setType(org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.Type value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + type_ = value; + onChanged(); + return this; + } + /** + * optional .signalservice.GroupContext.Type type = 2; + */ + public Builder clearType() { + bitField0_ = (bitField0_ & ~0x00000002); + type_ = org.session.libsignal.service.internal.push.SignalServiceProtos.GroupContext.Type.UNKNOWN; + onChanged(); + return this; + } + + // optional string name = 3; + private Object name_ = ""; + /** + * optional string name = 3; + */ + public boolean hasName() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional string name = 3; + */ + public String getName() { + Object ref = name_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + name_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string name = 3; + */ + public com.google.protobuf.ByteString + getNameBytes() { + Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string name = 3; + */ + public Builder setName( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + name_ = value; + onChanged(); + return this; + } + /** + * optional string name = 3; + */ + public Builder clearName() { + bitField0_ = (bitField0_ & ~0x00000004); + name_ = getDefaultInstance().getName(); + onChanged(); + return this; + } + /** + * optional string name = 3; + */ + public Builder setNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + name_ = value; + onChanged(); + return this; + } + + // repeated string members = 4; + private com.google.protobuf.LazyStringList members_ = com.google.protobuf.LazyStringArrayList.EMPTY; + private void ensureMembersIsMutable() { + if (!((bitField0_ & 0x00000008) == 0x00000008)) { + members_ = new com.google.protobuf.LazyStringArrayList(members_); + bitField0_ |= 0x00000008; + } + } + /** + * repeated string members = 4; + */ + public java.util.List + getMembersList() { + return java.util.Collections.unmodifiableList(members_); + } + /** + * repeated string members = 4; + */ + public int getMembersCount() { + return members_.size(); + } + /** + * repeated string members = 4; + */ + public String getMembers(int index) { + return members_.get(index); + } + /** + * repeated string members = 4; + */ + public com.google.protobuf.ByteString + getMembersBytes(int index) { + return members_.getByteString(index); + } + /** + * repeated string members = 4; + */ + public Builder setMembers( + int index, String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureMembersIsMutable(); + members_.set(index, value); + onChanged(); + return this; + } + /** + * repeated string members = 4; + */ + public Builder addMembers( + String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureMembersIsMutable(); + members_.add(value); + onChanged(); + return this; + } + /** + * repeated string members = 4; + */ + public Builder addAllMembers( + Iterable values) { + ensureMembersIsMutable(); + super.addAll(values, members_); + onChanged(); + return this; + } + /** + * repeated string members = 4; + */ + public Builder clearMembers() { + members_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000008); + onChanged(); + return this; + } + /** + * repeated string members = 4; + */ + public Builder addMembersBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + ensureMembersIsMutable(); + members_.add(value); + onChanged(); + return this; + } + + // optional .signalservice.AttachmentPointer avatar = 5; + private org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer avatar_ = org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder> avatarBuilder_; + /** + * optional .signalservice.AttachmentPointer avatar = 5; + */ + public boolean hasAvatar() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional .signalservice.AttachmentPointer avatar = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer getAvatar() { + if (avatarBuilder_ == null) { + return avatar_; + } else { + return avatarBuilder_.getMessage(); + } + } + /** + * optional .signalservice.AttachmentPointer avatar = 5; + */ + public Builder setAvatar(org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer value) { + if (avatarBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + avatar_ = value; + onChanged(); + } else { + avatarBuilder_.setMessage(value); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * optional .signalservice.AttachmentPointer avatar = 5; + */ + public Builder setAvatar( + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder builderForValue) { + if (avatarBuilder_ == null) { + avatar_ = builderForValue.build(); + onChanged(); + } else { + avatarBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * optional .signalservice.AttachmentPointer avatar = 5; + */ + public Builder mergeAvatar(org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer value) { + if (avatarBuilder_ == null) { + if (((bitField0_ & 0x00000010) == 0x00000010) && + avatar_ != org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance()) { + avatar_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.newBuilder(avatar_).mergeFrom(value).buildPartial(); + } else { + avatar_ = value; + } + onChanged(); + } else { + avatarBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * optional .signalservice.AttachmentPointer avatar = 5; + */ + public Builder clearAvatar() { + if (avatarBuilder_ == null) { + avatar_ = org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.getDefaultInstance(); + onChanged(); + } else { + avatarBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000010); + return this; + } + /** + * optional .signalservice.AttachmentPointer avatar = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder getAvatarBuilder() { + bitField0_ |= 0x00000010; + onChanged(); + return getAvatarFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.AttachmentPointer avatar = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder getAvatarOrBuilder() { + if (avatarBuilder_ != null) { + return avatarBuilder_.getMessageOrBuilder(); + } else { + return avatar_; + } + } + /** + * optional .signalservice.AttachmentPointer avatar = 5; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder> + getAvatarFieldBuilder() { + if (avatarBuilder_ == null) { + avatarBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointer.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.AttachmentPointerOrBuilder>( + avatar_, + getParentForChildren(), + isClean()); + avatar_ = null; + } + return avatarBuilder_; + } + + // repeated string admins = 6; + private com.google.protobuf.LazyStringList admins_ = com.google.protobuf.LazyStringArrayList.EMPTY; + private void ensureAdminsIsMutable() { + if (!((bitField0_ & 0x00000020) == 0x00000020)) { + admins_ = new com.google.protobuf.LazyStringArrayList(admins_); + bitField0_ |= 0x00000020; + } + } + /** + * repeated string admins = 6; + */ + public java.util.List + getAdminsList() { + return java.util.Collections.unmodifiableList(admins_); + } + /** + * repeated string admins = 6; + */ + public int getAdminsCount() { + return admins_.size(); + } + /** + * repeated string admins = 6; + */ + public String getAdmins(int index) { + return admins_.get(index); + } + /** + * repeated string admins = 6; + */ + public com.google.protobuf.ByteString + getAdminsBytes(int index) { + return admins_.getByteString(index); + } + /** + * repeated string admins = 6; + */ + public Builder setAdmins( + int index, String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureAdminsIsMutable(); + admins_.set(index, value); + onChanged(); + return this; + } + /** + * repeated string admins = 6; + */ + public Builder addAdmins( + String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureAdminsIsMutable(); + admins_.add(value); + onChanged(); + return this; + } + /** + * repeated string admins = 6; + */ + public Builder addAllAdmins( + Iterable values) { + ensureAdminsIsMutable(); + super.addAll(values, admins_); + onChanged(); + return this; + } + /** + * repeated string admins = 6; + */ + public Builder clearAdmins() { + admins_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000020); + onChanged(); + return this; + } + /** + * repeated string admins = 6; + */ + public Builder addAdminsBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + ensureAdminsIsMutable(); + admins_.add(value); + onChanged(); + return this; + } + + // repeated string newMembers = 998; + private com.google.protobuf.LazyStringList newMembers_ = com.google.protobuf.LazyStringArrayList.EMPTY; + private void ensureNewMembersIsMutable() { + if (!((bitField0_ & 0x00000040) == 0x00000040)) { + newMembers_ = new com.google.protobuf.LazyStringArrayList(newMembers_); + bitField0_ |= 0x00000040; + } + } + /** + * repeated string newMembers = 998; + * + *
+       * Loki - These fields are only used internally for the Android code base.
+       * This is so that we can differentiate adding/kicking.
+       * DO NOT USE WHEN SENDING MESSAGES.
+       * 
+ */ + public java.util.List + getNewMembersList() { + return java.util.Collections.unmodifiableList(newMembers_); + } + /** + * repeated string newMembers = 998; + * + *
+       * Loki - These fields are only used internally for the Android code base.
+       * This is so that we can differentiate adding/kicking.
+       * DO NOT USE WHEN SENDING MESSAGES.
+       * 
+ */ + public int getNewMembersCount() { + return newMembers_.size(); + } + /** + * repeated string newMembers = 998; + * + *
+       * Loki - These fields are only used internally for the Android code base.
+       * This is so that we can differentiate adding/kicking.
+       * DO NOT USE WHEN SENDING MESSAGES.
+       * 
+ */ + public String getNewMembers(int index) { + return newMembers_.get(index); + } + /** + * repeated string newMembers = 998; + * + *
+       * Loki - These fields are only used internally for the Android code base.
+       * This is so that we can differentiate adding/kicking.
+       * DO NOT USE WHEN SENDING MESSAGES.
+       * 
+ */ + public com.google.protobuf.ByteString + getNewMembersBytes(int index) { + return newMembers_.getByteString(index); + } + /** + * repeated string newMembers = 998; + * + *
+       * Loki - These fields are only used internally for the Android code base.
+       * This is so that we can differentiate adding/kicking.
+       * DO NOT USE WHEN SENDING MESSAGES.
+       * 
+ */ + public Builder setNewMembers( + int index, String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureNewMembersIsMutable(); + newMembers_.set(index, value); + onChanged(); + return this; + } + /** + * repeated string newMembers = 998; + * + *
+       * Loki - These fields are only used internally for the Android code base.
+       * This is so that we can differentiate adding/kicking.
+       * DO NOT USE WHEN SENDING MESSAGES.
+       * 
+ */ + public Builder addNewMembers( + String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureNewMembersIsMutable(); + newMembers_.add(value); + onChanged(); + return this; + } + /** + * repeated string newMembers = 998; + * + *
+       * Loki - These fields are only used internally for the Android code base.
+       * This is so that we can differentiate adding/kicking.
+       * DO NOT USE WHEN SENDING MESSAGES.
+       * 
+ */ + public Builder addAllNewMembers( + Iterable values) { + ensureNewMembersIsMutable(); + super.addAll(values, newMembers_); + onChanged(); + return this; + } + /** + * repeated string newMembers = 998; + * + *
+       * Loki - These fields are only used internally for the Android code base.
+       * This is so that we can differentiate adding/kicking.
+       * DO NOT USE WHEN SENDING MESSAGES.
+       * 
+ */ + public Builder clearNewMembers() { + newMembers_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000040); + onChanged(); + return this; + } + /** + * repeated string newMembers = 998; + * + *
+       * Loki - These fields are only used internally for the Android code base.
+       * This is so that we can differentiate adding/kicking.
+       * DO NOT USE WHEN SENDING MESSAGES.
+       * 
+ */ + public Builder addNewMembersBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + ensureNewMembersIsMutable(); + newMembers_.add(value); + onChanged(); + return this; + } + + // repeated string removedMembers = 999; + private com.google.protobuf.LazyStringList removedMembers_ = com.google.protobuf.LazyStringArrayList.EMPTY; + private void ensureRemovedMembersIsMutable() { + if (!((bitField0_ & 0x00000080) == 0x00000080)) { + removedMembers_ = new com.google.protobuf.LazyStringArrayList(removedMembers_); + bitField0_ |= 0x00000080; + } + } + /** + * repeated string removedMembers = 999; + */ + public java.util.List + getRemovedMembersList() { + return java.util.Collections.unmodifiableList(removedMembers_); + } + /** + * repeated string removedMembers = 999; + */ + public int getRemovedMembersCount() { + return removedMembers_.size(); + } + /** + * repeated string removedMembers = 999; + */ + public String getRemovedMembers(int index) { + return removedMembers_.get(index); + } + /** + * repeated string removedMembers = 999; + */ + public com.google.protobuf.ByteString + getRemovedMembersBytes(int index) { + return removedMembers_.getByteString(index); + } + /** + * repeated string removedMembers = 999; + */ + public Builder setRemovedMembers( + int index, String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureRemovedMembersIsMutable(); + removedMembers_.set(index, value); + onChanged(); + return this; + } + /** + * repeated string removedMembers = 999; + */ + public Builder addRemovedMembers( + String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureRemovedMembersIsMutable(); + removedMembers_.add(value); + onChanged(); + return this; + } + /** + * repeated string removedMembers = 999; + */ + public Builder addAllRemovedMembers( + Iterable values) { + ensureRemovedMembersIsMutable(); + super.addAll(values, removedMembers_); + onChanged(); + return this; + } + /** + * repeated string removedMembers = 999; + */ + public Builder clearRemovedMembers() { + removedMembers_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000080); + onChanged(); + return this; + } + /** + * repeated string removedMembers = 999; + */ + public Builder addRemovedMembersBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + ensureRemovedMembersIsMutable(); + removedMembers_.add(value); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.GroupContext) + } + + static { + defaultInstance = new GroupContext(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.GroupContext) + } + + public interface ContactDetailsOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional string number = 1; + /** + * optional string number = 1; + */ + boolean hasNumber(); + /** + * optional string number = 1; + */ + String getNumber(); + /** + * optional string number = 1; + */ + com.google.protobuf.ByteString + getNumberBytes(); + + // optional string name = 2; + /** + * optional string name = 2; + */ + boolean hasName(); + /** + * optional string name = 2; + */ + String getName(); + /** + * optional string name = 2; + */ + com.google.protobuf.ByteString + getNameBytes(); + + // optional .signalservice.ContactDetails.Avatar avatar = 3; + /** + * optional .signalservice.ContactDetails.Avatar avatar = 3; + */ + boolean hasAvatar(); + /** + * optional .signalservice.ContactDetails.Avatar avatar = 3; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar getAvatar(); + /** + * optional .signalservice.ContactDetails.Avatar avatar = 3; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.AvatarOrBuilder getAvatarOrBuilder(); + + // optional string color = 4; + /** + * optional string color = 4; + */ + boolean hasColor(); + /** + * optional string color = 4; + */ + String getColor(); + /** + * optional string color = 4; + */ + com.google.protobuf.ByteString + getColorBytes(); + + // optional .signalservice.Verified verified = 5; + /** + * optional .signalservice.Verified verified = 5; + */ + boolean hasVerified(); + /** + * optional .signalservice.Verified verified = 5; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.Verified getVerified(); + /** + * optional .signalservice.Verified verified = 5; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.VerifiedOrBuilder getVerifiedOrBuilder(); + + // optional bytes profileKey = 6; + /** + * optional bytes profileKey = 6; + */ + boolean hasProfileKey(); + /** + * optional bytes profileKey = 6; + */ + com.google.protobuf.ByteString getProfileKey(); + + // optional bool blocked = 7; + /** + * optional bool blocked = 7; + */ + boolean hasBlocked(); + /** + * optional bool blocked = 7; + */ + boolean getBlocked(); + + // optional uint32 expireTimer = 8; + /** + * optional uint32 expireTimer = 8; + */ + boolean hasExpireTimer(); + /** + * optional uint32 expireTimer = 8; + */ + int getExpireTimer(); + + // optional string nickname = 101; + /** + * optional string nickname = 101; + * + *
+     * Loki
+     * 
+ */ + boolean hasNickname(); + /** + * optional string nickname = 101; + * + *
+     * Loki
+     * 
+ */ + String getNickname(); + /** + * optional string nickname = 101; + * + *
+     * Loki
+     * 
+ */ + com.google.protobuf.ByteString + getNicknameBytes(); + } + /** + * Protobuf type {@code signalservice.ContactDetails} + */ + public static final class ContactDetails extends + com.google.protobuf.GeneratedMessage + implements ContactDetailsOrBuilder { + // Use ContactDetails.newBuilder() to construct. + private ContactDetails(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private ContactDetails(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final ContactDetails defaultInstance; + public static ContactDetails getDefaultInstance() { + return defaultInstance; + } + + public ContactDetails getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private ContactDetails( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + number_ = input.readBytes(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + name_ = input.readBytes(); + break; + } + case 26: { + org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar.Builder subBuilder = null; + if (((bitField0_ & 0x00000004) == 0x00000004)) { + subBuilder = avatar_.toBuilder(); + } + avatar_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(avatar_); + avatar_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000004; + break; + } + case 34: { + bitField0_ |= 0x00000008; + color_ = input.readBytes(); + break; + } + case 42: { + org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.Builder subBuilder = null; + if (((bitField0_ & 0x00000010) == 0x00000010)) { + subBuilder = verified_.toBuilder(); + } + verified_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(verified_); + verified_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000010; + break; + } + case 50: { + bitField0_ |= 0x00000020; + profileKey_ = input.readBytes(); + break; + } + case 56: { + bitField0_ |= 0x00000040; + blocked_ = input.readBool(); + break; + } + case 64: { + bitField0_ |= 0x00000080; + expireTimer_ = input.readUInt32(); + break; + } + case 810: { + bitField0_ |= 0x00000100; + nickname_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ContactDetails_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ContactDetails_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.class, org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public ContactDetails parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new ContactDetails(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public interface AvatarOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional string contentType = 1; + /** + * optional string contentType = 1; + */ + boolean hasContentType(); + /** + * optional string contentType = 1; + */ + String getContentType(); + /** + * optional string contentType = 1; + */ + com.google.protobuf.ByteString + getContentTypeBytes(); + + // optional uint32 length = 2; + /** + * optional uint32 length = 2; + */ + boolean hasLength(); + /** + * optional uint32 length = 2; + */ + int getLength(); + } + /** + * Protobuf type {@code signalservice.ContactDetails.Avatar} + */ + public static final class Avatar extends + com.google.protobuf.GeneratedMessage + implements AvatarOrBuilder { + // Use Avatar.newBuilder() to construct. + private Avatar(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Avatar(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Avatar defaultInstance; + public static Avatar getDefaultInstance() { + return defaultInstance; + } + + public Avatar getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Avatar( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + contentType_ = input.readBytes(); + break; + } + case 16: { + bitField0_ |= 0x00000002; + length_ = input.readUInt32(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ContactDetails_Avatar_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ContactDetails_Avatar_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar.class, org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Avatar parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Avatar(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional string contentType = 1; + public static final int CONTENTTYPE_FIELD_NUMBER = 1; + private Object contentType_; + /** + * optional string contentType = 1; + */ + public boolean hasContentType() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string contentType = 1; + */ + public String getContentType() { + Object ref = contentType_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + contentType_ = s; + } + return s; + } + } + /** + * optional string contentType = 1; + */ + public com.google.protobuf.ByteString + getContentTypeBytes() { + Object ref = contentType_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + contentType_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional uint32 length = 2; + public static final int LENGTH_FIELD_NUMBER = 2; + private int length_; + /** + * optional uint32 length = 2; + */ + public boolean hasLength() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional uint32 length = 2; + */ + public int getLength() { + return length_; + } + + private void initFields() { + contentType_ = ""; + length_ = 0; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getContentTypeBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeUInt32(2, length_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getContentTypeBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(2, length_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.ContactDetails.Avatar} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.AvatarOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ContactDetails_Avatar_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ContactDetails_Avatar_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar.class, org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + contentType_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + length_ = 0; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ContactDetails_Avatar_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar result = new org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.contentType_ = contentType_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.length_ = length_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar.getDefaultInstance()) return this; + if (other.hasContentType()) { + bitField0_ |= 0x00000001; + contentType_ = other.contentType_; + onChanged(); + } + if (other.hasLength()) { + setLength(other.getLength()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional string contentType = 1; + private Object contentType_ = ""; + /** + * optional string contentType = 1; + */ + public boolean hasContentType() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string contentType = 1; + */ + public String getContentType() { + Object ref = contentType_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + contentType_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string contentType = 1; + */ + public com.google.protobuf.ByteString + getContentTypeBytes() { + Object ref = contentType_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + contentType_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string contentType = 1; + */ + public Builder setContentType( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + contentType_ = value; + onChanged(); + return this; + } + /** + * optional string contentType = 1; + */ + public Builder clearContentType() { + bitField0_ = (bitField0_ & ~0x00000001); + contentType_ = getDefaultInstance().getContentType(); + onChanged(); + return this; + } + /** + * optional string contentType = 1; + */ + public Builder setContentTypeBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + contentType_ = value; + onChanged(); + return this; + } + + // optional uint32 length = 2; + private int length_ ; + /** + * optional uint32 length = 2; + */ + public boolean hasLength() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional uint32 length = 2; + */ + public int getLength() { + return length_; + } + /** + * optional uint32 length = 2; + */ + public Builder setLength(int value) { + bitField0_ |= 0x00000002; + length_ = value; + onChanged(); + return this; + } + /** + * optional uint32 length = 2; + */ + public Builder clearLength() { + bitField0_ = (bitField0_ & ~0x00000002); + length_ = 0; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.ContactDetails.Avatar) + } + + static { + defaultInstance = new Avatar(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.ContactDetails.Avatar) + } + + private int bitField0_; + // optional string number = 1; + public static final int NUMBER_FIELD_NUMBER = 1; + private Object number_; + /** + * optional string number = 1; + */ + public boolean hasNumber() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string number = 1; + */ + public String getNumber() { + Object ref = number_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + number_ = s; + } + return s; + } + } + /** + * optional string number = 1; + */ + public com.google.protobuf.ByteString + getNumberBytes() { + Object ref = number_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + number_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional string name = 2; + public static final int NAME_FIELD_NUMBER = 2; + private Object name_; + /** + * optional string name = 2; + */ + public boolean hasName() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string name = 2; + */ + public String getName() { + Object ref = name_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } + } + /** + * optional string name = 2; + */ + public com.google.protobuf.ByteString + getNameBytes() { + Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional .signalservice.ContactDetails.Avatar avatar = 3; + public static final int AVATAR_FIELD_NUMBER = 3; + private org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar avatar_; + /** + * optional .signalservice.ContactDetails.Avatar avatar = 3; + */ + public boolean hasAvatar() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .signalservice.ContactDetails.Avatar avatar = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar getAvatar() { + return avatar_; + } + /** + * optional .signalservice.ContactDetails.Avatar avatar = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.AvatarOrBuilder getAvatarOrBuilder() { + return avatar_; + } + + // optional string color = 4; + public static final int COLOR_FIELD_NUMBER = 4; + private Object color_; + /** + * optional string color = 4; + */ + public boolean hasColor() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional string color = 4; + */ + public String getColor() { + Object ref = color_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + color_ = s; + } + return s; + } + } + /** + * optional string color = 4; + */ + public com.google.protobuf.ByteString + getColorBytes() { + Object ref = color_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + color_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional .signalservice.Verified verified = 5; + public static final int VERIFIED_FIELD_NUMBER = 5; + private org.session.libsignal.service.internal.push.SignalServiceProtos.Verified verified_; + /** + * optional .signalservice.Verified verified = 5; + */ + public boolean hasVerified() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional .signalservice.Verified verified = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.Verified getVerified() { + return verified_; + } + /** + * optional .signalservice.Verified verified = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.VerifiedOrBuilder getVerifiedOrBuilder() { + return verified_; + } + + // optional bytes profileKey = 6; + public static final int PROFILEKEY_FIELD_NUMBER = 6; + private com.google.protobuf.ByteString profileKey_; + /** + * optional bytes profileKey = 6; + */ + public boolean hasProfileKey() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional bytes profileKey = 6; + */ + public com.google.protobuf.ByteString getProfileKey() { + return profileKey_; + } + + // optional bool blocked = 7; + public static final int BLOCKED_FIELD_NUMBER = 7; + private boolean blocked_; + /** + * optional bool blocked = 7; + */ + public boolean hasBlocked() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * optional bool blocked = 7; + */ + public boolean getBlocked() { + return blocked_; + } + + // optional uint32 expireTimer = 8; + public static final int EXPIRETIMER_FIELD_NUMBER = 8; + private int expireTimer_; + /** + * optional uint32 expireTimer = 8; + */ + public boolean hasExpireTimer() { + return ((bitField0_ & 0x00000080) == 0x00000080); + } + /** + * optional uint32 expireTimer = 8; + */ + public int getExpireTimer() { + return expireTimer_; + } + + // optional string nickname = 101; + public static final int NICKNAME_FIELD_NUMBER = 101; + private Object nickname_; + /** + * optional string nickname = 101; + * + *
+     * Loki
+     * 
+ */ + public boolean hasNickname() { + return ((bitField0_ & 0x00000100) == 0x00000100); + } + /** + * optional string nickname = 101; + * + *
+     * Loki
+     * 
+ */ + public String getNickname() { + Object ref = nickname_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + nickname_ = s; + } + return s; + } + } + /** + * optional string nickname = 101; + * + *
+     * Loki
+     * 
+ */ + public com.google.protobuf.ByteString + getNicknameBytes() { + Object ref = nickname_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + nickname_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private void initFields() { + number_ = ""; + name_ = ""; + avatar_ = org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar.getDefaultInstance(); + color_ = ""; + verified_ = org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.getDefaultInstance(); + profileKey_ = com.google.protobuf.ByteString.EMPTY; + blocked_ = false; + expireTimer_ = 0; + nickname_ = ""; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getNumberBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, getNameBytes()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeMessage(3, avatar_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeBytes(4, getColorBytes()); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + output.writeMessage(5, verified_); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + output.writeBytes(6, profileKey_); + } + if (((bitField0_ & 0x00000040) == 0x00000040)) { + output.writeBool(7, blocked_); + } + if (((bitField0_ & 0x00000080) == 0x00000080)) { + output.writeUInt32(8, expireTimer_); + } + if (((bitField0_ & 0x00000100) == 0x00000100)) { + output.writeBytes(101, getNicknameBytes()); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getNumberBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, getNameBytes()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, avatar_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(4, getColorBytes()); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(5, verified_); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(6, profileKey_); + } + if (((bitField0_ & 0x00000040) == 0x00000040)) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(7, blocked_); + } + if (((bitField0_ & 0x00000080) == 0x00000080)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(8, expireTimer_); + } + if (((bitField0_ & 0x00000100) == 0x00000100)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(101, getNicknameBytes()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.ContactDetails} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetailsOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ContactDetails_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ContactDetails_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.class, org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getAvatarFieldBuilder(); + getVerifiedFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + number_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + name_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + if (avatarBuilder_ == null) { + avatar_ = org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar.getDefaultInstance(); + } else { + avatarBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + color_ = ""; + bitField0_ = (bitField0_ & ~0x00000008); + if (verifiedBuilder_ == null) { + verified_ = org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.getDefaultInstance(); + } else { + verifiedBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000010); + profileKey_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000020); + blocked_ = false; + bitField0_ = (bitField0_ & ~0x00000040); + expireTimer_ = 0; + bitField0_ = (bitField0_ & ~0x00000080); + nickname_ = ""; + bitField0_ = (bitField0_ & ~0x00000100); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_ContactDetails_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails result = new org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.number_ = number_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.name_ = name_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + if (avatarBuilder_ == null) { + result.avatar_ = avatar_; + } else { + result.avatar_ = avatarBuilder_.build(); + } + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000008; + } + result.color_ = color_; + if (((from_bitField0_ & 0x00000010) == 0x00000010)) { + to_bitField0_ |= 0x00000010; + } + if (verifiedBuilder_ == null) { + result.verified_ = verified_; + } else { + result.verified_ = verifiedBuilder_.build(); + } + if (((from_bitField0_ & 0x00000020) == 0x00000020)) { + to_bitField0_ |= 0x00000020; + } + result.profileKey_ = profileKey_; + if (((from_bitField0_ & 0x00000040) == 0x00000040)) { + to_bitField0_ |= 0x00000040; + } + result.blocked_ = blocked_; + if (((from_bitField0_ & 0x00000080) == 0x00000080)) { + to_bitField0_ |= 0x00000080; + } + result.expireTimer_ = expireTimer_; + if (((from_bitField0_ & 0x00000100) == 0x00000100)) { + to_bitField0_ |= 0x00000100; + } + result.nickname_ = nickname_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.getDefaultInstance()) return this; + if (other.hasNumber()) { + bitField0_ |= 0x00000001; + number_ = other.number_; + onChanged(); + } + if (other.hasName()) { + bitField0_ |= 0x00000002; + name_ = other.name_; + onChanged(); + } + if (other.hasAvatar()) { + mergeAvatar(other.getAvatar()); + } + if (other.hasColor()) { + bitField0_ |= 0x00000008; + color_ = other.color_; + onChanged(); + } + if (other.hasVerified()) { + mergeVerified(other.getVerified()); + } + if (other.hasProfileKey()) { + setProfileKey(other.getProfileKey()); + } + if (other.hasBlocked()) { + setBlocked(other.getBlocked()); + } + if (other.hasExpireTimer()) { + setExpireTimer(other.getExpireTimer()); + } + if (other.hasNickname()) { + bitField0_ |= 0x00000100; + nickname_ = other.nickname_; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional string number = 1; + private Object number_ = ""; + /** + * optional string number = 1; + */ + public boolean hasNumber() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string number = 1; + */ + public String getNumber() { + Object ref = number_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + number_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string number = 1; + */ + public com.google.protobuf.ByteString + getNumberBytes() { + Object ref = number_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + number_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string number = 1; + */ + public Builder setNumber( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + number_ = value; + onChanged(); + return this; + } + /** + * optional string number = 1; + */ + public Builder clearNumber() { + bitField0_ = (bitField0_ & ~0x00000001); + number_ = getDefaultInstance().getNumber(); + onChanged(); + return this; + } + /** + * optional string number = 1; + */ + public Builder setNumberBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + number_ = value; + onChanged(); + return this; + } + + // optional string name = 2; + private Object name_ = ""; + /** + * optional string name = 2; + */ + public boolean hasName() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string name = 2; + */ + public String getName() { + Object ref = name_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + name_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string name = 2; + */ + public com.google.protobuf.ByteString + getNameBytes() { + Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string name = 2; + */ + public Builder setName( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + name_ = value; + onChanged(); + return this; + } + /** + * optional string name = 2; + */ + public Builder clearName() { + bitField0_ = (bitField0_ & ~0x00000002); + name_ = getDefaultInstance().getName(); + onChanged(); + return this; + } + /** + * optional string name = 2; + */ + public Builder setNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + name_ = value; + onChanged(); + return this; + } + + // optional .signalservice.ContactDetails.Avatar avatar = 3; + private org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar avatar_ = org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar, org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.AvatarOrBuilder> avatarBuilder_; + /** + * optional .signalservice.ContactDetails.Avatar avatar = 3; + */ + public boolean hasAvatar() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .signalservice.ContactDetails.Avatar avatar = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar getAvatar() { + if (avatarBuilder_ == null) { + return avatar_; + } else { + return avatarBuilder_.getMessage(); + } + } + /** + * optional .signalservice.ContactDetails.Avatar avatar = 3; + */ + public Builder setAvatar(org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar value) { + if (avatarBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + avatar_ = value; + onChanged(); + } else { + avatarBuilder_.setMessage(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .signalservice.ContactDetails.Avatar avatar = 3; + */ + public Builder setAvatar( + org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar.Builder builderForValue) { + if (avatarBuilder_ == null) { + avatar_ = builderForValue.build(); + onChanged(); + } else { + avatarBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .signalservice.ContactDetails.Avatar avatar = 3; + */ + public Builder mergeAvatar(org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar value) { + if (avatarBuilder_ == null) { + if (((bitField0_ & 0x00000004) == 0x00000004) && + avatar_ != org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar.getDefaultInstance()) { + avatar_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar.newBuilder(avatar_).mergeFrom(value).buildPartial(); + } else { + avatar_ = value; + } + onChanged(); + } else { + avatarBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .signalservice.ContactDetails.Avatar avatar = 3; + */ + public Builder clearAvatar() { + if (avatarBuilder_ == null) { + avatar_ = org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar.getDefaultInstance(); + onChanged(); + } else { + avatarBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + /** + * optional .signalservice.ContactDetails.Avatar avatar = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar.Builder getAvatarBuilder() { + bitField0_ |= 0x00000004; + onChanged(); + return getAvatarFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.ContactDetails.Avatar avatar = 3; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.AvatarOrBuilder getAvatarOrBuilder() { + if (avatarBuilder_ != null) { + return avatarBuilder_.getMessageOrBuilder(); + } else { + return avatar_; + } + } + /** + * optional .signalservice.ContactDetails.Avatar avatar = 3; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar, org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.AvatarOrBuilder> + getAvatarFieldBuilder() { + if (avatarBuilder_ == null) { + avatarBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar, org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.Avatar.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.ContactDetails.AvatarOrBuilder>( + avatar_, + getParentForChildren(), + isClean()); + avatar_ = null; + } + return avatarBuilder_; + } + + // optional string color = 4; + private Object color_ = ""; + /** + * optional string color = 4; + */ + public boolean hasColor() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional string color = 4; + */ + public String getColor() { + Object ref = color_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + color_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string color = 4; + */ + public com.google.protobuf.ByteString + getColorBytes() { + Object ref = color_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + color_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string color = 4; + */ + public Builder setColor( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + color_ = value; + onChanged(); + return this; + } + /** + * optional string color = 4; + */ + public Builder clearColor() { + bitField0_ = (bitField0_ & ~0x00000008); + color_ = getDefaultInstance().getColor(); + onChanged(); + return this; + } + /** + * optional string color = 4; + */ + public Builder setColorBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + color_ = value; + onChanged(); + return this; + } + + // optional .signalservice.Verified verified = 5; + private org.session.libsignal.service.internal.push.SignalServiceProtos.Verified verified_ = org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.Verified, org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.VerifiedOrBuilder> verifiedBuilder_; + /** + * optional .signalservice.Verified verified = 5; + */ + public boolean hasVerified() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional .signalservice.Verified verified = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.Verified getVerified() { + if (verifiedBuilder_ == null) { + return verified_; + } else { + return verifiedBuilder_.getMessage(); + } + } + /** + * optional .signalservice.Verified verified = 5; + */ + public Builder setVerified(org.session.libsignal.service.internal.push.SignalServiceProtos.Verified value) { + if (verifiedBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + verified_ = value; + onChanged(); + } else { + verifiedBuilder_.setMessage(value); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * optional .signalservice.Verified verified = 5; + */ + public Builder setVerified( + org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.Builder builderForValue) { + if (verifiedBuilder_ == null) { + verified_ = builderForValue.build(); + onChanged(); + } else { + verifiedBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * optional .signalservice.Verified verified = 5; + */ + public Builder mergeVerified(org.session.libsignal.service.internal.push.SignalServiceProtos.Verified value) { + if (verifiedBuilder_ == null) { + if (((bitField0_ & 0x00000010) == 0x00000010) && + verified_ != org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.getDefaultInstance()) { + verified_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.newBuilder(verified_).mergeFrom(value).buildPartial(); + } else { + verified_ = value; + } + onChanged(); + } else { + verifiedBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * optional .signalservice.Verified verified = 5; + */ + public Builder clearVerified() { + if (verifiedBuilder_ == null) { + verified_ = org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.getDefaultInstance(); + onChanged(); + } else { + verifiedBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000010); + return this; + } + /** + * optional .signalservice.Verified verified = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.Builder getVerifiedBuilder() { + bitField0_ |= 0x00000010; + onChanged(); + return getVerifiedFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.Verified verified = 5; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.VerifiedOrBuilder getVerifiedOrBuilder() { + if (verifiedBuilder_ != null) { + return verifiedBuilder_.getMessageOrBuilder(); + } else { + return verified_; + } + } + /** + * optional .signalservice.Verified verified = 5; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.Verified, org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.VerifiedOrBuilder> + getVerifiedFieldBuilder() { + if (verifiedBuilder_ == null) { + verifiedBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.Verified, org.session.libsignal.service.internal.push.SignalServiceProtos.Verified.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.VerifiedOrBuilder>( + verified_, + getParentForChildren(), + isClean()); + verified_ = null; + } + return verifiedBuilder_; + } + + // optional bytes profileKey = 6; + private com.google.protobuf.ByteString profileKey_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes profileKey = 6; + */ + public boolean hasProfileKey() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional bytes profileKey = 6; + */ + public com.google.protobuf.ByteString getProfileKey() { + return profileKey_; + } + /** + * optional bytes profileKey = 6; + */ + public Builder setProfileKey(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000020; + profileKey_ = value; + onChanged(); + return this; + } + /** + * optional bytes profileKey = 6; + */ + public Builder clearProfileKey() { + bitField0_ = (bitField0_ & ~0x00000020); + profileKey_ = getDefaultInstance().getProfileKey(); + onChanged(); + return this; + } + + // optional bool blocked = 7; + private boolean blocked_ ; + /** + * optional bool blocked = 7; + */ + public boolean hasBlocked() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * optional bool blocked = 7; + */ + public boolean getBlocked() { + return blocked_; + } + /** + * optional bool blocked = 7; + */ + public Builder setBlocked(boolean value) { + bitField0_ |= 0x00000040; + blocked_ = value; + onChanged(); + return this; + } + /** + * optional bool blocked = 7; + */ + public Builder clearBlocked() { + bitField0_ = (bitField0_ & ~0x00000040); + blocked_ = false; + onChanged(); + return this; + } + + // optional uint32 expireTimer = 8; + private int expireTimer_ ; + /** + * optional uint32 expireTimer = 8; + */ + public boolean hasExpireTimer() { + return ((bitField0_ & 0x00000080) == 0x00000080); + } + /** + * optional uint32 expireTimer = 8; + */ + public int getExpireTimer() { + return expireTimer_; + } + /** + * optional uint32 expireTimer = 8; + */ + public Builder setExpireTimer(int value) { + bitField0_ |= 0x00000080; + expireTimer_ = value; + onChanged(); + return this; + } + /** + * optional uint32 expireTimer = 8; + */ + public Builder clearExpireTimer() { + bitField0_ = (bitField0_ & ~0x00000080); + expireTimer_ = 0; + onChanged(); + return this; + } + + // optional string nickname = 101; + private Object nickname_ = ""; + /** + * optional string nickname = 101; + * + *
+       * Loki
+       * 
+ */ + public boolean hasNickname() { + return ((bitField0_ & 0x00000100) == 0x00000100); + } + /** + * optional string nickname = 101; + * + *
+       * Loki
+       * 
+ */ + public String getNickname() { + Object ref = nickname_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + nickname_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string nickname = 101; + * + *
+       * Loki
+       * 
+ */ + public com.google.protobuf.ByteString + getNicknameBytes() { + Object ref = nickname_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + nickname_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string nickname = 101; + * + *
+       * Loki
+       * 
+ */ + public Builder setNickname( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000100; + nickname_ = value; + onChanged(); + return this; + } + /** + * optional string nickname = 101; + * + *
+       * Loki
+       * 
+ */ + public Builder clearNickname() { + bitField0_ = (bitField0_ & ~0x00000100); + nickname_ = getDefaultInstance().getNickname(); + onChanged(); + return this; + } + /** + * optional string nickname = 101; + * + *
+       * Loki
+       * 
+ */ + public Builder setNicknameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000100; + nickname_ = value; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.ContactDetails) + } + + static { + defaultInstance = new ContactDetails(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.ContactDetails) + } + + public interface GroupDetailsOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional bytes id = 1; + /** + * optional bytes id = 1; + */ + boolean hasId(); + /** + * optional bytes id = 1; + */ + com.google.protobuf.ByteString getId(); + + // optional string name = 2; + /** + * optional string name = 2; + */ + boolean hasName(); + /** + * optional string name = 2; + */ + String getName(); + /** + * optional string name = 2; + */ + com.google.protobuf.ByteString + getNameBytes(); + + // repeated string members = 3; + /** + * repeated string members = 3; + */ + java.util.List + getMembersList(); + /** + * repeated string members = 3; + */ + int getMembersCount(); + /** + * repeated string members = 3; + */ + String getMembers(int index); + /** + * repeated string members = 3; + */ + com.google.protobuf.ByteString + getMembersBytes(int index); + + // optional .signalservice.GroupDetails.Avatar avatar = 4; + /** + * optional .signalservice.GroupDetails.Avatar avatar = 4; + */ + boolean hasAvatar(); + /** + * optional .signalservice.GroupDetails.Avatar avatar = 4; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar getAvatar(); + /** + * optional .signalservice.GroupDetails.Avatar avatar = 4; + */ + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.AvatarOrBuilder getAvatarOrBuilder(); + + // optional bool active = 5 [default = true]; + /** + * optional bool active = 5 [default = true]; + */ + boolean hasActive(); + /** + * optional bool active = 5 [default = true]; + */ + boolean getActive(); + + // optional uint32 expireTimer = 6; + /** + * optional uint32 expireTimer = 6; + */ + boolean hasExpireTimer(); + /** + * optional uint32 expireTimer = 6; + */ + int getExpireTimer(); + + // optional string color = 7; + /** + * optional string color = 7; + */ + boolean hasColor(); + /** + * optional string color = 7; + */ + String getColor(); + /** + * optional string color = 7; + */ + com.google.protobuf.ByteString + getColorBytes(); + + // optional bool blocked = 8; + /** + * optional bool blocked = 8; + */ + boolean hasBlocked(); + /** + * optional bool blocked = 8; + */ + boolean getBlocked(); + + // repeated string admins = 9; + /** + * repeated string admins = 9; + */ + java.util.List + getAdminsList(); + /** + * repeated string admins = 9; + */ + int getAdminsCount(); + /** + * repeated string admins = 9; + */ + String getAdmins(int index); + /** + * repeated string admins = 9; + */ + com.google.protobuf.ByteString + getAdminsBytes(int index); + } + /** + * Protobuf type {@code signalservice.GroupDetails} + */ + public static final class GroupDetails extends + com.google.protobuf.GeneratedMessage + implements GroupDetailsOrBuilder { + // Use GroupDetails.newBuilder() to construct. + private GroupDetails(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private GroupDetails(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final GroupDetails defaultInstance; + public static GroupDetails getDefaultInstance() { + return defaultInstance; + } + + public GroupDetails getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private GroupDetails( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + id_ = input.readBytes(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + name_ = input.readBytes(); + break; + } + case 26: { + if (!((mutable_bitField0_ & 0x00000004) == 0x00000004)) { + members_ = new com.google.protobuf.LazyStringArrayList(); + mutable_bitField0_ |= 0x00000004; + } + members_.add(input.readBytes()); + break; + } + case 34: { + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar.Builder subBuilder = null; + if (((bitField0_ & 0x00000004) == 0x00000004)) { + subBuilder = avatar_.toBuilder(); + } + avatar_ = input.readMessage(org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(avatar_); + avatar_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000004; + break; + } + case 40: { + bitField0_ |= 0x00000008; + active_ = input.readBool(); + break; + } + case 48: { + bitField0_ |= 0x00000010; + expireTimer_ = input.readUInt32(); + break; + } + case 58: { + bitField0_ |= 0x00000020; + color_ = input.readBytes(); + break; + } + case 64: { + bitField0_ |= 0x00000040; + blocked_ = input.readBool(); + break; + } + case 74: { + if (!((mutable_bitField0_ & 0x00000100) == 0x00000100)) { + admins_ = new com.google.protobuf.LazyStringArrayList(); + mutable_bitField0_ |= 0x00000100; + } + admins_.add(input.readBytes()); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000004) == 0x00000004)) { + members_ = new com.google.protobuf.UnmodifiableLazyStringList(members_); + } + if (((mutable_bitField0_ & 0x00000100) == 0x00000100)) { + admins_ = new com.google.protobuf.UnmodifiableLazyStringList(admins_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_GroupDetails_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_GroupDetails_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.class, org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public GroupDetails parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new GroupDetails(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public interface AvatarOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional string contentType = 1; + /** + * optional string contentType = 1; + */ + boolean hasContentType(); + /** + * optional string contentType = 1; + */ + String getContentType(); + /** + * optional string contentType = 1; + */ + com.google.protobuf.ByteString + getContentTypeBytes(); + + // optional uint32 length = 2; + /** + * optional uint32 length = 2; + */ + boolean hasLength(); + /** + * optional uint32 length = 2; + */ + int getLength(); + } + /** + * Protobuf type {@code signalservice.GroupDetails.Avatar} + */ + public static final class Avatar extends + com.google.protobuf.GeneratedMessage + implements AvatarOrBuilder { + // Use Avatar.newBuilder() to construct. + private Avatar(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Avatar(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Avatar defaultInstance; + public static Avatar getDefaultInstance() { + return defaultInstance; + } + + public Avatar getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Avatar( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + contentType_ = input.readBytes(); + break; + } + case 16: { + bitField0_ |= 0x00000002; + length_ = input.readUInt32(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_GroupDetails_Avatar_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_GroupDetails_Avatar_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar.class, org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Avatar parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Avatar(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional string contentType = 1; + public static final int CONTENTTYPE_FIELD_NUMBER = 1; + private Object contentType_; + /** + * optional string contentType = 1; + */ + public boolean hasContentType() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string contentType = 1; + */ + public String getContentType() { + Object ref = contentType_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + contentType_ = s; + } + return s; + } + } + /** + * optional string contentType = 1; + */ + public com.google.protobuf.ByteString + getContentTypeBytes() { + Object ref = contentType_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + contentType_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional uint32 length = 2; + public static final int LENGTH_FIELD_NUMBER = 2; + private int length_; + /** + * optional uint32 length = 2; + */ + public boolean hasLength() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional uint32 length = 2; + */ + public int getLength() { + return length_; + } + + private void initFields() { + contentType_ = ""; + length_ = 0; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getContentTypeBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeUInt32(2, length_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getContentTypeBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(2, length_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.GroupDetails.Avatar} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.AvatarOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_GroupDetails_Avatar_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_GroupDetails_Avatar_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar.class, org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + contentType_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + length_ = 0; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_GroupDetails_Avatar_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar result = new org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.contentType_ = contentType_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.length_ = length_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar.getDefaultInstance()) return this; + if (other.hasContentType()) { + bitField0_ |= 0x00000001; + contentType_ = other.contentType_; + onChanged(); + } + if (other.hasLength()) { + setLength(other.getLength()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional string contentType = 1; + private Object contentType_ = ""; + /** + * optional string contentType = 1; + */ + public boolean hasContentType() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string contentType = 1; + */ + public String getContentType() { + Object ref = contentType_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + contentType_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string contentType = 1; + */ + public com.google.protobuf.ByteString + getContentTypeBytes() { + Object ref = contentType_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + contentType_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string contentType = 1; + */ + public Builder setContentType( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + contentType_ = value; + onChanged(); + return this; + } + /** + * optional string contentType = 1; + */ + public Builder clearContentType() { + bitField0_ = (bitField0_ & ~0x00000001); + contentType_ = getDefaultInstance().getContentType(); + onChanged(); + return this; + } + /** + * optional string contentType = 1; + */ + public Builder setContentTypeBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + contentType_ = value; + onChanged(); + return this; + } + + // optional uint32 length = 2; + private int length_ ; + /** + * optional uint32 length = 2; + */ + public boolean hasLength() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional uint32 length = 2; + */ + public int getLength() { + return length_; + } + /** + * optional uint32 length = 2; + */ + public Builder setLength(int value) { + bitField0_ |= 0x00000002; + length_ = value; + onChanged(); + return this; + } + /** + * optional uint32 length = 2; + */ + public Builder clearLength() { + bitField0_ = (bitField0_ & ~0x00000002); + length_ = 0; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.GroupDetails.Avatar) + } + + static { + defaultInstance = new Avatar(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.GroupDetails.Avatar) + } + + private int bitField0_; + // optional bytes id = 1; + public static final int ID_FIELD_NUMBER = 1; + private com.google.protobuf.ByteString id_; + /** + * optional bytes id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes id = 1; + */ + public com.google.protobuf.ByteString getId() { + return id_; + } + + // optional string name = 2; + public static final int NAME_FIELD_NUMBER = 2; + private Object name_; + /** + * optional string name = 2; + */ + public boolean hasName() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string name = 2; + */ + public String getName() { + Object ref = name_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } + } + /** + * optional string name = 2; + */ + public com.google.protobuf.ByteString + getNameBytes() { + Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // repeated string members = 3; + public static final int MEMBERS_FIELD_NUMBER = 3; + private com.google.protobuf.LazyStringList members_; + /** + * repeated string members = 3; + */ + public java.util.List + getMembersList() { + return members_; + } + /** + * repeated string members = 3; + */ + public int getMembersCount() { + return members_.size(); + } + /** + * repeated string members = 3; + */ + public String getMembers(int index) { + return members_.get(index); + } + /** + * repeated string members = 3; + */ + public com.google.protobuf.ByteString + getMembersBytes(int index) { + return members_.getByteString(index); + } + + // optional .signalservice.GroupDetails.Avatar avatar = 4; + public static final int AVATAR_FIELD_NUMBER = 4; + private org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar avatar_; + /** + * optional .signalservice.GroupDetails.Avatar avatar = 4; + */ + public boolean hasAvatar() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .signalservice.GroupDetails.Avatar avatar = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar getAvatar() { + return avatar_; + } + /** + * optional .signalservice.GroupDetails.Avatar avatar = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.AvatarOrBuilder getAvatarOrBuilder() { + return avatar_; + } + + // optional bool active = 5 [default = true]; + public static final int ACTIVE_FIELD_NUMBER = 5; + private boolean active_; + /** + * optional bool active = 5 [default = true]; + */ + public boolean hasActive() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional bool active = 5 [default = true]; + */ + public boolean getActive() { + return active_; + } + + // optional uint32 expireTimer = 6; + public static final int EXPIRETIMER_FIELD_NUMBER = 6; + private int expireTimer_; + /** + * optional uint32 expireTimer = 6; + */ + public boolean hasExpireTimer() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional uint32 expireTimer = 6; + */ + public int getExpireTimer() { + return expireTimer_; + } + + // optional string color = 7; + public static final int COLOR_FIELD_NUMBER = 7; + private Object color_; + /** + * optional string color = 7; + */ + public boolean hasColor() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional string color = 7; + */ + public String getColor() { + Object ref = color_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + color_ = s; + } + return s; + } + } + /** + * optional string color = 7; + */ + public com.google.protobuf.ByteString + getColorBytes() { + Object ref = color_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + color_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional bool blocked = 8; + public static final int BLOCKED_FIELD_NUMBER = 8; + private boolean blocked_; + /** + * optional bool blocked = 8; + */ + public boolean hasBlocked() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * optional bool blocked = 8; + */ + public boolean getBlocked() { + return blocked_; + } + + // repeated string admins = 9; + public static final int ADMINS_FIELD_NUMBER = 9; + private com.google.protobuf.LazyStringList admins_; + /** + * repeated string admins = 9; + */ + public java.util.List + getAdminsList() { + return admins_; + } + /** + * repeated string admins = 9; + */ + public int getAdminsCount() { + return admins_.size(); + } + /** + * repeated string admins = 9; + */ + public String getAdmins(int index) { + return admins_.get(index); + } + /** + * repeated string admins = 9; + */ + public com.google.protobuf.ByteString + getAdminsBytes(int index) { + return admins_.getByteString(index); + } + + private void initFields() { + id_ = com.google.protobuf.ByteString.EMPTY; + name_ = ""; + members_ = com.google.protobuf.LazyStringArrayList.EMPTY; + avatar_ = org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar.getDefaultInstance(); + active_ = true; + expireTimer_ = 0; + color_ = ""; + blocked_ = false; + admins_ = com.google.protobuf.LazyStringArrayList.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, getNameBytes()); + } + for (int i = 0; i < members_.size(); i++) { + output.writeBytes(3, members_.getByteString(i)); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeMessage(4, avatar_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeBool(5, active_); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + output.writeUInt32(6, expireTimer_); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + output.writeBytes(7, getColorBytes()); + } + if (((bitField0_ & 0x00000040) == 0x00000040)) { + output.writeBool(8, blocked_); + } + for (int i = 0; i < admins_.size(); i++) { + output.writeBytes(9, admins_.getByteString(i)); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, getNameBytes()); + } + { + int dataSize = 0; + for (int i = 0; i < members_.size(); i++) { + dataSize += com.google.protobuf.CodedOutputStream + .computeBytesSizeNoTag(members_.getByteString(i)); + } + size += dataSize; + size += 1 * getMembersList().size(); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(4, avatar_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(5, active_); + } + if (((bitField0_ & 0x00000010) == 0x00000010)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(6, expireTimer_); + } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(7, getColorBytes()); + } + if (((bitField0_ & 0x00000040) == 0x00000040)) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(8, blocked_); + } + { + int dataSize = 0; + for (int i = 0; i < admins_.size(); i++) { + dataSize += com.google.protobuf.CodedOutputStream + .computeBytesSizeNoTag(admins_.getByteString(i)); + } + size += dataSize; + size += 1 * getAdminsList().size(); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.GroupDetails} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetailsOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_GroupDetails_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_GroupDetails_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.class, org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getAvatarFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + id_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + name_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + members_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000004); + if (avatarBuilder_ == null) { + avatar_ = org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar.getDefaultInstance(); + } else { + avatarBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000008); + active_ = true; + bitField0_ = (bitField0_ & ~0x00000010); + expireTimer_ = 0; + bitField0_ = (bitField0_ & ~0x00000020); + color_ = ""; + bitField0_ = (bitField0_ & ~0x00000040); + blocked_ = false; + bitField0_ = (bitField0_ & ~0x00000080); + admins_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000100); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.internal_static_signalservice_GroupDetails_descriptor; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails getDefaultInstanceForType() { + return org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails build() { + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails buildPartial() { + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails result = new org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.id_ = id_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.name_ = name_; + if (((bitField0_ & 0x00000004) == 0x00000004)) { + members_ = new com.google.protobuf.UnmodifiableLazyStringList( + members_); + bitField0_ = (bitField0_ & ~0x00000004); + } + result.members_ = members_; + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000004; + } + if (avatarBuilder_ == null) { + result.avatar_ = avatar_; + } else { + result.avatar_ = avatarBuilder_.build(); + } + if (((from_bitField0_ & 0x00000010) == 0x00000010)) { + to_bitField0_ |= 0x00000008; + } + result.active_ = active_; + if (((from_bitField0_ & 0x00000020) == 0x00000020)) { + to_bitField0_ |= 0x00000010; + } + result.expireTimer_ = expireTimer_; + if (((from_bitField0_ & 0x00000040) == 0x00000040)) { + to_bitField0_ |= 0x00000020; + } + result.color_ = color_; + if (((from_bitField0_ & 0x00000080) == 0x00000080)) { + to_bitField0_ |= 0x00000040; + } + result.blocked_ = blocked_; + if (((bitField0_ & 0x00000100) == 0x00000100)) { + admins_ = new com.google.protobuf.UnmodifiableLazyStringList( + admins_); + bitField0_ = (bitField0_ & ~0x00000100); + } + result.admins_ = admins_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails) { + return mergeFrom((org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails other) { + if (other == org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.getDefaultInstance()) return this; + if (other.hasId()) { + setId(other.getId()); + } + if (other.hasName()) { + bitField0_ |= 0x00000002; + name_ = other.name_; + onChanged(); + } + if (!other.members_.isEmpty()) { + if (members_.isEmpty()) { + members_ = other.members_; + bitField0_ = (bitField0_ & ~0x00000004); + } else { + ensureMembersIsMutable(); + members_.addAll(other.members_); + } + onChanged(); + } + if (other.hasAvatar()) { + mergeAvatar(other.getAvatar()); + } + if (other.hasActive()) { + setActive(other.getActive()); + } + if (other.hasExpireTimer()) { + setExpireTimer(other.getExpireTimer()); + } + if (other.hasColor()) { + bitField0_ |= 0x00000040; + color_ = other.color_; + onChanged(); + } + if (other.hasBlocked()) { + setBlocked(other.getBlocked()); + } + if (!other.admins_.isEmpty()) { + if (admins_.isEmpty()) { + admins_ = other.admins_; + bitField0_ = (bitField0_ & ~0x00000100); + } else { + ensureAdminsIsMutable(); + admins_.addAll(other.admins_); + } + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional bytes id = 1; + private com.google.protobuf.ByteString id_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bytes id = 1; + */ + public com.google.protobuf.ByteString getId() { + return id_; + } + /** + * optional bytes id = 1; + */ + public Builder setId(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + id_ = value; + onChanged(); + return this; + } + /** + * optional bytes id = 1; + */ + public Builder clearId() { + bitField0_ = (bitField0_ & ~0x00000001); + id_ = getDefaultInstance().getId(); + onChanged(); + return this; + } + + // optional string name = 2; + private Object name_ = ""; + /** + * optional string name = 2; + */ + public boolean hasName() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string name = 2; + */ + public String getName() { + Object ref = name_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + name_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string name = 2; + */ + public com.google.protobuf.ByteString + getNameBytes() { + Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string name = 2; + */ + public Builder setName( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + name_ = value; + onChanged(); + return this; + } + /** + * optional string name = 2; + */ + public Builder clearName() { + bitField0_ = (bitField0_ & ~0x00000002); + name_ = getDefaultInstance().getName(); + onChanged(); + return this; + } + /** + * optional string name = 2; + */ + public Builder setNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + name_ = value; + onChanged(); + return this; + } + + // repeated string members = 3; + private com.google.protobuf.LazyStringList members_ = com.google.protobuf.LazyStringArrayList.EMPTY; + private void ensureMembersIsMutable() { + if (!((bitField0_ & 0x00000004) == 0x00000004)) { + members_ = new com.google.protobuf.LazyStringArrayList(members_); + bitField0_ |= 0x00000004; + } + } + /** + * repeated string members = 3; + */ + public java.util.List + getMembersList() { + return java.util.Collections.unmodifiableList(members_); + } + /** + * repeated string members = 3; + */ + public int getMembersCount() { + return members_.size(); + } + /** + * repeated string members = 3; + */ + public String getMembers(int index) { + return members_.get(index); + } + /** + * repeated string members = 3; + */ + public com.google.protobuf.ByteString + getMembersBytes(int index) { + return members_.getByteString(index); + } + /** + * repeated string members = 3; + */ + public Builder setMembers( + int index, String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureMembersIsMutable(); + members_.set(index, value); + onChanged(); + return this; + } + /** + * repeated string members = 3; + */ + public Builder addMembers( + String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureMembersIsMutable(); + members_.add(value); + onChanged(); + return this; + } + /** + * repeated string members = 3; + */ + public Builder addAllMembers( + Iterable values) { + ensureMembersIsMutable(); + super.addAll(values, members_); + onChanged(); + return this; + } + /** + * repeated string members = 3; + */ + public Builder clearMembers() { + members_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000004); + onChanged(); + return this; + } + /** + * repeated string members = 3; + */ + public Builder addMembersBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + ensureMembersIsMutable(); + members_.add(value); + onChanged(); + return this; + } + + // optional .signalservice.GroupDetails.Avatar avatar = 4; + private org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar avatar_ = org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar, org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.AvatarOrBuilder> avatarBuilder_; + /** + * optional .signalservice.GroupDetails.Avatar avatar = 4; + */ + public boolean hasAvatar() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional .signalservice.GroupDetails.Avatar avatar = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar getAvatar() { + if (avatarBuilder_ == null) { + return avatar_; + } else { + return avatarBuilder_.getMessage(); + } + } + /** + * optional .signalservice.GroupDetails.Avatar avatar = 4; + */ + public Builder setAvatar(org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar value) { + if (avatarBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + avatar_ = value; + onChanged(); + } else { + avatarBuilder_.setMessage(value); + } + bitField0_ |= 0x00000008; + return this; + } + /** + * optional .signalservice.GroupDetails.Avatar avatar = 4; + */ + public Builder setAvatar( + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar.Builder builderForValue) { + if (avatarBuilder_ == null) { + avatar_ = builderForValue.build(); + onChanged(); + } else { + avatarBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000008; + return this; + } + /** + * optional .signalservice.GroupDetails.Avatar avatar = 4; + */ + public Builder mergeAvatar(org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar value) { + if (avatarBuilder_ == null) { + if (((bitField0_ & 0x00000008) == 0x00000008) && + avatar_ != org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar.getDefaultInstance()) { + avatar_ = + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar.newBuilder(avatar_).mergeFrom(value).buildPartial(); + } else { + avatar_ = value; + } + onChanged(); + } else { + avatarBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000008; + return this; + } + /** + * optional .signalservice.GroupDetails.Avatar avatar = 4; + */ + public Builder clearAvatar() { + if (avatarBuilder_ == null) { + avatar_ = org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar.getDefaultInstance(); + onChanged(); + } else { + avatarBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + /** + * optional .signalservice.GroupDetails.Avatar avatar = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar.Builder getAvatarBuilder() { + bitField0_ |= 0x00000008; + onChanged(); + return getAvatarFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.GroupDetails.Avatar avatar = 4; + */ + public org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.AvatarOrBuilder getAvatarOrBuilder() { + if (avatarBuilder_ != null) { + return avatarBuilder_.getMessageOrBuilder(); + } else { + return avatar_; + } + } + /** + * optional .signalservice.GroupDetails.Avatar avatar = 4; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar, org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.AvatarOrBuilder> + getAvatarFieldBuilder() { + if (avatarBuilder_ == null) { + avatarBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar, org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.Avatar.Builder, org.session.libsignal.service.internal.push.SignalServiceProtos.GroupDetails.AvatarOrBuilder>( + avatar_, + getParentForChildren(), + isClean()); + avatar_ = null; + } + return avatarBuilder_; + } + + // optional bool active = 5 [default = true]; + private boolean active_ = true; + /** + * optional bool active = 5 [default = true]; + */ + public boolean hasActive() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional bool active = 5 [default = true]; + */ + public boolean getActive() { + return active_; + } + /** + * optional bool active = 5 [default = true]; + */ + public Builder setActive(boolean value) { + bitField0_ |= 0x00000010; + active_ = value; + onChanged(); + return this; + } + /** + * optional bool active = 5 [default = true]; + */ + public Builder clearActive() { + bitField0_ = (bitField0_ & ~0x00000010); + active_ = true; + onChanged(); + return this; + } + + // optional uint32 expireTimer = 6; + private int expireTimer_ ; + /** + * optional uint32 expireTimer = 6; + */ + public boolean hasExpireTimer() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional uint32 expireTimer = 6; + */ + public int getExpireTimer() { + return expireTimer_; + } + /** + * optional uint32 expireTimer = 6; + */ + public Builder setExpireTimer(int value) { + bitField0_ |= 0x00000020; + expireTimer_ = value; + onChanged(); + return this; + } + /** + * optional uint32 expireTimer = 6; + */ + public Builder clearExpireTimer() { + bitField0_ = (bitField0_ & ~0x00000020); + expireTimer_ = 0; + onChanged(); + return this; + } + + // optional string color = 7; + private Object color_ = ""; + /** + * optional string color = 7; + */ + public boolean hasColor() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * optional string color = 7; + */ + public String getColor() { + Object ref = color_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + color_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string color = 7; + */ + public com.google.protobuf.ByteString + getColorBytes() { + Object ref = color_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + color_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string color = 7; + */ + public Builder setColor( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000040; + color_ = value; + onChanged(); + return this; + } + /** + * optional string color = 7; + */ + public Builder clearColor() { + bitField0_ = (bitField0_ & ~0x00000040); + color_ = getDefaultInstance().getColor(); + onChanged(); + return this; + } + /** + * optional string color = 7; + */ + public Builder setColorBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000040; + color_ = value; + onChanged(); + return this; + } + + // optional bool blocked = 8; + private boolean blocked_ ; + /** + * optional bool blocked = 8; + */ + public boolean hasBlocked() { + return ((bitField0_ & 0x00000080) == 0x00000080); + } + /** + * optional bool blocked = 8; + */ + public boolean getBlocked() { + return blocked_; + } + /** + * optional bool blocked = 8; + */ + public Builder setBlocked(boolean value) { + bitField0_ |= 0x00000080; + blocked_ = value; + onChanged(); + return this; + } + /** + * optional bool blocked = 8; + */ + public Builder clearBlocked() { + bitField0_ = (bitField0_ & ~0x00000080); + blocked_ = false; + onChanged(); + return this; + } + + // repeated string admins = 9; + private com.google.protobuf.LazyStringList admins_ = com.google.protobuf.LazyStringArrayList.EMPTY; + private void ensureAdminsIsMutable() { + if (!((bitField0_ & 0x00000100) == 0x00000100)) { + admins_ = new com.google.protobuf.LazyStringArrayList(admins_); + bitField0_ |= 0x00000100; + } + } + /** + * repeated string admins = 9; + */ + public java.util.List + getAdminsList() { + return java.util.Collections.unmodifiableList(admins_); + } + /** + * repeated string admins = 9; + */ + public int getAdminsCount() { + return admins_.size(); + } + /** + * repeated string admins = 9; + */ + public String getAdmins(int index) { + return admins_.get(index); + } + /** + * repeated string admins = 9; + */ + public com.google.protobuf.ByteString + getAdminsBytes(int index) { + return admins_.getByteString(index); + } + /** + * repeated string admins = 9; + */ + public Builder setAdmins( + int index, String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureAdminsIsMutable(); + admins_.set(index, value); + onChanged(); + return this; + } + /** + * repeated string admins = 9; + */ + public Builder addAdmins( + String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureAdminsIsMutable(); + admins_.add(value); + onChanged(); + return this; + } + /** + * repeated string admins = 9; + */ + public Builder addAllAdmins( + Iterable values) { + ensureAdminsIsMutable(); + super.addAll(values, admins_); + onChanged(); + return this; + } + /** + * repeated string admins = 9; + */ + public Builder clearAdmins() { + admins_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000100); + onChanged(); + return this; + } + /** + * repeated string admins = 9; + */ + public Builder addAdminsBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + ensureAdminsIsMutable(); + admins_.add(value); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.GroupDetails) + } + + static { + defaultInstance = new GroupDetails(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.GroupDetails) + } + + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_Envelope_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_Envelope_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_Content_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_Content_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_DeviceLinkMessage_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_DeviceLinkMessage_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_PreKeyBundleMessage_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_PreKeyBundleMessage_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_CallMessage_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_CallMessage_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_CallMessage_Offer_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_CallMessage_Offer_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_CallMessage_Answer_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_CallMessage_Answer_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_CallMessage_IceUpdate_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_CallMessage_IceUpdate_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_CallMessage_Busy_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_CallMessage_Busy_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_CallMessage_Hangup_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_CallMessage_Hangup_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_ClosedGroupCiphertextMessageWrapper_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_ClosedGroupCiphertextMessageWrapper_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_DataMessage_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_DataMessage_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_DataMessage_Quote_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_DataMessage_Quote_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_DataMessage_Quote_QuotedAttachment_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_DataMessage_Quote_QuotedAttachment_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_DataMessage_Contact_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_DataMessage_Contact_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_DataMessage_Contact_Name_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_DataMessage_Contact_Name_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_DataMessage_Contact_Phone_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_DataMessage_Contact_Phone_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_DataMessage_Contact_Email_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_DataMessage_Contact_Email_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_DataMessage_Contact_PostalAddress_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_DataMessage_Contact_PostalAddress_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_DataMessage_Contact_Avatar_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_DataMessage_Contact_Avatar_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_DataMessage_Preview_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_DataMessage_Preview_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_DataMessage_Sticker_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_DataMessage_Sticker_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_LokiUserProfile_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_LokiUserProfile_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_ClosedGroupUpdate_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_ClosedGroupUpdate_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_ClosedGroupUpdate_SenderKey_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_ClosedGroupUpdate_SenderKey_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_NullMessage_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_NullMessage_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_ReceiptMessage_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_ReceiptMessage_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_TypingMessage_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_TypingMessage_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_Verified_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_Verified_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_SyncMessage_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_SyncMessage_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_SyncMessage_Sent_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_SyncMessage_Sent_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_SyncMessage_Sent_UnidentifiedDeliveryStatus_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_SyncMessage_Sent_UnidentifiedDeliveryStatus_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_SyncMessage_Contacts_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_SyncMessage_Contacts_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_SyncMessage_Groups_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_SyncMessage_Groups_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_SyncMessage_Blocked_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_SyncMessage_Blocked_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_SyncMessage_Request_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_SyncMessage_Request_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_SyncMessage_Read_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_SyncMessage_Read_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_SyncMessage_Configuration_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_SyncMessage_Configuration_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_SyncMessage_StickerPackOperation_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_SyncMessage_StickerPackOperation_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_SyncMessage_OpenGroupDetails_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_SyncMessage_OpenGroupDetails_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_AttachmentPointer_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_AttachmentPointer_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_GroupContext_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_GroupContext_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_ContactDetails_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_ContactDetails_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_ContactDetails_Avatar_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_ContactDetails_Avatar_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_GroupDetails_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_GroupDetails_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_GroupDetails_Avatar_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_GroupDetails_Avatar_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + String[] descriptorData = { + "\n\023SignalService.proto\022\rsignalservice\"\367\002\n" + + "\010Envelope\022*\n\004type\030\001 \001(\0162\034.signalservice." + + "Envelope.Type\022\016\n\006source\030\002 \001(\t\022\024\n\014sourceD" + + "evice\030\007 \001(\r\022\r\n\005relay\030\003 \001(\t\022\021\n\ttimestamp\030" + + "\005 \001(\004\022\025\n\rlegacyMessage\030\006 \001(\014\022\017\n\007content\030" + + "\010 \001(\014\022\022\n\nserverGuid\030\t \001(\t\022\027\n\017serverTimes" + + "tamp\030\n \001(\004\"\241\001\n\004Type\022\013\n\007UNKNOWN\020\000\022\016\n\nCIPH" + + "ERTEXT\020\001\022\020\n\014KEY_EXCHANGE\020\002\022\021\n\rPREKEY_BUN" + + "DLE\020\003\022\013\n\007RECEIPT\020\005\022\027\n\023UNIDENTIFIED_SENDE" + + "R\020\006\022\033\n\027CLOSED_GROUP_CIPHERTEXT\020\007\022\024\n\020FALL", + "BACK_MESSAGE\020e\"\267\003\n\007Content\022/\n\013dataMessag" + + "e\030\001 \001(\0132\032.signalservice.DataMessage\022/\n\013s" + + "yncMessage\030\002 \001(\0132\032.signalservice.SyncMes" + + "sage\022/\n\013callMessage\030\003 \001(\0132\032.signalservic" + + "e.CallMessage\022/\n\013nullMessage\030\004 \001(\0132\032.sig" + + "nalservice.NullMessage\0225\n\016receiptMessage" + + "\030\005 \001(\0132\035.signalservice.ReceiptMessage\0223\n" + + "\rtypingMessage\030\006 \001(\0132\034.signalservice.Typ" + + "ingMessage\022?\n\023preKeyBundleMessage\030e \001(\0132" + + "\".signalservice.PreKeyBundleMessage\022;\n\021d", + "eviceLinkMessage\030g \001(\0132 .signalservice.D" + + "eviceLinkMessage\"\203\001\n\021DeviceLinkMessage\022\030" + + "\n\020primaryPublicKey\030\001 \001(\t\022\032\n\022secondaryPub" + + "licKey\030\002 \001(\t\022\030\n\020requestSignature\030\003 \001(\014\022\036" + + "\n\026authorizationSignature\030\004 \001(\014\"\231\001\n\023PreKe" + + "yBundleMessage\022\023\n\013identityKey\030\001 \001(\014\022\020\n\010d" + + "eviceId\030\002 \001(\r\022\020\n\010preKeyId\030\003 \001(\r\022\023\n\013signe" + + "dKeyId\030\004 \001(\r\022\016\n\006preKey\030\005 \001(\014\022\021\n\tsignedKe" + + "y\030\006 \001(\014\022\021\n\tsignature\030\007 \001(\014\"\330\003\n\013CallMessa" + + "ge\022/\n\005offer\030\001 \001(\0132 .signalservice.CallMe", + "ssage.Offer\0221\n\006answer\030\002 \001(\0132!.signalserv" + + "ice.CallMessage.Answer\0227\n\ticeUpdate\030\003 \003(" + + "\0132$.signalservice.CallMessage.IceUpdate\022" + + "1\n\006hangup\030\004 \001(\0132!.signalservice.CallMess" + + "age.Hangup\022-\n\004busy\030\005 \001(\0132\037.signalservice" + + ".CallMessage.Busy\032(\n\005Offer\022\n\n\002id\030\001 \001(\004\022\023" + + "\n\013description\030\002 \001(\t\032)\n\006Answer\022\n\n\002id\030\001 \001(" + + "\004\022\023\n\013description\030\002 \001(\t\032K\n\tIceUpdate\022\n\n\002i" + + "d\030\001 \001(\004\022\016\n\006sdpMid\030\002 \001(\t\022\025\n\rsdpMLineIndex" + + "\030\003 \001(\r\022\013\n\003sdp\030\004 \001(\t\032\022\n\004Busy\022\n\n\002id\030\001 \001(\004\032", + "\024\n\006Hangup\022\n\n\002id\030\001 \001(\004\"U\n#ClosedGroupCiph" + + "ertextMessageWrapper\022\022\n\nciphertext\030\001 \001(\014" + + "\022\032\n\022ephemeralPublicKey\030\002 \001(\014\"\357\020\n\013DataMes" + + "sage\022\014\n\004body\030\001 \001(\t\0225\n\013attachments\030\002 \003(\0132" + + " .signalservice.AttachmentPointer\022*\n\005gro" + + "up\030\003 \001(\0132\033.signalservice.GroupContext\022\r\n" + + "\005flags\030\004 \001(\r\022\023\n\013expireTimer\030\005 \001(\r\022\022\n\npro" + + "fileKey\030\006 \001(\014\022\021\n\ttimestamp\030\007 \001(\004\022/\n\005quot" + + "e\030\010 \001(\0132 .signalservice.DataMessage.Quot" + + "e\0223\n\007contact\030\t \003(\0132\".signalservice.DataM", + "essage.Contact\0223\n\007preview\030\n \003(\0132\".signal" + + "service.DataMessage.Preview\0223\n\007sticker\030\013" + + " \001(\0132\".signalservice.DataMessage.Sticker" + + "\022/\n\007profile\030e \001(\0132\036.signalservice.LokiUs" + + "erProfile\022;\n\021closedGroupUpdate\030g \001(\0132 .s" + + "ignalservice.ClosedGroupUpdate\032\351\001\n\005Quote" + + "\022\n\n\002id\030\001 \001(\004\022\016\n\006author\030\002 \001(\t\022\014\n\004text\030\003 \001" + + "(\t\022F\n\013attachments\030\004 \003(\01321.signalservice." + + "DataMessage.Quote.QuotedAttachment\032n\n\020Qu" + + "otedAttachment\022\023\n\013contentType\030\001 \001(\t\022\020\n\010f", + "ileName\030\002 \001(\t\0223\n\tthumbnail\030\003 \001(\0132 .signa" + + "lservice.AttachmentPointer\032\304\010\n\007Contact\0225" + + "\n\004name\030\001 \001(\0132\'.signalservice.DataMessage" + + ".Contact.Name\0228\n\006number\030\003 \003(\0132(.signalse" + + "rvice.DataMessage.Contact.Phone\0227\n\005email" + + "\030\004 \003(\0132(.signalservice.DataMessage.Conta" + + "ct.Email\022A\n\007address\030\005 \003(\01320.signalservic" + + "e.DataMessage.Contact.PostalAddress\0229\n\006a" + + "vatar\030\006 \001(\0132).signalservice.DataMessage." + + "Contact.Avatar\022\024\n\014organization\030\007 \001(\t\032v\n\004", + "Name\022\021\n\tgivenName\030\001 \001(\t\022\022\n\nfamilyName\030\002 " + + "\001(\t\022\016\n\006prefix\030\003 \001(\t\022\016\n\006suffix\030\004 \001(\t\022\022\n\nm" + + "iddleName\030\005 \001(\t\022\023\n\013displayName\030\006 \001(\t\032\226\001\n" + + "\005Phone\022\r\n\005value\030\001 \001(\t\022;\n\004type\030\002 \001(\0162-.si" + + "gnalservice.DataMessage.Contact.Phone.Ty" + + "pe\022\r\n\005label\030\003 \001(\t\"2\n\004Type\022\010\n\004HOME\020\001\022\n\n\006M" + + "OBILE\020\002\022\010\n\004WORK\020\003\022\n\n\006CUSTOM\020\004\032\226\001\n\005Email\022" + + "\r\n\005value\030\001 \001(\t\022;\n\004type\030\002 \001(\0162-.signalser" + + "vice.DataMessage.Contact.Email.Type\022\r\n\005l" + + "abel\030\003 \001(\t\"2\n\004Type\022\010\n\004HOME\020\001\022\n\n\006MOBILE\020\002", + "\022\010\n\004WORK\020\003\022\n\n\006CUSTOM\020\004\032\201\002\n\rPostalAddress" + + "\022C\n\004type\030\001 \001(\01625.signalservice.DataMessa" + + "ge.Contact.PostalAddress.Type\022\r\n\005label\030\002" + + " \001(\t\022\016\n\006street\030\003 \001(\t\022\r\n\005pobox\030\004 \001(\t\022\024\n\014n" + + "eighborhood\030\005 \001(\t\022\014\n\004city\030\006 \001(\t\022\016\n\006regio" + + "n\030\007 \001(\t\022\020\n\010postcode\030\010 \001(\t\022\017\n\007country\030\t \001" + + "(\t\"&\n\004Type\022\010\n\004HOME\020\001\022\010\n\004WORK\020\002\022\n\n\006CUSTOM" + + "\020\003\032M\n\006Avatar\0220\n\006avatar\030\001 \001(\0132 .signalser" + + "vice.AttachmentPointer\022\021\n\tisProfile\030\002 \001(" + + "\010\032V\n\007Preview\022\013\n\003url\030\001 \001(\t\022\r\n\005title\030\002 \001(\t", + "\022/\n\005image\030\003 \001(\0132 .signalservice.Attachme" + + "ntPointer\032m\n\007Sticker\022\016\n\006packId\030\001 \001(\014\022\017\n\007" + + "packKey\030\002 \001(\014\022\021\n\tstickerId\030\003 \001(\r\022.\n\004data" + + "\030\004 \001(\0132 .signalservice.AttachmentPointer" + + "\"l\n\005Flags\022\017\n\013END_SESSION\020\001\022\033\n\027EXPIRATION" + + "_TIMER_UPDATE\020\002\022\026\n\022PROFILE_KEY_UPDATE\020\004\022" + + "\035\n\030DEVICE_UNLINKING_REQUEST\020\200\001\"A\n\017LokiUs" + + "erProfile\022\023\n\013displayName\030\001 \001(\t\022\031\n\021profil" + + "ePictureURL\030\002 \001(\t\"\357\002\n\021ClosedGroupUpdate\022" + + "\014\n\004name\030\001 \001(\t\022\026\n\016groupPublicKey\030\002 \001(\014\022\027\n", + "\017groupPrivateKey\030\003 \001(\014\022>\n\nsenderKeys\030\004 \003" + + "(\0132*.signalservice.ClosedGroupUpdate.Sen" + + "derKey\022\017\n\007members\030\005 \003(\014\022\016\n\006admins\030\006 \003(\014\022" + + "3\n\004type\030\007 \001(\0162%.signalservice.ClosedGrou" + + "pUpdate.Type\032B\n\tSenderKey\022\020\n\010chainKey\030\001 " + + "\001(\014\022\020\n\010keyIndex\030\002 \001(\r\022\021\n\tpublicKey\030\003 \001(\014" + + "\"A\n\004Type\022\007\n\003NEW\020\000\022\010\n\004INFO\020\001\022\026\n\022SENDER_KE" + + "Y_REQUEST\020\002\022\016\n\nSENDER_KEY\020\003\"\036\n\013NullMessa" + + "ge\022\017\n\007padding\030\001 \001(\014\"u\n\016ReceiptMessage\0220\n" + + "\004type\030\001 \001(\0162\".signalservice.ReceiptMessa", + "ge.Type\022\021\n\ttimestamp\030\002 \003(\004\"\036\n\004Type\022\014\n\010DE" + + "LIVERY\020\000\022\010\n\004READ\020\001\"\214\001\n\rTypingMessage\022\021\n\t" + + "timestamp\030\001 \001(\004\0223\n\006action\030\002 \001(\0162#.signal" + + "service.TypingMessage.Action\022\017\n\007groupId\030" + + "\003 \001(\014\"\"\n\006Action\022\013\n\007STARTED\020\000\022\013\n\007STOPPED\020" + + "\001\"\253\001\n\010Verified\022\023\n\013destination\030\001 \001(\t\022\023\n\013i" + + "dentityKey\030\002 \001(\014\022,\n\005state\030\003 \001(\0162\035.signal" + + "service.Verified.State\022\023\n\013nullMessage\030\004 " + + "\001(\014\"2\n\005State\022\013\n\007DEFAULT\020\000\022\014\n\010VERIFIED\020\001\022" + + "\016\n\nUNVERIFIED\020\002\"\325\014\n\013SyncMessage\022-\n\004sent\030", + "\001 \001(\0132\037.signalservice.SyncMessage.Sent\0225" + + "\n\010contacts\030\002 \001(\0132#.signalservice.SyncMes" + + "sage.Contacts\0221\n\006groups\030\003 \001(\0132!.signalse" + + "rvice.SyncMessage.Groups\0223\n\007request\030\004 \001(" + + "\0132\".signalservice.SyncMessage.Request\022-\n" + + "\004read\030\005 \003(\0132\037.signalservice.SyncMessage." + + "Read\0223\n\007blocked\030\006 \001(\0132\".signalservice.Sy" + + "ncMessage.Blocked\022)\n\010verified\030\007 \001(\0132\027.si" + + "gnalservice.Verified\022?\n\rconfiguration\030\t " + + "\001(\0132(.signalservice.SyncMessage.Configur", + "ation\022\017\n\007padding\030\010 \001(\014\022M\n\024stickerPackOpe" + + "ration\030\n \003(\0132/.signalservice.SyncMessage" + + ".StickerPackOperation\022?\n\nopenGroups\030d \003(" + + "\0132+.signalservice.SyncMessage.OpenGroupD" + + "etails\032\236\002\n\004Sent\022\023\n\013destination\030\001 \001(\t\022\021\n\t" + + "timestamp\030\002 \001(\004\022+\n\007message\030\003 \001(\0132\032.signa" + + "lservice.DataMessage\022 \n\030expirationStartT" + + "imestamp\030\004 \001(\004\022V\n\022unidentifiedStatus\030\005 \003" + + "(\0132:.signalservice.SyncMessage.Sent.Unid" + + "entifiedDeliveryStatus\032G\n\032UnidentifiedDe", + "liveryStatus\022\023\n\013destination\030\001 \001(\t\022\024\n\014uni" + + "dentified\030\002 \001(\010\032a\n\010Contacts\022.\n\004blob\030\001 \001(" + + "\0132 .signalservice.AttachmentPointer\022\027\n\010c" + + "omplete\030\002 \001(\010:\005false\022\014\n\004data\030e \001(\014\032F\n\006Gr" + + "oups\022.\n\004blob\030\001 \001(\0132 .signalservice.Attac" + + "hmentPointer\022\014\n\004data\030e \001(\014\032,\n\007Blocked\022\017\n" + + "\007numbers\030\001 \003(\t\022\020\n\010groupIds\030\002 \003(\014\032\217\001\n\007Req" + + "uest\0225\n\004type\030\001 \001(\0162\'.signalservice.SyncM" + + "essage.Request.Type\"M\n\004Type\022\013\n\007UNKNOWN\020\000" + + "\022\014\n\010CONTACTS\020\001\022\n\n\006GROUPS\020\002\022\013\n\007BLOCKED\020\003\022", + "\021\n\rCONFIGURATION\020\004\032)\n\004Read\022\016\n\006sender\030\001 \001" + + "(\t\022\021\n\ttimestamp\030\002 \001(\004\032}\n\rConfiguration\022\024" + + "\n\014readReceipts\030\001 \001(\010\022&\n\036unidentifiedDeli" + + "veryIndicators\030\002 \001(\010\022\030\n\020typingIndicators" + + "\030\003 \001(\010\022\024\n\014linkPreviews\030\004 \001(\010\032\234\001\n\024Sticker" + + "PackOperation\022\016\n\006packId\030\001 \001(\014\022\017\n\007packKey" + + "\030\002 \001(\014\022B\n\004type\030\003 \001(\01624.signalservice.Syn" + + "cMessage.StickerPackOperation.Type\"\037\n\004Ty" + + "pe\022\013\n\007INSTALL\020\000\022\n\n\006REMOVE\020\001\0322\n\020OpenGroup" + + "Details\022\013\n\003url\030\001 \001(\t\022\021\n\tchannelID\030\002 \001(\r\"", + "\354\001\n\021AttachmentPointer\022\n\n\002id\030\001 \001(\006\022\023\n\013con" + + "tentType\030\002 \001(\t\022\013\n\003key\030\003 \001(\014\022\014\n\004size\030\004 \001(" + + "\r\022\021\n\tthumbnail\030\005 \001(\014\022\016\n\006digest\030\006 \001(\014\022\020\n\010" + + "fileName\030\007 \001(\t\022\r\n\005flags\030\010 \001(\r\022\r\n\005width\030\t" + + " \001(\r\022\016\n\006height\030\n \001(\r\022\017\n\007caption\030\013 \001(\t\022\013\n" + + "\003url\030e \001(\t\"\032\n\005Flags\022\021\n\rVOICE_MESSAGE\020\001\"\243" + + "\002\n\014GroupContext\022\n\n\002id\030\001 \001(\014\022.\n\004type\030\002 \001(" + + "\0162 .signalservice.GroupContext.Type\022\014\n\004n" + + "ame\030\003 \001(\t\022\017\n\007members\030\004 \003(\t\0220\n\006avatar\030\005 \001" + + "(\0132 .signalservice.AttachmentPointer\022\016\n\006", + "admins\030\006 \003(\t\022\023\n\nnewMembers\030\346\007 \003(\t\022\027\n\016rem" + + "ovedMembers\030\347\007 \003(\t\"H\n\004Type\022\013\n\007UNKNOWN\020\000\022" + + "\n\n\006UPDATE\020\001\022\013\n\007DELIVER\020\002\022\010\n\004QUIT\020\003\022\020\n\014RE" + + "QUEST_INFO\020\004\"\231\002\n\016ContactDetails\022\016\n\006numbe" + + "r\030\001 \001(\t\022\014\n\004name\030\002 \001(\t\0224\n\006avatar\030\003 \001(\0132$." + + "signalservice.ContactDetails.Avatar\022\r\n\005c" + + "olor\030\004 \001(\t\022)\n\010verified\030\005 \001(\0132\027.signalser" + + "vice.Verified\022\022\n\nprofileKey\030\006 \001(\014\022\017\n\007blo" + + "cked\030\007 \001(\010\022\023\n\013expireTimer\030\010 \001(\r\022\020\n\010nickn" + + "ame\030e \001(\t\032-\n\006Avatar\022\023\n\013contentType\030\001 \001(\t", + "\022\016\n\006length\030\002 \001(\r\"\367\001\n\014GroupDetails\022\n\n\002id\030" + + "\001 \001(\014\022\014\n\004name\030\002 \001(\t\022\017\n\007members\030\003 \003(\t\0222\n\006" + + "avatar\030\004 \001(\0132\".signalservice.GroupDetail" + + "s.Avatar\022\024\n\006active\030\005 \001(\010:\004true\022\023\n\013expire" + + "Timer\030\006 \001(\r\022\r\n\005color\030\007 \001(\t\022\017\n\007blocked\030\010 " + + "\001(\010\022\016\n\006admins\030\t \003(\t\032-\n\006Avatar\022\023\n\013content" + + "Type\030\001 \001(\t\022\016\n\006length\030\002 \001(\rBE\n.org.whispe" + + "rsystems.signalservice.internal.pushB\023Si" + + "gnalServiceProtos" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + internal_static_signalservice_Envelope_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_signalservice_Envelope_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_Envelope_descriptor, + new String[] { "Type", "Source", "SourceDevice", "Relay", "Timestamp", "LegacyMessage", "Content", "ServerGuid", "ServerTimestamp", }); + internal_static_signalservice_Content_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_signalservice_Content_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_Content_descriptor, + new String[] { "DataMessage", "SyncMessage", "CallMessage", "NullMessage", "ReceiptMessage", "TypingMessage", "PreKeyBundleMessage", "DeviceLinkMessage", }); + internal_static_signalservice_DeviceLinkMessage_descriptor = + getDescriptor().getMessageTypes().get(2); + internal_static_signalservice_DeviceLinkMessage_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_DeviceLinkMessage_descriptor, + new String[] { "PrimaryPublicKey", "SecondaryPublicKey", "RequestSignature", "AuthorizationSignature", }); + internal_static_signalservice_PreKeyBundleMessage_descriptor = + getDescriptor().getMessageTypes().get(3); + internal_static_signalservice_PreKeyBundleMessage_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_PreKeyBundleMessage_descriptor, + new String[] { "IdentityKey", "DeviceId", "PreKeyId", "SignedKeyId", "PreKey", "SignedKey", "Signature", }); + internal_static_signalservice_CallMessage_descriptor = + getDescriptor().getMessageTypes().get(4); + internal_static_signalservice_CallMessage_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_CallMessage_descriptor, + new String[] { "Offer", "Answer", "IceUpdate", "Hangup", "Busy", }); + internal_static_signalservice_CallMessage_Offer_descriptor = + internal_static_signalservice_CallMessage_descriptor.getNestedTypes().get(0); + internal_static_signalservice_CallMessage_Offer_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_CallMessage_Offer_descriptor, + new String[] { "Id", "Description", }); + internal_static_signalservice_CallMessage_Answer_descriptor = + internal_static_signalservice_CallMessage_descriptor.getNestedTypes().get(1); + internal_static_signalservice_CallMessage_Answer_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_CallMessage_Answer_descriptor, + new String[] { "Id", "Description", }); + internal_static_signalservice_CallMessage_IceUpdate_descriptor = + internal_static_signalservice_CallMessage_descriptor.getNestedTypes().get(2); + internal_static_signalservice_CallMessage_IceUpdate_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_CallMessage_IceUpdate_descriptor, + new String[] { "Id", "SdpMid", "SdpMLineIndex", "Sdp", }); + internal_static_signalservice_CallMessage_Busy_descriptor = + internal_static_signalservice_CallMessage_descriptor.getNestedTypes().get(3); + internal_static_signalservice_CallMessage_Busy_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_CallMessage_Busy_descriptor, + new String[] { "Id", }); + internal_static_signalservice_CallMessage_Hangup_descriptor = + internal_static_signalservice_CallMessage_descriptor.getNestedTypes().get(4); + internal_static_signalservice_CallMessage_Hangup_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_CallMessage_Hangup_descriptor, + new String[] { "Id", }); + internal_static_signalservice_ClosedGroupCiphertextMessageWrapper_descriptor = + getDescriptor().getMessageTypes().get(5); + internal_static_signalservice_ClosedGroupCiphertextMessageWrapper_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_ClosedGroupCiphertextMessageWrapper_descriptor, + new String[] { "Ciphertext", "EphemeralPublicKey", }); + internal_static_signalservice_DataMessage_descriptor = + getDescriptor().getMessageTypes().get(6); + internal_static_signalservice_DataMessage_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_DataMessage_descriptor, + new String[] { "Body", "Attachments", "Group", "Flags", "ExpireTimer", "ProfileKey", "Timestamp", "Quote", "Contact", "Preview", "Sticker", "Profile", "ClosedGroupUpdate", }); + internal_static_signalservice_DataMessage_Quote_descriptor = + internal_static_signalservice_DataMessage_descriptor.getNestedTypes().get(0); + internal_static_signalservice_DataMessage_Quote_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_DataMessage_Quote_descriptor, + new String[] { "Id", "Author", "Text", "Attachments", }); + internal_static_signalservice_DataMessage_Quote_QuotedAttachment_descriptor = + internal_static_signalservice_DataMessage_Quote_descriptor.getNestedTypes().get(0); + internal_static_signalservice_DataMessage_Quote_QuotedAttachment_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_DataMessage_Quote_QuotedAttachment_descriptor, + new String[] { "ContentType", "FileName", "Thumbnail", }); + internal_static_signalservice_DataMessage_Contact_descriptor = + internal_static_signalservice_DataMessage_descriptor.getNestedTypes().get(1); + internal_static_signalservice_DataMessage_Contact_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_DataMessage_Contact_descriptor, + new String[] { "Name", "Number", "Email", "Address", "Avatar", "Organization", }); + internal_static_signalservice_DataMessage_Contact_Name_descriptor = + internal_static_signalservice_DataMessage_Contact_descriptor.getNestedTypes().get(0); + internal_static_signalservice_DataMessage_Contact_Name_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_DataMessage_Contact_Name_descriptor, + new String[] { "GivenName", "FamilyName", "Prefix", "Suffix", "MiddleName", "DisplayName", }); + internal_static_signalservice_DataMessage_Contact_Phone_descriptor = + internal_static_signalservice_DataMessage_Contact_descriptor.getNestedTypes().get(1); + internal_static_signalservice_DataMessage_Contact_Phone_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_DataMessage_Contact_Phone_descriptor, + new String[] { "Value", "Type", "Label", }); + internal_static_signalservice_DataMessage_Contact_Email_descriptor = + internal_static_signalservice_DataMessage_Contact_descriptor.getNestedTypes().get(2); + internal_static_signalservice_DataMessage_Contact_Email_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_DataMessage_Contact_Email_descriptor, + new String[] { "Value", "Type", "Label", }); + internal_static_signalservice_DataMessage_Contact_PostalAddress_descriptor = + internal_static_signalservice_DataMessage_Contact_descriptor.getNestedTypes().get(3); + internal_static_signalservice_DataMessage_Contact_PostalAddress_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_DataMessage_Contact_PostalAddress_descriptor, + new String[] { "Type", "Label", "Street", "Pobox", "Neighborhood", "City", "Region", "Postcode", "Country", }); + internal_static_signalservice_DataMessage_Contact_Avatar_descriptor = + internal_static_signalservice_DataMessage_Contact_descriptor.getNestedTypes().get(4); + internal_static_signalservice_DataMessage_Contact_Avatar_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_DataMessage_Contact_Avatar_descriptor, + new String[] { "Avatar", "IsProfile", }); + internal_static_signalservice_DataMessage_Preview_descriptor = + internal_static_signalservice_DataMessage_descriptor.getNestedTypes().get(2); + internal_static_signalservice_DataMessage_Preview_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_DataMessage_Preview_descriptor, + new String[] { "Url", "Title", "Image", }); + internal_static_signalservice_DataMessage_Sticker_descriptor = + internal_static_signalservice_DataMessage_descriptor.getNestedTypes().get(3); + internal_static_signalservice_DataMessage_Sticker_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_DataMessage_Sticker_descriptor, + new String[] { "PackId", "PackKey", "StickerId", "Data", }); + internal_static_signalservice_LokiUserProfile_descriptor = + getDescriptor().getMessageTypes().get(7); + internal_static_signalservice_LokiUserProfile_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_LokiUserProfile_descriptor, + new String[] { "DisplayName", "ProfilePictureURL", }); + internal_static_signalservice_ClosedGroupUpdate_descriptor = + getDescriptor().getMessageTypes().get(8); + internal_static_signalservice_ClosedGroupUpdate_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_ClosedGroupUpdate_descriptor, + new String[] { "Name", "GroupPublicKey", "GroupPrivateKey", "SenderKeys", "Members", "Admins", "Type", }); + internal_static_signalservice_ClosedGroupUpdate_SenderKey_descriptor = + internal_static_signalservice_ClosedGroupUpdate_descriptor.getNestedTypes().get(0); + internal_static_signalservice_ClosedGroupUpdate_SenderKey_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_ClosedGroupUpdate_SenderKey_descriptor, + new String[] { "ChainKey", "KeyIndex", "PublicKey", }); + internal_static_signalservice_NullMessage_descriptor = + getDescriptor().getMessageTypes().get(9); + internal_static_signalservice_NullMessage_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_NullMessage_descriptor, + new String[] { "Padding", }); + internal_static_signalservice_ReceiptMessage_descriptor = + getDescriptor().getMessageTypes().get(10); + internal_static_signalservice_ReceiptMessage_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_ReceiptMessage_descriptor, + new String[] { "Type", "Timestamp", }); + internal_static_signalservice_TypingMessage_descriptor = + getDescriptor().getMessageTypes().get(11); + internal_static_signalservice_TypingMessage_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_TypingMessage_descriptor, + new String[] { "Timestamp", "Action", "GroupId", }); + internal_static_signalservice_Verified_descriptor = + getDescriptor().getMessageTypes().get(12); + internal_static_signalservice_Verified_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_Verified_descriptor, + new String[] { "Destination", "IdentityKey", "State", "NullMessage", }); + internal_static_signalservice_SyncMessage_descriptor = + getDescriptor().getMessageTypes().get(13); + internal_static_signalservice_SyncMessage_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_SyncMessage_descriptor, + new String[] { "Sent", "Contacts", "Groups", "Request", "Read", "Blocked", "Verified", "Configuration", "Padding", "StickerPackOperation", "OpenGroups", }); + internal_static_signalservice_SyncMessage_Sent_descriptor = + internal_static_signalservice_SyncMessage_descriptor.getNestedTypes().get(0); + internal_static_signalservice_SyncMessage_Sent_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_SyncMessage_Sent_descriptor, + new String[] { "Destination", "Timestamp", "Message", "ExpirationStartTimestamp", "UnidentifiedStatus", }); + internal_static_signalservice_SyncMessage_Sent_UnidentifiedDeliveryStatus_descriptor = + internal_static_signalservice_SyncMessage_Sent_descriptor.getNestedTypes().get(0); + internal_static_signalservice_SyncMessage_Sent_UnidentifiedDeliveryStatus_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_SyncMessage_Sent_UnidentifiedDeliveryStatus_descriptor, + new String[] { "Destination", "Unidentified", }); + internal_static_signalservice_SyncMessage_Contacts_descriptor = + internal_static_signalservice_SyncMessage_descriptor.getNestedTypes().get(1); + internal_static_signalservice_SyncMessage_Contacts_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_SyncMessage_Contacts_descriptor, + new String[] { "Blob", "Complete", "Data", }); + internal_static_signalservice_SyncMessage_Groups_descriptor = + internal_static_signalservice_SyncMessage_descriptor.getNestedTypes().get(2); + internal_static_signalservice_SyncMessage_Groups_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_SyncMessage_Groups_descriptor, + new String[] { "Blob", "Data", }); + internal_static_signalservice_SyncMessage_Blocked_descriptor = + internal_static_signalservice_SyncMessage_descriptor.getNestedTypes().get(3); + internal_static_signalservice_SyncMessage_Blocked_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_SyncMessage_Blocked_descriptor, + new String[] { "Numbers", "GroupIds", }); + internal_static_signalservice_SyncMessage_Request_descriptor = + internal_static_signalservice_SyncMessage_descriptor.getNestedTypes().get(4); + internal_static_signalservice_SyncMessage_Request_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_SyncMessage_Request_descriptor, + new String[] { "Type", }); + internal_static_signalservice_SyncMessage_Read_descriptor = + internal_static_signalservice_SyncMessage_descriptor.getNestedTypes().get(5); + internal_static_signalservice_SyncMessage_Read_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_SyncMessage_Read_descriptor, + new String[] { "Sender", "Timestamp", }); + internal_static_signalservice_SyncMessage_Configuration_descriptor = + internal_static_signalservice_SyncMessage_descriptor.getNestedTypes().get(6); + internal_static_signalservice_SyncMessage_Configuration_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_SyncMessage_Configuration_descriptor, + new String[] { "ReadReceipts", "UnidentifiedDeliveryIndicators", "TypingIndicators", "LinkPreviews", }); + internal_static_signalservice_SyncMessage_StickerPackOperation_descriptor = + internal_static_signalservice_SyncMessage_descriptor.getNestedTypes().get(7); + internal_static_signalservice_SyncMessage_StickerPackOperation_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_SyncMessage_StickerPackOperation_descriptor, + new String[] { "PackId", "PackKey", "Type", }); + internal_static_signalservice_SyncMessage_OpenGroupDetails_descriptor = + internal_static_signalservice_SyncMessage_descriptor.getNestedTypes().get(8); + internal_static_signalservice_SyncMessage_OpenGroupDetails_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_SyncMessage_OpenGroupDetails_descriptor, + new String[] { "Url", "ChannelID", }); + internal_static_signalservice_AttachmentPointer_descriptor = + getDescriptor().getMessageTypes().get(14); + internal_static_signalservice_AttachmentPointer_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_AttachmentPointer_descriptor, + new String[] { "Id", "ContentType", "Key", "Size", "Thumbnail", "Digest", "FileName", "Flags", "Width", "Height", "Caption", "Url", }); + internal_static_signalservice_GroupContext_descriptor = + getDescriptor().getMessageTypes().get(15); + internal_static_signalservice_GroupContext_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_GroupContext_descriptor, + new String[] { "Id", "Type", "Name", "Members", "Avatar", "Admins", "NewMembers", "RemovedMembers", }); + internal_static_signalservice_ContactDetails_descriptor = + getDescriptor().getMessageTypes().get(16); + internal_static_signalservice_ContactDetails_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_ContactDetails_descriptor, + new String[] { "Number", "Name", "Avatar", "Color", "Verified", "ProfileKey", "Blocked", "ExpireTimer", "Nickname", }); + internal_static_signalservice_ContactDetails_Avatar_descriptor = + internal_static_signalservice_ContactDetails_descriptor.getNestedTypes().get(0); + internal_static_signalservice_ContactDetails_Avatar_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_ContactDetails_Avatar_descriptor, + new String[] { "ContentType", "Length", }); + internal_static_signalservice_GroupDetails_descriptor = + getDescriptor().getMessageTypes().get(17); + internal_static_signalservice_GroupDetails_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_GroupDetails_descriptor, + new String[] { "Id", "Name", "Members", "Avatar", "Active", "ExpireTimer", "Color", "Blocked", "Admins", }); + internal_static_signalservice_GroupDetails_Avatar_descriptor = + internal_static_signalservice_GroupDetails_descriptor.getNestedTypes().get(0); + internal_static_signalservice_GroupDetails_Avatar_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_GroupDetails_Avatar_descriptor, + new String[] { "ContentType", "Length", }); + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/StaleDevices.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/StaleDevices.java new file mode 100644 index 000000000..bcce154c4 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/StaleDevices.java @@ -0,0 +1,21 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.internal.push; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; + +public class StaleDevices { + + @JsonProperty + private List staleDevices; + + public List getStaleDevices() { + return staleDevices; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/exceptions/MismatchedDevicesException.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/exceptions/MismatchedDevicesException.java new file mode 100644 index 000000000..31a06266d --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/exceptions/MismatchedDevicesException.java @@ -0,0 +1,23 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.internal.push.exceptions; + +import org.session.libsignal.service.api.push.exceptions.NonSuccessfulResponseCodeException; +import org.session.libsignal.service.internal.push.MismatchedDevices; + +public class MismatchedDevicesException extends NonSuccessfulResponseCodeException { + + private final MismatchedDevices mismatchedDevices; + + public MismatchedDevicesException(MismatchedDevices mismatchedDevices) { + this.mismatchedDevices = mismatchedDevices; + } + + public MismatchedDevices getMismatchedDevices() { + return mismatchedDevices; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/exceptions/StaleDevicesException.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/exceptions/StaleDevicesException.java new file mode 100644 index 000000000..ea1c9efdc --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/exceptions/StaleDevicesException.java @@ -0,0 +1,23 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.internal.push.exceptions; + +import org.session.libsignal.service.api.push.exceptions.NonSuccessfulResponseCodeException; +import org.session.libsignal.service.internal.push.StaleDevices; + +public class StaleDevicesException extends NonSuccessfulResponseCodeException { + + private final StaleDevices staleDevices; + + public StaleDevicesException(StaleDevices staleDevices) { + this.staleDevices = staleDevices; + } + + public StaleDevices getStaleDevices() { + return staleDevices; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/http/AttachmentCipherOutputStreamFactory.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/http/AttachmentCipherOutputStreamFactory.java new file mode 100644 index 000000000..c6137962c --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/http/AttachmentCipherOutputStreamFactory.java @@ -0,0 +1,23 @@ +package org.session.libsignal.service.internal.push.http; + + +import org.session.libsignal.service.api.crypto.AttachmentCipherOutputStream; +import org.session.libsignal.service.api.crypto.DigestingOutputStream; + +import java.io.IOException; +import java.io.OutputStream; + +public class AttachmentCipherOutputStreamFactory implements OutputStreamFactory { + + private final byte[] key; + + public AttachmentCipherOutputStreamFactory(byte[] key) { + this.key = key; + } + + @Override + public DigestingOutputStream createFor(OutputStream wrap) throws IOException { + return new AttachmentCipherOutputStream(key, wrap); + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/http/DigestingRequestBody.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/http/DigestingRequestBody.java new file mode 100644 index 000000000..904fe31d2 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/http/DigestingRequestBody.java @@ -0,0 +1,71 @@ +package org.session.libsignal.service.internal.push.http; + + +import org.session.libsignal.service.api.crypto.DigestingOutputStream; +import org.session.libsignal.service.api.messages.SignalServiceAttachment.ProgressListener; + +import java.io.IOException; +import java.io.InputStream; + +import okhttp3.MediaType; +import okhttp3.RequestBody; +import okio.BufferedSink; + +public class DigestingRequestBody extends RequestBody { + + private final InputStream inputStream; + private final OutputStreamFactory outputStreamFactory; + private final String contentType; + private final long contentLength; + private final ProgressListener progressListener; + + private byte[] digest; + + public DigestingRequestBody(InputStream inputStream, + OutputStreamFactory outputStreamFactory, + String contentType, long contentLength, + ProgressListener progressListener) + { + this.inputStream = inputStream; + this.outputStreamFactory = outputStreamFactory; + this.contentType = contentType; + this.contentLength = contentLength; + this.progressListener = progressListener; + } + + @Override + public MediaType contentType() { + return MediaType.parse(contentType); + } + + @Override + public void writeTo(BufferedSink sink) throws IOException { + DigestingOutputStream outputStream = outputStreamFactory.createFor(sink.outputStream()); + byte[] buffer = new byte[8192]; + + int read; + long total = 0; + + while ((read = inputStream.read(buffer, 0, buffer.length)) != -1) { + outputStream.write(buffer, 0, read); + total += read; + + if (progressListener != null) { + progressListener.onAttachmentProgress(contentLength, total); + } + } + + outputStream.flush(); + digest = outputStream.getTransmittedDigest(); + } + + @Override + public long contentLength() { + if (contentLength > 0) return contentLength; + else return -1; + } + + public byte[] getTransmittedDigest() { + return digest; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/http/OutputStreamFactory.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/http/OutputStreamFactory.java new file mode 100644 index 000000000..9e68793fc --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/http/OutputStreamFactory.java @@ -0,0 +1,13 @@ +package org.session.libsignal.service.internal.push.http; + + +import org.session.libsignal.service.api.crypto.DigestingOutputStream; + +import java.io.IOException; +import java.io.OutputStream; + +public interface OutputStreamFactory { + + public DigestingOutputStream createFor(OutputStream wrap) throws IOException; + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/push/http/ProfileCipherOutputStreamFactory.java b/libsignal/src/main/java/org/session/libsignal/service/internal/push/http/ProfileCipherOutputStreamFactory.java new file mode 100644 index 000000000..962146dcf --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/push/http/ProfileCipherOutputStreamFactory.java @@ -0,0 +1,23 @@ +package org.session.libsignal.service.internal.push.http; + + +import org.session.libsignal.service.api.crypto.DigestingOutputStream; +import org.session.libsignal.service.api.crypto.ProfileCipherOutputStream; + +import java.io.IOException; +import java.io.OutputStream; + +public class ProfileCipherOutputStreamFactory implements OutputStreamFactory { + + private final byte[] key; + + public ProfileCipherOutputStreamFactory(byte[] key) { + this.key = key; + } + + @Override + public DigestingOutputStream createFor(OutputStream wrap) throws IOException { + return new ProfileCipherOutputStream(wrap, key); + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/sticker/StickerProtos.java b/libsignal/src/main/java/org/session/libsignal/service/internal/sticker/StickerProtos.java new file mode 100644 index 000000000..295d1587d --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/sticker/StickerProtos.java @@ -0,0 +1,1798 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: StickerResources.proto + +package org.session.libsignal.service.internal.sticker; + +public final class StickerProtos { + private StickerProtos() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + } + public interface PackOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional string title = 1; + /** + * optional string title = 1; + */ + boolean hasTitle(); + /** + * optional string title = 1; + */ + String getTitle(); + /** + * optional string title = 1; + */ + com.google.protobuf.ByteString + getTitleBytes(); + + // optional string author = 2; + /** + * optional string author = 2; + */ + boolean hasAuthor(); + /** + * optional string author = 2; + */ + String getAuthor(); + /** + * optional string author = 2; + */ + com.google.protobuf.ByteString + getAuthorBytes(); + + // optional .signalservice.Pack.Sticker cover = 3; + /** + * optional .signalservice.Pack.Sticker cover = 3; + */ + boolean hasCover(); + /** + * optional .signalservice.Pack.Sticker cover = 3; + */ + org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker getCover(); + /** + * optional .signalservice.Pack.Sticker cover = 3; + */ + org.session.libsignal.service.internal.sticker.StickerProtos.Pack.StickerOrBuilder getCoverOrBuilder(); + + // repeated .signalservice.Pack.Sticker stickers = 4; + /** + * repeated .signalservice.Pack.Sticker stickers = 4; + */ + java.util.List + getStickersList(); + /** + * repeated .signalservice.Pack.Sticker stickers = 4; + */ + org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker getStickers(int index); + /** + * repeated .signalservice.Pack.Sticker stickers = 4; + */ + int getStickersCount(); + /** + * repeated .signalservice.Pack.Sticker stickers = 4; + */ + java.util.List + getStickersOrBuilderList(); + /** + * repeated .signalservice.Pack.Sticker stickers = 4; + */ + org.session.libsignal.service.internal.sticker.StickerProtos.Pack.StickerOrBuilder getStickersOrBuilder( + int index); + } + /** + * Protobuf type {@code signalservice.Pack} + */ + public static final class Pack extends + com.google.protobuf.GeneratedMessage + implements PackOrBuilder { + // Use Pack.newBuilder() to construct. + private Pack(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Pack(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Pack defaultInstance; + public static Pack getDefaultInstance() { + return defaultInstance; + } + + public Pack getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Pack( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + title_ = input.readBytes(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + author_ = input.readBytes(); + break; + } + case 26: { + org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.Builder subBuilder = null; + if (((bitField0_ & 0x00000004) == 0x00000004)) { + subBuilder = cover_.toBuilder(); + } + cover_ = input.readMessage(org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(cover_); + cover_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000004; + break; + } + case 34: { + if (!((mutable_bitField0_ & 0x00000008) == 0x00000008)) { + stickers_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000008; + } + stickers_.add(input.readMessage(org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.PARSER, extensionRegistry)); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000008) == 0x00000008)) { + stickers_ = java.util.Collections.unmodifiableList(stickers_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.sticker.StickerProtos.internal_static_signalservice_Pack_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.sticker.StickerProtos.internal_static_signalservice_Pack_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.sticker.StickerProtos.Pack.class, org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Pack parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Pack(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + public interface StickerOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional uint32 id = 1; + /** + * optional uint32 id = 1; + */ + boolean hasId(); + /** + * optional uint32 id = 1; + */ + int getId(); + + // optional string emoji = 2; + /** + * optional string emoji = 2; + */ + boolean hasEmoji(); + /** + * optional string emoji = 2; + */ + String getEmoji(); + /** + * optional string emoji = 2; + */ + com.google.protobuf.ByteString + getEmojiBytes(); + } + /** + * Protobuf type {@code signalservice.Pack.Sticker} + */ + public static final class Sticker extends + com.google.protobuf.GeneratedMessage + implements StickerOrBuilder { + // Use Sticker.newBuilder() to construct. + private Sticker(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Sticker(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Sticker defaultInstance; + public static Sticker getDefaultInstance() { + return defaultInstance; + } + + public Sticker getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Sticker( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + id_ = input.readUInt32(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + emoji_ = input.readBytes(); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.sticker.StickerProtos.internal_static_signalservice_Pack_Sticker_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.sticker.StickerProtos.internal_static_signalservice_Pack_Sticker_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.class, org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Sticker parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Sticker(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional uint32 id = 1; + public static final int ID_FIELD_NUMBER = 1; + private int id_; + /** + * optional uint32 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 id = 1; + */ + public int getId() { + return id_; + } + + // optional string emoji = 2; + public static final int EMOJI_FIELD_NUMBER = 2; + private Object emoji_; + /** + * optional string emoji = 2; + */ + public boolean hasEmoji() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string emoji = 2; + */ + public String getEmoji() { + Object ref = emoji_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + emoji_ = s; + } + return s; + } + } + /** + * optional string emoji = 2; + */ + public com.google.protobuf.ByteString + getEmojiBytes() { + Object ref = emoji_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + emoji_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private void initFields() { + id_ = 0; + emoji_ = ""; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt32(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, getEmojiBytes()); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, getEmojiBytes()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.Pack.Sticker} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.sticker.StickerProtos.Pack.StickerOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.sticker.StickerProtos.internal_static_signalservice_Pack_Sticker_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.sticker.StickerProtos.internal_static_signalservice_Pack_Sticker_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.class, org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + id_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + emoji_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.sticker.StickerProtos.internal_static_signalservice_Pack_Sticker_descriptor; + } + + public org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker getDefaultInstanceForType() { + return org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker build() { + org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker buildPartial() { + org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker result = new org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.id_ = id_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.emoji_ = emoji_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker) { + return mergeFrom((org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker other) { + if (other == org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.getDefaultInstance()) return this; + if (other.hasId()) { + setId(other.getId()); + } + if (other.hasEmoji()) { + bitField0_ |= 0x00000002; + emoji_ = other.emoji_; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional uint32 id = 1; + private int id_ ; + /** + * optional uint32 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint32 id = 1; + */ + public int getId() { + return id_; + } + /** + * optional uint32 id = 1; + */ + public Builder setId(int value) { + bitField0_ |= 0x00000001; + id_ = value; + onChanged(); + return this; + } + /** + * optional uint32 id = 1; + */ + public Builder clearId() { + bitField0_ = (bitField0_ & ~0x00000001); + id_ = 0; + onChanged(); + return this; + } + + // optional string emoji = 2; + private Object emoji_ = ""; + /** + * optional string emoji = 2; + */ + public boolean hasEmoji() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string emoji = 2; + */ + public String getEmoji() { + Object ref = emoji_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + emoji_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string emoji = 2; + */ + public com.google.protobuf.ByteString + getEmojiBytes() { + Object ref = emoji_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + emoji_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string emoji = 2; + */ + public Builder setEmoji( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + emoji_ = value; + onChanged(); + return this; + } + /** + * optional string emoji = 2; + */ + public Builder clearEmoji() { + bitField0_ = (bitField0_ & ~0x00000002); + emoji_ = getDefaultInstance().getEmoji(); + onChanged(); + return this; + } + /** + * optional string emoji = 2; + */ + public Builder setEmojiBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + emoji_ = value; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.Pack.Sticker) + } + + static { + defaultInstance = new Sticker(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.Pack.Sticker) + } + + private int bitField0_; + // optional string title = 1; + public static final int TITLE_FIELD_NUMBER = 1; + private Object title_; + /** + * optional string title = 1; + */ + public boolean hasTitle() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string title = 1; + */ + public String getTitle() { + Object ref = title_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + title_ = s; + } + return s; + } + } + /** + * optional string title = 1; + */ + public com.google.protobuf.ByteString + getTitleBytes() { + Object ref = title_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + title_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional string author = 2; + public static final int AUTHOR_FIELD_NUMBER = 2; + private Object author_; + /** + * optional string author = 2; + */ + public boolean hasAuthor() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string author = 2; + */ + public String getAuthor() { + Object ref = author_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + author_ = s; + } + return s; + } + } + /** + * optional string author = 2; + */ + public com.google.protobuf.ByteString + getAuthorBytes() { + Object ref = author_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + author_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional .signalservice.Pack.Sticker cover = 3; + public static final int COVER_FIELD_NUMBER = 3; + private org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker cover_; + /** + * optional .signalservice.Pack.Sticker cover = 3; + */ + public boolean hasCover() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .signalservice.Pack.Sticker cover = 3; + */ + public org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker getCover() { + return cover_; + } + /** + * optional .signalservice.Pack.Sticker cover = 3; + */ + public org.session.libsignal.service.internal.sticker.StickerProtos.Pack.StickerOrBuilder getCoverOrBuilder() { + return cover_; + } + + // repeated .signalservice.Pack.Sticker stickers = 4; + public static final int STICKERS_FIELD_NUMBER = 4; + private java.util.List stickers_; + /** + * repeated .signalservice.Pack.Sticker stickers = 4; + */ + public java.util.List getStickersList() { + return stickers_; + } + /** + * repeated .signalservice.Pack.Sticker stickers = 4; + */ + public java.util.List + getStickersOrBuilderList() { + return stickers_; + } + /** + * repeated .signalservice.Pack.Sticker stickers = 4; + */ + public int getStickersCount() { + return stickers_.size(); + } + /** + * repeated .signalservice.Pack.Sticker stickers = 4; + */ + public org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker getStickers(int index) { + return stickers_.get(index); + } + /** + * repeated .signalservice.Pack.Sticker stickers = 4; + */ + public org.session.libsignal.service.internal.sticker.StickerProtos.Pack.StickerOrBuilder getStickersOrBuilder( + int index) { + return stickers_.get(index); + } + + private void initFields() { + title_ = ""; + author_ = ""; + cover_ = org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.getDefaultInstance(); + stickers_ = java.util.Collections.emptyList(); + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getTitleBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, getAuthorBytes()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeMessage(3, cover_); + } + for (int i = 0; i < stickers_.size(); i++) { + output.writeMessage(4, stickers_.get(i)); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getTitleBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, getAuthorBytes()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, cover_); + } + for (int i = 0; i < stickers_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(4, stickers_.get(i)); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.sticker.StickerProtos.Pack parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.sticker.StickerProtos.Pack parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.sticker.StickerProtos.Pack parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.sticker.StickerProtos.Pack parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.sticker.StickerProtos.Pack parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.sticker.StickerProtos.Pack parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.sticker.StickerProtos.Pack parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.sticker.StickerProtos.Pack parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.sticker.StickerProtos.Pack parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.sticker.StickerProtos.Pack parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.sticker.StickerProtos.Pack prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.Pack} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.sticker.StickerProtos.PackOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.sticker.StickerProtos.internal_static_signalservice_Pack_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.sticker.StickerProtos.internal_static_signalservice_Pack_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.sticker.StickerProtos.Pack.class, org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.sticker.StickerProtos.Pack.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getCoverFieldBuilder(); + getStickersFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + title_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + author_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + if (coverBuilder_ == null) { + cover_ = org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.getDefaultInstance(); + } else { + coverBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + if (stickersBuilder_ == null) { + stickers_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000008); + } else { + stickersBuilder_.clear(); + } + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.sticker.StickerProtos.internal_static_signalservice_Pack_descriptor; + } + + public org.session.libsignal.service.internal.sticker.StickerProtos.Pack getDefaultInstanceForType() { + return org.session.libsignal.service.internal.sticker.StickerProtos.Pack.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.sticker.StickerProtos.Pack build() { + org.session.libsignal.service.internal.sticker.StickerProtos.Pack result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.sticker.StickerProtos.Pack buildPartial() { + org.session.libsignal.service.internal.sticker.StickerProtos.Pack result = new org.session.libsignal.service.internal.sticker.StickerProtos.Pack(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.title_ = title_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.author_ = author_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + if (coverBuilder_ == null) { + result.cover_ = cover_; + } else { + result.cover_ = coverBuilder_.build(); + } + if (stickersBuilder_ == null) { + if (((bitField0_ & 0x00000008) == 0x00000008)) { + stickers_ = java.util.Collections.unmodifiableList(stickers_); + bitField0_ = (bitField0_ & ~0x00000008); + } + result.stickers_ = stickers_; + } else { + result.stickers_ = stickersBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.sticker.StickerProtos.Pack) { + return mergeFrom((org.session.libsignal.service.internal.sticker.StickerProtos.Pack)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.sticker.StickerProtos.Pack other) { + if (other == org.session.libsignal.service.internal.sticker.StickerProtos.Pack.getDefaultInstance()) return this; + if (other.hasTitle()) { + bitField0_ |= 0x00000001; + title_ = other.title_; + onChanged(); + } + if (other.hasAuthor()) { + bitField0_ |= 0x00000002; + author_ = other.author_; + onChanged(); + } + if (other.hasCover()) { + mergeCover(other.getCover()); + } + if (stickersBuilder_ == null) { + if (!other.stickers_.isEmpty()) { + if (stickers_.isEmpty()) { + stickers_ = other.stickers_; + bitField0_ = (bitField0_ & ~0x00000008); + } else { + ensureStickersIsMutable(); + stickers_.addAll(other.stickers_); + } + onChanged(); + } + } else { + if (!other.stickers_.isEmpty()) { + if (stickersBuilder_.isEmpty()) { + stickersBuilder_.dispose(); + stickersBuilder_ = null; + stickers_ = other.stickers_; + bitField0_ = (bitField0_ & ~0x00000008); + stickersBuilder_ = + com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ? + getStickersFieldBuilder() : null; + } else { + stickersBuilder_.addAllMessages(other.stickers_); + } + } + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.sticker.StickerProtos.Pack parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.sticker.StickerProtos.Pack) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional string title = 1; + private Object title_ = ""; + /** + * optional string title = 1; + */ + public boolean hasTitle() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string title = 1; + */ + public String getTitle() { + Object ref = title_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + title_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string title = 1; + */ + public com.google.protobuf.ByteString + getTitleBytes() { + Object ref = title_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + title_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string title = 1; + */ + public Builder setTitle( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + title_ = value; + onChanged(); + return this; + } + /** + * optional string title = 1; + */ + public Builder clearTitle() { + bitField0_ = (bitField0_ & ~0x00000001); + title_ = getDefaultInstance().getTitle(); + onChanged(); + return this; + } + /** + * optional string title = 1; + */ + public Builder setTitleBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + title_ = value; + onChanged(); + return this; + } + + // optional string author = 2; + private Object author_ = ""; + /** + * optional string author = 2; + */ + public boolean hasAuthor() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string author = 2; + */ + public String getAuthor() { + Object ref = author_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + author_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string author = 2; + */ + public com.google.protobuf.ByteString + getAuthorBytes() { + Object ref = author_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + author_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string author = 2; + */ + public Builder setAuthor( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + author_ = value; + onChanged(); + return this; + } + /** + * optional string author = 2; + */ + public Builder clearAuthor() { + bitField0_ = (bitField0_ & ~0x00000002); + author_ = getDefaultInstance().getAuthor(); + onChanged(); + return this; + } + /** + * optional string author = 2; + */ + public Builder setAuthorBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + author_ = value; + onChanged(); + return this; + } + + // optional .signalservice.Pack.Sticker cover = 3; + private org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker cover_ = org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker, org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.Builder, org.session.libsignal.service.internal.sticker.StickerProtos.Pack.StickerOrBuilder> coverBuilder_; + /** + * optional .signalservice.Pack.Sticker cover = 3; + */ + public boolean hasCover() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .signalservice.Pack.Sticker cover = 3; + */ + public org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker getCover() { + if (coverBuilder_ == null) { + return cover_; + } else { + return coverBuilder_.getMessage(); + } + } + /** + * optional .signalservice.Pack.Sticker cover = 3; + */ + public Builder setCover(org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker value) { + if (coverBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + cover_ = value; + onChanged(); + } else { + coverBuilder_.setMessage(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .signalservice.Pack.Sticker cover = 3; + */ + public Builder setCover( + org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.Builder builderForValue) { + if (coverBuilder_ == null) { + cover_ = builderForValue.build(); + onChanged(); + } else { + coverBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .signalservice.Pack.Sticker cover = 3; + */ + public Builder mergeCover(org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker value) { + if (coverBuilder_ == null) { + if (((bitField0_ & 0x00000004) == 0x00000004) && + cover_ != org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.getDefaultInstance()) { + cover_ = + org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.newBuilder(cover_).mergeFrom(value).buildPartial(); + } else { + cover_ = value; + } + onChanged(); + } else { + coverBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .signalservice.Pack.Sticker cover = 3; + */ + public Builder clearCover() { + if (coverBuilder_ == null) { + cover_ = org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.getDefaultInstance(); + onChanged(); + } else { + coverBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + /** + * optional .signalservice.Pack.Sticker cover = 3; + */ + public org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.Builder getCoverBuilder() { + bitField0_ |= 0x00000004; + onChanged(); + return getCoverFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.Pack.Sticker cover = 3; + */ + public org.session.libsignal.service.internal.sticker.StickerProtos.Pack.StickerOrBuilder getCoverOrBuilder() { + if (coverBuilder_ != null) { + return coverBuilder_.getMessageOrBuilder(); + } else { + return cover_; + } + } + /** + * optional .signalservice.Pack.Sticker cover = 3; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker, org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.Builder, org.session.libsignal.service.internal.sticker.StickerProtos.Pack.StickerOrBuilder> + getCoverFieldBuilder() { + if (coverBuilder_ == null) { + coverBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker, org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.Builder, org.session.libsignal.service.internal.sticker.StickerProtos.Pack.StickerOrBuilder>( + cover_, + getParentForChildren(), + isClean()); + cover_ = null; + } + return coverBuilder_; + } + + // repeated .signalservice.Pack.Sticker stickers = 4; + private java.util.List stickers_ = + java.util.Collections.emptyList(); + private void ensureStickersIsMutable() { + if (!((bitField0_ & 0x00000008) == 0x00000008)) { + stickers_ = new java.util.ArrayList(stickers_); + bitField0_ |= 0x00000008; + } + } + + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker, org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.Builder, org.session.libsignal.service.internal.sticker.StickerProtos.Pack.StickerOrBuilder> stickersBuilder_; + + /** + * repeated .signalservice.Pack.Sticker stickers = 4; + */ + public java.util.List getStickersList() { + if (stickersBuilder_ == null) { + return java.util.Collections.unmodifiableList(stickers_); + } else { + return stickersBuilder_.getMessageList(); + } + } + /** + * repeated .signalservice.Pack.Sticker stickers = 4; + */ + public int getStickersCount() { + if (stickersBuilder_ == null) { + return stickers_.size(); + } else { + return stickersBuilder_.getCount(); + } + } + /** + * repeated .signalservice.Pack.Sticker stickers = 4; + */ + public org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker getStickers(int index) { + if (stickersBuilder_ == null) { + return stickers_.get(index); + } else { + return stickersBuilder_.getMessage(index); + } + } + /** + * repeated .signalservice.Pack.Sticker stickers = 4; + */ + public Builder setStickers( + int index, org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker value) { + if (stickersBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureStickersIsMutable(); + stickers_.set(index, value); + onChanged(); + } else { + stickersBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .signalservice.Pack.Sticker stickers = 4; + */ + public Builder setStickers( + int index, org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.Builder builderForValue) { + if (stickersBuilder_ == null) { + ensureStickersIsMutable(); + stickers_.set(index, builderForValue.build()); + onChanged(); + } else { + stickersBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.Pack.Sticker stickers = 4; + */ + public Builder addStickers(org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker value) { + if (stickersBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureStickersIsMutable(); + stickers_.add(value); + onChanged(); + } else { + stickersBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .signalservice.Pack.Sticker stickers = 4; + */ + public Builder addStickers( + int index, org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker value) { + if (stickersBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureStickersIsMutable(); + stickers_.add(index, value); + onChanged(); + } else { + stickersBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .signalservice.Pack.Sticker stickers = 4; + */ + public Builder addStickers( + org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.Builder builderForValue) { + if (stickersBuilder_ == null) { + ensureStickersIsMutable(); + stickers_.add(builderForValue.build()); + onChanged(); + } else { + stickersBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.Pack.Sticker stickers = 4; + */ + public Builder addStickers( + int index, org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.Builder builderForValue) { + if (stickersBuilder_ == null) { + ensureStickersIsMutable(); + stickers_.add(index, builderForValue.build()); + onChanged(); + } else { + stickersBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .signalservice.Pack.Sticker stickers = 4; + */ + public Builder addAllStickers( + Iterable values) { + if (stickersBuilder_ == null) { + ensureStickersIsMutable(); + super.addAll(values, stickers_); + onChanged(); + } else { + stickersBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .signalservice.Pack.Sticker stickers = 4; + */ + public Builder clearStickers() { + if (stickersBuilder_ == null) { + stickers_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000008); + onChanged(); + } else { + stickersBuilder_.clear(); + } + return this; + } + /** + * repeated .signalservice.Pack.Sticker stickers = 4; + */ + public Builder removeStickers(int index) { + if (stickersBuilder_ == null) { + ensureStickersIsMutable(); + stickers_.remove(index); + onChanged(); + } else { + stickersBuilder_.remove(index); + } + return this; + } + /** + * repeated .signalservice.Pack.Sticker stickers = 4; + */ + public org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.Builder getStickersBuilder( + int index) { + return getStickersFieldBuilder().getBuilder(index); + } + /** + * repeated .signalservice.Pack.Sticker stickers = 4; + */ + public org.session.libsignal.service.internal.sticker.StickerProtos.Pack.StickerOrBuilder getStickersOrBuilder( + int index) { + if (stickersBuilder_ == null) { + return stickers_.get(index); } else { + return stickersBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .signalservice.Pack.Sticker stickers = 4; + */ + public java.util.List + getStickersOrBuilderList() { + if (stickersBuilder_ != null) { + return stickersBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(stickers_); + } + } + /** + * repeated .signalservice.Pack.Sticker stickers = 4; + */ + public org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.Builder addStickersBuilder() { + return getStickersFieldBuilder().addBuilder( + org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.getDefaultInstance()); + } + /** + * repeated .signalservice.Pack.Sticker stickers = 4; + */ + public org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.Builder addStickersBuilder( + int index) { + return getStickersFieldBuilder().addBuilder( + index, org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.getDefaultInstance()); + } + /** + * repeated .signalservice.Pack.Sticker stickers = 4; + */ + public java.util.List + getStickersBuilderList() { + return getStickersFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker, org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.Builder, org.session.libsignal.service.internal.sticker.StickerProtos.Pack.StickerOrBuilder> + getStickersFieldBuilder() { + if (stickersBuilder_ == null) { + stickersBuilder_ = new com.google.protobuf.RepeatedFieldBuilder< + org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker, org.session.libsignal.service.internal.sticker.StickerProtos.Pack.Sticker.Builder, org.session.libsignal.service.internal.sticker.StickerProtos.Pack.StickerOrBuilder>( + stickers_, + ((bitField0_ & 0x00000008) == 0x00000008), + getParentForChildren(), + isClean()); + stickers_ = null; + } + return stickersBuilder_; + } + + // @@protoc_insertion_point(builder_scope:signalservice.Pack) + } + + static { + defaultInstance = new Pack(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.Pack) + } + + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_Pack_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_Pack_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_Pack_Sticker_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_Pack_Sticker_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + String[] descriptorData = { + "\n\026StickerResources.proto\022\rsignalservice\"" + + "\246\001\n\004Pack\022\r\n\005title\030\001 \001(\t\022\016\n\006author\030\002 \001(\t\022" + + "*\n\005cover\030\003 \001(\0132\033.signalservice.Pack.Stic" + + "ker\022-\n\010stickers\030\004 \003(\0132\033.signalservice.Pa" + + "ck.Sticker\032$\n\007Sticker\022\n\n\002id\030\001 \001(\r\022\r\n\005emo" + + "ji\030\002 \001(\tBB\n1org.whispersystems.signalser" + + "vice.internal.stickerB\rStickerProtos" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + internal_static_signalservice_Pack_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_signalservice_Pack_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_Pack_descriptor, + new String[] { "Title", "Author", "Cover", "Stickers", }); + internal_static_signalservice_Pack_Sticker_descriptor = + internal_static_signalservice_Pack_descriptor.getNestedTypes().get(0); + internal_static_signalservice_Pack_Sticker_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_Pack_Sticker_descriptor, + new String[] { "Id", "Emoji", }); + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/util/Base64.java b/libsignal/src/main/java/org/session/libsignal/service/internal/util/Base64.java new file mode 100644 index 000000000..2ea81ae9b --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/util/Base64.java @@ -0,0 +1,2096 @@ +package org.session.libsignal.service.internal.util; + +/** + *

Encodes and decodes to and from Base64 notation.

+ *

Homepage: http://iharder.net/base64.

+ * + *

Example:

+ * + * String encoded = Base64.encode( myByteArray ); + *
+ * byte[] myByteArray = Base64.decode( encoded ); + * + *

The options parameter, which appears in a few places, is used to pass + * several pieces of information to the encoder. In the "higher level" methods such as + * encodeBytes( bytes, options ) the options parameter can be used to indicate such + * things as first gzipping the bytes before encoding them, not inserting linefeeds, + * and encoding using the URL-safe and Ordered dialects.

+ * + *

Note, according to RFC3548, + * Section 2.1, implementations should not add line feeds unless explicitly told + * to do so. I've got Base64 set to this behavior now, although earlier versions + * broke lines by default.

+ * + *

The constants defined in Base64 can be OR-ed together to combine options, so you + * might make a call like this:

+ * + * String encoded = Base64.encodeBytes( mybytes, Base64.GZIP | Base64.DO_BREAK_LINES ); + *

to compress the data before encoding it and then making the output have newline characters.

+ *

Also...

+ * String encoded = Base64.encodeBytes( crazyString.getBytes() ); + * + * + * + *

+ * Change Log: + *

+ *
    + *
  • v2.3.4 - Fixed bug when working with gzipped streams whereby flushing + * the Base64.OutputStream closed the Base64 encoding (by padding with equals + * signs) too soon. Also added an option to suppress the automatic decoding + * of gzipped streams. Also added experimental support for specifying a + * class loader when using the + * {@link #decodeToObject(String, int, ClassLoader)} + * method.
  • + *
  • v2.3.3 - Changed default char encoding to US-ASCII which reduces the internal Java + * footprint with its CharEncoders and so forth. Fixed some javadocs that were + * inconsistent. Removed imports and specified things like java.io.IOException + * explicitly inline.
  • + *
  • v2.3.2 - Reduced memory footprint! Finally refined the "guessing" of how big the + * final encoded data will be so that the code doesn't have to create two output + * arrays: an oversized initial one and then a final, exact-sized one. Big win + * when using the {@link #encodeBytesToBytes(byte[])} family of methods (and not + * using the gzip options which uses a different mechanism with streams and stuff).
  • + *
  • v2.3.1 - Added {@link #encodeBytesToBytes(byte[], int, int, int)} and some + * similar helper methods to be more efficient with memory by not returning a + * String but just a byte array.
  • + *
  • v2.3 - This is not a drop-in replacement! This is two years of comments + * and bug fixes queued up and finally executed. Thanks to everyone who sent + * me stuff, and I'm sorry I wasn't able to distribute your fixes to everyone else. + * Much bad coding was cleaned up including throwing exceptions where necessary + * instead of returning null values or something similar. Here are some changes + * that may affect you: + *
      + *
    • Does not break lines, by default. This is to keep in compliance with + * RFC3548.
    • + *
    • Throws exceptions instead of returning null values. Because some operations + * (especially those that may permit the GZIP option) use IO streams, there + * is a possiblity of an java.io.IOException being thrown. After some discussion and + * thought, I've changed the behavior of the methods to throw java.io.IOExceptions + * rather than return null if ever there's an error. I think this is more + * appropriate, though it will require some changes to your code. Sorry, + * it should have been done this way to begin with.
    • + *
    • Removed all references to System.out, System.err, and the like. + * Shame on me. All I can say is sorry they were ever there.
    • + *
    • Throws NullPointerExceptions and IllegalArgumentExceptions as needed + * such as when passed arrays are null or offsets are invalid.
    • + *
    • Cleaned up as much javadoc as I could to avoid any javadoc warnings. + * This was especially annoying before for people who were thorough in their + * own projects and then had gobs of javadoc warnings on this file.
    • + *
    + *
  • v2.2.1 - Fixed bug using URL_SAFE and ORDERED encodings. Fixed bug + * when using very small files (~< 40 bytes).
  • + *
  • v2.2 - Added some helper methods for encoding/decoding directly from + * one file to the next. Also added a main() method to support command line + * encoding/decoding from one file to the next. Also added these Base64 dialects: + *
      + *
    1. The default is RFC3548 format.
    2. + *
    3. Calling Base64.setFormat(Base64.BASE64_FORMAT.URLSAFE_FORMAT) generates + * URL and file name friendly format as described in Section 4 of RFC3548. + * http://www.faqs.org/rfcs/rfc3548.html
    4. + *
    5. Calling Base64.setFormat(Base64.BASE64_FORMAT.ORDERED_FORMAT) generates + * URL and file name friendly format that preserves lexical ordering as described + * in http://www.faqs.org/qa/rfcc-1940.html
    6. + *
    + * Special thanks to Jim Kellerman at http://www.powerset.com/ + * for contributing the new Base64 dialects. + *
  • + * + *
  • v2.1 - Cleaned up javadoc comments and unused variables and methods. Added + * some convenience methods for reading and writing to and from files.
  • + *
  • v2.0.2 - Now specifies UTF-8 encoding in places where the code fails on systems + * with other encodings (like EBCDIC).
  • + *
  • v2.0.1 - Fixed an error when decoding a single byte, that is, when the + * encoded data was a single byte.
  • + *
  • v2.0 - I got rid of methods that used booleans to set options. + * Now everything is more consolidated and cleaner. The code now detects + * when data that's being decoded is gzip-compressed and will decompress it + * automatically. Generally things are cleaner. You'll probably have to + * change some method calls that you were making to support the new + * options format (ints that you "OR" together).
  • + *
  • v1.5.1 - Fixed bug when decompressing and decoding to a + * byte[] using decode( String s, boolean gzipCompressed ). + * Added the ability to "suspend" encoding in the Output Stream so + * you can turn on and off the encoding if you need to embed base64 + * data in an otherwise "normal" stream (like an XML file).
  • + *
  • v1.5 - Output stream pases on flush() command but doesn't do anything itself. + * This helps when using GZIP streams. + * Added the ability to GZip-compress objects before encoding them.
  • + *
  • v1.4 - Added helper methods to read/write files.
  • + *
  • v1.3.6 - Fixed OutputStream.flush() so that 'position' is reset.
  • + *
  • v1.3.5 - Added flag to turn on and off line breaks. Fixed bug in input stream + * where last buffer being read, if not completely full, was not returned.
  • + *
  • v1.3.4 - Fixed when "improperly padded stream" error was thrown at the wrong time.
  • + *
  • v1.3.3 - Fixed I/O streams which were totally messed up.
  • + *
+ * + *

+ * I am placing this code in the Public Domain. Do with it as you will. + * This software comes with no guarantees or warranties but with + * plenty of well-wishing instead! + * Please visit http://iharder.net/base64 + * periodically to check for updates or to contribute improvements. + *

+ * + * @author Robert Harder + * @author rob@iharder.net + * @version 2.3.3 + */ +public class Base64 +{ + +/* ******** P U B L I C F I E L D S ******** */ + + + /** No options specified. Value is zero. */ + public final static int NO_OPTIONS = 0; + + /** Specify encoding in first bit. Value is one. */ + public final static int ENCODE = 1; + + + /** Specify decoding in first bit. Value is zero. */ + public final static int DECODE = 0; + + + /** Specify that data should be gzip-compressed in second bit. Value is two. */ + public final static int GZIP = 2; + + /** Specify that gzipped data should not be automatically gunzipped. */ + public final static int DONT_GUNZIP = 4; + + + /** Do break lines when encoding. Value is 8. */ + public final static int DO_BREAK_LINES = 8; + + /** + * Encode using Base64-like encoding that is URL- and Filename-safe as described + * in Section 4 of RFC3548: + * http://www.faqs.org/rfcs/rfc3548.html. + * It is important to note that data encoded this way is not officially valid Base64, + * or at the very least should not be called Base64 without also specifying that is + * was encoded using the URL- and Filename-safe dialect. + */ + public final static int URL_SAFE = 16; + + + /** + * Encode using the special "ordered" dialect of Base64 described here: + * http://www.faqs.org/qa/rfcc-1940.html. + */ + public final static int ORDERED = 32; + + +/* ******** P R I V A T E F I E L D S ******** */ + + + /** Maximum line length (76) of Base64 output. */ + private final static int MAX_LINE_LENGTH = 76; + + + /** The equals sign (=) as a byte. */ + private final static byte EQUALS_SIGN = (byte)'='; + + + /** The new line character (\n) as a byte. */ + private final static byte NEW_LINE = (byte)'\n'; + + + /** Preferred encoding. */ + private final static String PREFERRED_ENCODING = "US-ASCII"; + + + private final static byte WHITE_SPACE_ENC = -5; // Indicates white space in encoding + private final static byte EQUALS_SIGN_ENC = -1; // Indicates equals sign in encoding + + +/* ******** S T A N D A R D B A S E 6 4 A L P H A B E T ******** */ + + /** The 64 valid Base64 values. */ + /* Host platform me be something funny like EBCDIC, so we hardcode these values. */ + private final static byte[] _STANDARD_ALPHABET = { + (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', (byte)'G', + (byte)'H', (byte)'I', (byte)'J', (byte)'K', (byte)'L', (byte)'M', (byte)'N', + (byte)'O', (byte)'P', (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U', + (byte)'V', (byte)'W', (byte)'X', (byte)'Y', (byte)'Z', + (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g', + (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n', + (byte)'o', (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t', (byte)'u', + (byte)'v', (byte)'w', (byte)'x', (byte)'y', (byte)'z', + (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', + (byte)'6', (byte)'7', (byte)'8', (byte)'9', (byte)'+', (byte)'/' + }; + + + /** + * Translates a Base64 value to either its 6-bit reconstruction value + * or a negative number indicating some other meaning. + **/ + private final static byte[] _STANDARD_DECODABET = { + -9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 0 - 8 + -5,-5, // Whitespace: Tab and Linefeed + -9,-9, // Decimal 11 - 12 + -5, // Whitespace: Carriage Return + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 14 - 26 + -9,-9,-9,-9,-9, // Decimal 27 - 31 + -5, // Whitespace: Space + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 33 - 42 + 62, // Plus sign at decimal 43 + -9,-9,-9, // Decimal 44 - 46 + 63, // Slash at decimal 47 + 52,53,54,55,56,57,58,59,60,61, // Numbers zero through nine + -9,-9,-9, // Decimal 58 - 60 + -1, // Equals sign at decimal 61 + -9,-9,-9, // Decimal 62 - 64 + 0,1,2,3,4,5,6,7,8,9,10,11,12,13, // Letters 'A' through 'N' + 14,15,16,17,18,19,20,21,22,23,24,25, // Letters 'O' through 'Z' + -9,-9,-9,-9,-9,-9, // Decimal 91 - 96 + 26,27,28,29,30,31,32,33,34,35,36,37,38, // Letters 'a' through 'm' + 39,40,41,42,43,44,45,46,47,48,49,50,51, // Letters 'n' through 'z' + -9,-9,-9,-9 // Decimal 123 - 126 + /*,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 127 - 139 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 */ + }; + + +/* ******** U R L S A F E B A S E 6 4 A L P H A B E T ******** */ + + /** + * Used in the URL- and Filename-safe dialect described in Section 4 of RFC3548: + * http://www.faqs.org/rfcs/rfc3548.html. + * Notice that the last two bytes become "hyphen" and "underscore" instead of "plus" and "slash." + */ + private final static byte[] _URL_SAFE_ALPHABET = { + (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', (byte)'G', + (byte)'H', (byte)'I', (byte)'J', (byte)'K', (byte)'L', (byte)'M', (byte)'N', + (byte)'O', (byte)'P', (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U', + (byte)'V', (byte)'W', (byte)'X', (byte)'Y', (byte)'Z', + (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g', + (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n', + (byte)'o', (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t', (byte)'u', + (byte)'v', (byte)'w', (byte)'x', (byte)'y', (byte)'z', + (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', + (byte)'6', (byte)'7', (byte)'8', (byte)'9', (byte)'-', (byte)'_' + }; + + /** + * Used in decoding URL- and Filename-safe dialects of Base64. + */ + private final static byte[] _URL_SAFE_DECODABET = { + -9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 0 - 8 + -5,-5, // Whitespace: Tab and Linefeed + -9,-9, // Decimal 11 - 12 + -5, // Whitespace: Carriage Return + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 14 - 26 + -9,-9,-9,-9,-9, // Decimal 27 - 31 + -5, // Whitespace: Space + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 33 - 42 + -9, // Plus sign at decimal 43 + -9, // Decimal 44 + 62, // Minus sign at decimal 45 + -9, // Decimal 46 + -9, // Slash at decimal 47 + 52,53,54,55,56,57,58,59,60,61, // Numbers zero through nine + -9,-9,-9, // Decimal 58 - 60 + -1, // Equals sign at decimal 61 + -9,-9,-9, // Decimal 62 - 64 + 0,1,2,3,4,5,6,7,8,9,10,11,12,13, // Letters 'A' through 'N' + 14,15,16,17,18,19,20,21,22,23,24,25, // Letters 'O' through 'Z' + -9,-9,-9,-9, // Decimal 91 - 94 + 63, // Underscore at decimal 95 + -9, // Decimal 96 + 26,27,28,29,30,31,32,33,34,35,36,37,38, // Letters 'a' through 'm' + 39,40,41,42,43,44,45,46,47,48,49,50,51, // Letters 'n' through 'z' + -9,-9,-9,-9 // Decimal 123 - 126 + /*,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 127 - 139 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 */ + }; + + + +/* ******** O R D E R E D B A S E 6 4 A L P H A B E T ******** */ + + /** + * I don't get the point of this technique, but someone requested it, + * and it is described here: + * http://www.faqs.org/qa/rfcc-1940.html. + */ + private final static byte[] _ORDERED_ALPHABET = { + (byte)'-', + (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', + (byte)'5', (byte)'6', (byte)'7', (byte)'8', (byte)'9', + (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', (byte)'G', + (byte)'H', (byte)'I', (byte)'J', (byte)'K', (byte)'L', (byte)'M', (byte)'N', + (byte)'O', (byte)'P', (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U', + (byte)'V', (byte)'W', (byte)'X', (byte)'Y', (byte)'Z', + (byte)'_', + (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g', + (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n', + (byte)'o', (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t', (byte)'u', + (byte)'v', (byte)'w', (byte)'x', (byte)'y', (byte)'z' + }; + + /** + * Used in decoding the "ordered" dialect of Base64. + */ + private final static byte[] _ORDERED_DECODABET = { + -9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 0 - 8 + -5,-5, // Whitespace: Tab and Linefeed + -9,-9, // Decimal 11 - 12 + -5, // Whitespace: Carriage Return + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 14 - 26 + -9,-9,-9,-9,-9, // Decimal 27 - 31 + -5, // Whitespace: Space + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 33 - 42 + -9, // Plus sign at decimal 43 + -9, // Decimal 44 + 0, // Minus sign at decimal 45 + -9, // Decimal 46 + -9, // Slash at decimal 47 + 1,2,3,4,5,6,7,8,9,10, // Numbers zero through nine + -9,-9,-9, // Decimal 58 - 60 + -1, // Equals sign at decimal 61 + -9,-9,-9, // Decimal 62 - 64 + 11,12,13,14,15,16,17,18,19,20,21,22,23, // Letters 'A' through 'M' + 24,25,26,27,28,29,30,31,32,33,34,35,36, // Letters 'N' through 'Z' + -9,-9,-9,-9, // Decimal 91 - 94 + 37, // Underscore at decimal 95 + -9, // Decimal 96 + 38,39,40,41,42,43,44,45,46,47,48,49,50, // Letters 'a' through 'm' + 51,52,53,54,55,56,57,58,59,60,61,62,63, // Letters 'n' through 'z' + -9,-9,-9,-9 // Decimal 123 - 126 + /*,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 127 - 139 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 */ + }; + + +/* ******** D E T E R M I N E W H I C H A L H A B E T ******** */ + + + /** + * Returns one of the _SOMETHING_ALPHABET byte arrays depending on + * the options specified. + * It's possible, though silly, to specify ORDERED and URLSAFE + * in which case one of them will be picked, though there is + * no guarantee as to which one will be picked. + */ + private final static byte[] getAlphabet( int options ) { + if ((options & URL_SAFE) == URL_SAFE) { + return _URL_SAFE_ALPHABET; + } else if ((options & ORDERED) == ORDERED) { + return _ORDERED_ALPHABET; + } else { + return _STANDARD_ALPHABET; + } + } // end getAlphabet + + + /** + * Returns one of the _SOMETHING_DECODABET byte arrays depending on + * the options specified. + * It's possible, though silly, to specify ORDERED and URL_SAFE + * in which case one of them will be picked, though there is + * no guarantee as to which one will be picked. + */ + private final static byte[] getDecodabet( int options ) { + if( (options & URL_SAFE) == URL_SAFE) { + return _URL_SAFE_DECODABET; + } else if ((options & ORDERED) == ORDERED) { + return _ORDERED_DECODABET; + } else { + return _STANDARD_DECODABET; + } + } // end getAlphabet + + + + /** Defeats instantiation. */ + private Base64(){} + + + + public static int getEncodedLengthWithoutPadding(int unencodedLength) { + int remainderBytes = unencodedLength % 3; + int paddingBytes = 0; + + if (remainderBytes != 0) + paddingBytes = 3 - remainderBytes; + + return (((int)((unencodedLength+2)/3))*4) - paddingBytes; + } + + public static int getEncodedBytesForTarget(int targetSize) { + return ((int)(targetSize * 3)) / 4; + } + + +/* ******** E N C O D I N G M E T H O D S ******** */ + + + /** + * Encodes up to the first three bytes of array threeBytes + * and returns a four-byte array in Base64 notation. + * The actual number of significant bytes in your array is + * given by numSigBytes. + * The array threeBytes needs only be as big as + * numSigBytes. + * Code can reuse a byte array by passing a four-byte array as b4. + * + * @param b4 A reusable byte array to reduce array instantiation + * @param threeBytes the array to convert + * @param numSigBytes the number of significant bytes in your array + * @return four byte array in Base64 notation. + * @since 1.5.1 + */ + private static byte[] encode3to4( byte[] b4, byte[] threeBytes, int numSigBytes, int options ) { + encode3to4( threeBytes, 0, numSigBytes, b4, 0, options ); + return b4; + } // end encode3to4 + + + /** + *

Encodes up to three bytes of the array source + * and writes the resulting four Base64 bytes to destination. + * The source and destination arrays can be manipulated + * anywhere along their length by specifying + * srcOffset and destOffset. + * This method does not check to make sure your arrays + * are large enough to accomodate srcOffset + 3 for + * the source array or destOffset + 4 for + * the destination array. + * The actual number of significant bytes in your array is + * given by numSigBytes.

+ *

This is the lowest level of the encoding methods with + * all possible parameters.

+ * + * @param source the array to convert + * @param srcOffset the index where conversion begins + * @param numSigBytes the number of significant bytes in your array + * @param destination the array to hold the conversion + * @param destOffset the index where output will be put + * @return the destination array + * @since 1.3 + */ + private static byte[] encode3to4( + byte[] source, int srcOffset, int numSigBytes, + byte[] destination, int destOffset, int options ) { + + byte[] ALPHABET = getAlphabet( options ); + + // 1 2 3 + // 01234567890123456789012345678901 Bit position + // --------000000001111111122222222 Array position from threeBytes + // --------| || || || | Six bit groups to index ALPHABET + // >>18 >>12 >> 6 >> 0 Right shift necessary + // 0x3f 0x3f 0x3f Additional AND + + // Create buffer with zero-padding if there are only one or two + // significant bytes passed in the array. + // We have to shift left 24 in order to flush out the 1's that appear + // when Java treats a value as negative that is cast from a byte to an int. + int inBuff = ( numSigBytes > 0 ? ((source[ srcOffset ] << 24) >>> 8) : 0 ) + | ( numSigBytes > 1 ? ((source[ srcOffset + 1 ] << 24) >>> 16) : 0 ) + | ( numSigBytes > 2 ? ((source[ srcOffset + 2 ] << 24) >>> 24) : 0 ); + + switch( numSigBytes ) + { + case 3: + destination[ destOffset ] = ALPHABET[ (inBuff >>> 18) ]; + destination[ destOffset + 1 ] = ALPHABET[ (inBuff >>> 12) & 0x3f ]; + destination[ destOffset + 2 ] = ALPHABET[ (inBuff >>> 6) & 0x3f ]; + destination[ destOffset + 3 ] = ALPHABET[ (inBuff ) & 0x3f ]; + return destination; + + case 2: + destination[ destOffset ] = ALPHABET[ (inBuff >>> 18) ]; + destination[ destOffset + 1 ] = ALPHABET[ (inBuff >>> 12) & 0x3f ]; + destination[ destOffset + 2 ] = ALPHABET[ (inBuff >>> 6) & 0x3f ]; + destination[ destOffset + 3 ] = EQUALS_SIGN; + return destination; + + case 1: + destination[ destOffset ] = ALPHABET[ (inBuff >>> 18) ]; + destination[ destOffset + 1 ] = ALPHABET[ (inBuff >>> 12) & 0x3f ]; + destination[ destOffset + 2 ] = EQUALS_SIGN; + destination[ destOffset + 3 ] = EQUALS_SIGN; + return destination; + + default: + return destination; + } // end switch + } // end encode3to4 + + + + /** + * Performs Base64 encoding on the raw ByteBuffer, + * writing it to the encoded ByteBuffer. + * This is an experimental feature. Currently it does not + * pass along any options (such as {@link #DO_BREAK_LINES} + * or {@link #GZIP}. + * + * @param raw input buffer + * @param encoded output buffer + * @since 2.3 + */ + public static void encode( java.nio.ByteBuffer raw, java.nio.ByteBuffer encoded ){ + byte[] raw3 = new byte[3]; + byte[] enc4 = new byte[4]; + + while( raw.hasRemaining() ){ + int rem = Math.min(3,raw.remaining()); + raw.get(raw3,0,rem); + Base64.encode3to4(enc4, raw3, rem, Base64.NO_OPTIONS ); + encoded.put(enc4); + } // end input remaining + } + + + /** + * Performs Base64 encoding on the raw ByteBuffer, + * writing it to the encoded CharBuffer. + * This is an experimental feature. Currently it does not + * pass along any options (such as {@link #DO_BREAK_LINES} + * or {@link #GZIP}. + * + * @param raw input buffer + * @param encoded output buffer + * @since 2.3 + */ + public static void encode( java.nio.ByteBuffer raw, java.nio.CharBuffer encoded ){ + byte[] raw3 = new byte[3]; + byte[] enc4 = new byte[4]; + + while( raw.hasRemaining() ){ + int rem = Math.min(3,raw.remaining()); + raw.get(raw3,0,rem); + Base64.encode3to4(enc4, raw3, rem, Base64.NO_OPTIONS ); + for( int i = 0; i < 4; i++ ){ + encoded.put( (char)(enc4[i] & 0xFF) ); + } + } // end input remaining + } + + + + + /** + * Serializes an object and returns the Base64-encoded + * version of that serialized object. + * + *

As of v 2.3, if the object + * cannot be serialized or there is another error, + * the method will throw an java.io.IOException. This is new to v2.3! + * In earlier versions, it just returned a null value, but + * in retrospect that's a pretty poor way to handle it.

+ * + * The object is not GZip-compressed before being encoded. + * + * @param serializableObject The object to encode + * @return The Base64-encoded object + * @throws java.io.IOException if there is an error + * @throws NullPointerException if serializedObject is null + * @since 1.4 + */ + public static String encodeObject( java.io.Serializable serializableObject ) + throws java.io.IOException { + return encodeObject( serializableObject, NO_OPTIONS ); + } // end encodeObject + + + + /** + * Serializes an object and returns the Base64-encoded + * version of that serialized object. + * + *

As of v 2.3, if the object + * cannot be serialized or there is another error, + * the method will throw an java.io.IOException. This is new to v2.3! + * In earlier versions, it just returned a null value, but + * in retrospect that's a pretty poor way to handle it.

+ * + * The object is not GZip-compressed before being encoded. + *

+ * Example options:

+     *   GZIP: gzip-compresses object before encoding it.
+     *   DO_BREAK_LINES: break lines at 76 characters
+     * 
+ *

+ * Example: encodeObject( myObj, Base64.GZIP ) or + *

+ * Example: encodeObject( myObj, Base64.GZIP | Base64.DO_BREAK_LINES ) + * + * @param serializableObject The object to encode + * @param options Specified options + * @return The Base64-encoded object + * @see Base64#GZIP + * @see Base64#DO_BREAK_LINES + * @throws java.io.IOException if there is an error + * @since 2.0 + */ + public static String encodeObject( java.io.Serializable serializableObject, int options ) + throws java.io.IOException { + + if( serializableObject == null ){ + throw new NullPointerException( "Cannot serialize a null object." ); + } // end if: null + + // Streams + java.io.ByteArrayOutputStream baos = null; + java.io.OutputStream b64os = null; + java.util.zip.GZIPOutputStream gzos = null; + java.io.ObjectOutputStream oos = null; + + + try { + // ObjectOutputStream -> (GZIP) -> Base64 -> ByteArrayOutputStream + baos = new java.io.ByteArrayOutputStream(); + b64os = new OutputStream( baos, ENCODE | options ); + if( (options & GZIP) != 0 ){ + // Gzip + gzos = new java.util.zip.GZIPOutputStream(b64os); + oos = new java.io.ObjectOutputStream( gzos ); + } else { + // Not gzipped + oos = new java.io.ObjectOutputStream( b64os ); + } + oos.writeObject( serializableObject ); + } // end try + catch( java.io.IOException e ) { + // Catch it and then throw it immediately so that + // the finally{} block is called for cleanup. + throw e; + } // end catch + finally { + try{ oos.close(); } catch( Exception e ){} + try{ gzos.close(); } catch( Exception e ){} + try{ b64os.close(); } catch( Exception e ){} + try{ baos.close(); } catch( Exception e ){} + } // end finally + + // Return value according to relevant encoding. + try { + return new String( baos.toByteArray(), PREFERRED_ENCODING ); + } // end try + catch (java.io.UnsupportedEncodingException uue){ + // Fall back to some Java default + return new String( baos.toByteArray() ); + } // end catch + + } // end encode + + + + /** + * Encodes a byte array into Base64 notation. + * Does not GZip-compress data. + * + * @param source The data to convert + * @return The data in Base64-encoded form + * @throws NullPointerException if source array is null + * @since 1.4 + */ + public static String encodeBytes( byte[] source ) { + // Since we're not going to have the GZIP encoding turned on, + // we're not going to have an java.io.IOException thrown, so + // we should not force the user to have to catch it. + String encoded = null; + try { + encoded = encodeBytes(source, 0, source.length, NO_OPTIONS); + } catch (java.io.IOException ex) { + assert false : ex.getMessage(); + } // end catch + assert encoded != null; + return encoded; + } // end encodeBytes + + + public static String encodeBytesWithoutPadding(byte[] source, int offset, int length) { + String encoded = null; + + try { + encoded = encodeBytes(source, offset, length, NO_OPTIONS); + } catch (java.io.IOException ex) { + assert false : ex.getMessage(); + } + + assert encoded != null; + + if (encoded.charAt(encoded.length()-2) == '=') return encoded.substring(0, encoded.length()-2); + else if (encoded.charAt(encoded.length()-1) == '=') return encoded.substring(0, encoded.length()-1); + else return encoded; + + } + + public static String encodeBytesWithoutPadding(byte[] source) { + return encodeBytesWithoutPadding(source, 0, source.length); + } + + + /** + * Encodes a byte array into Base64 notation. + *

+ * Example options:

+     *   GZIP: gzip-compresses object before encoding it.
+     *   DO_BREAK_LINES: break lines at 76 characters
+     *     Note: Technically, this makes your encoding non-compliant.
+     * 
+ *

+ * Example: encodeBytes( myData, Base64.GZIP ) or + *

+ * Example: encodeBytes( myData, Base64.GZIP | Base64.DO_BREAK_LINES ) + * + * + *

As of v 2.3, if there is an error with the GZIP stream, + * the method will throw an java.io.IOException. This is new to v2.3! + * In earlier versions, it just returned a null value, but + * in retrospect that's a pretty poor way to handle it.

+ * + * + * @param source The data to convert + * @param options Specified options + * @return The Base64-encoded data as a String + * @see Base64#GZIP + * @see Base64#DO_BREAK_LINES + * @throws java.io.IOException if there is an error + * @throws NullPointerException if source array is null + * @since 2.0 + */ + public static String encodeBytes( byte[] source, int options ) throws java.io.IOException { + return encodeBytes( source, 0, source.length, options ); + } // end encodeBytes + + + /** + * Encodes a byte array into Base64 notation. + * Does not GZip-compress data. + * + *

As of v 2.3, if there is an error, + * the method will throw an java.io.IOException. This is new to v2.3! + * In earlier versions, it just returned a null value, but + * in retrospect that's a pretty poor way to handle it.

+ * + * + * @param source The data to convert + * @param off Offset in array where conversion should begin + * @param len Length of data to convert + * @return The Base64-encoded data as a String + * @throws NullPointerException if source array is null + * @throws IllegalArgumentException if source array, offset, or length are invalid + * @since 1.4 + */ + public static String encodeBytes( byte[] source, int off, int len ) { + // Since we're not going to have the GZIP encoding turned on, + // we're not going to have an java.io.IOException thrown, so + // we should not force the user to have to catch it. + String encoded = null; + try { + encoded = encodeBytes( source, off, len, NO_OPTIONS ); + } catch (java.io.IOException ex) { + assert false : ex.getMessage(); + } // end catch + assert encoded != null; + return encoded; + } // end encodeBytes + + + + /** + * Encodes a byte array into Base64 notation. + *

+ * Example options:

+     *   GZIP: gzip-compresses object before encoding it.
+     *   DO_BREAK_LINES: break lines at 76 characters
+     *     Note: Technically, this makes your encoding non-compliant.
+     * 
+ *

+ * Example: encodeBytes( myData, Base64.GZIP ) or + *

+ * Example: encodeBytes( myData, Base64.GZIP | Base64.DO_BREAK_LINES ) + * + * + *

As of v 2.3, if there is an error with the GZIP stream, + * the method will throw an java.io.IOException. This is new to v2.3! + * In earlier versions, it just returned a null value, but + * in retrospect that's a pretty poor way to handle it.

+ * + * + * @param source The data to convert + * @param off Offset in array where conversion should begin + * @param len Length of data to convert + * @param options Specified options + * @return The Base64-encoded data as a String + * @see Base64#GZIP + * @see Base64#DO_BREAK_LINES + * @throws java.io.IOException if there is an error + * @throws NullPointerException if source array is null + * @throws IllegalArgumentException if source array, offset, or length are invalid + * @since 2.0 + */ + public static String encodeBytes( byte[] source, int off, int len, int options ) throws java.io.IOException { + byte[] encoded = encodeBytesToBytes( source, off, len, options ); + + // Return value according to relevant encoding. + try { + return new String( encoded, PREFERRED_ENCODING ); + } // end try + catch (java.io.UnsupportedEncodingException uue) { + return new String( encoded ); + } // end catch + + } // end encodeBytes + + + + + /** + * Similar to {@link #encodeBytes(byte[])} but returns + * a byte array instead of instantiating a String. This is more efficient + * if you're working with I/O streams and have large data sets to encode. + * + * + * @param source The data to convert + * @return The Base64-encoded data as a byte[] (of ASCII characters) + * @throws NullPointerException if source array is null + * @since 2.3.1 + */ + public static byte[] encodeBytesToBytes( byte[] source ) { + byte[] encoded = null; + try { + encoded = encodeBytesToBytes( source, 0, source.length, Base64.NO_OPTIONS ); + } catch( java.io.IOException ex ) { + assert false : "IOExceptions only come from GZipping, which is turned off: " + ex.getMessage(); + } + return encoded; + } + + + /** + * Similar to {@link #encodeBytes(byte[], int, int, int)} but returns + * a byte array instead of instantiating a String. This is more efficient + * if you're working with I/O streams and have large data sets to encode. + * + * + * @param source The data to convert + * @param off Offset in array where conversion should begin + * @param len Length of data to convert + * @param options Specified options + * @return The Base64-encoded data as a String + * @see Base64#GZIP + * @see Base64#DO_BREAK_LINES + * @throws java.io.IOException if there is an error + * @throws NullPointerException if source array is null + * @throws IllegalArgumentException if source array, offset, or length are invalid + * @since 2.3.1 + */ + public static byte[] encodeBytesToBytes( byte[] source, int off, int len, int options ) throws java.io.IOException { + + if( source == null ){ + throw new NullPointerException( "Cannot serialize a null array." ); + } // end if: null + + if( off < 0 ){ + throw new IllegalArgumentException( "Cannot have negative offset: " + off ); + } // end if: off < 0 + + if( len < 0 ){ + throw new IllegalArgumentException( "Cannot have length offset: " + len ); + } // end if: len < 0 + + if( off + len > source.length ){ + throw new IllegalArgumentException( + String.format( "Cannot have offset of %d and length of %d with array of length %d", off,len,source.length)); + } // end if: off < 0 + + + + // Compress? + if( (options & GZIP) != 0 ) { + java.io.ByteArrayOutputStream baos = null; + java.util.zip.GZIPOutputStream gzos = null; + OutputStream b64os = null; + + try { + // GZip -> Base64 -> ByteArray + baos = new java.io.ByteArrayOutputStream(); + b64os = new OutputStream( baos, ENCODE | options ); + gzos = new java.util.zip.GZIPOutputStream( b64os ); + + gzos.write( source, off, len ); + gzos.close(); + } // end try + catch( java.io.IOException e ) { + // Catch it and then throw it immediately so that + // the finally{} block is called for cleanup. + throw e; + } // end catch + finally { + try{ gzos.close(); } catch( Exception e ){} + try{ b64os.close(); } catch( Exception e ){} + try{ baos.close(); } catch( Exception e ){} + } // end finally + + return baos.toByteArray(); + } // end if: compress + + // Else, don't compress. Better not to use streams at all then. + else { + boolean breakLines = (options & DO_BREAK_LINES) > 0; + + //int len43 = len * 4 / 3; + //byte[] outBuff = new byte[ ( len43 ) // Main 4:3 + // + ( (len % 3) > 0 ? 4 : 0 ) // Account for padding + // + (breakLines ? ( len43 / MAX_LINE_LENGTH ) : 0) ]; // New lines + // Try to determine more precisely how big the array needs to be. + // If we get it right, we don't have to do an array copy, and + // we save a bunch of memory. + int encLen = ( len / 3 ) * 4 + ( len % 3 > 0 ? 4 : 0 ); // Bytes needed for actual encoding + if( breakLines ){ + encLen += encLen / MAX_LINE_LENGTH; // Plus extra newline characters + } + byte[] outBuff = new byte[ encLen ]; + + + int d = 0; + int e = 0; + int len2 = len - 2; + int lineLength = 0; + for( ; d < len2; d+=3, e+=4 ) { + encode3to4( source, d+off, 3, outBuff, e, options ); + + lineLength += 4; + if( breakLines && lineLength >= MAX_LINE_LENGTH ) + { + outBuff[e+4] = NEW_LINE; + e++; + lineLength = 0; + } // end if: end of line + } // en dfor: each piece of array + + if( d < len ) { + encode3to4( source, d+off, len - d, outBuff, e, options ); + e += 4; + } // end if: some padding needed + + + // Only resize array if we didn't guess it right. + if( e < outBuff.length - 1 ){ + byte[] finalOut = new byte[e]; + System.arraycopy(outBuff,0, finalOut,0,e); + //System.err.println("Having to resize array from " + outBuff.length + " to " + e ); + return finalOut; + } else { + //System.err.println("No need to resize array."); + return outBuff; + } + + } // end else: don't compress + + } // end encodeBytesToBytes + + + + + +/* ******** D E C O D I N G M E T H O D S ******** */ + + + /** + * Decodes four bytes from array source + * and writes the resulting bytes (up to three of them) + * to destination. + * The source and destination arrays can be manipulated + * anywhere along their length by specifying + * srcOffset and destOffset. + * This method does not check to make sure your arrays + * are large enough to accomodate srcOffset + 4 for + * the source array or destOffset + 3 for + * the destination array. + * This method returns the actual number of bytes that + * were converted from the Base64 encoding. + *

This is the lowest level of the decoding methods with + * all possible parameters.

+ * + * + * @param source the array to convert + * @param srcOffset the index where conversion begins + * @param destination the array to hold the conversion + * @param destOffset the index where output will be put + * @param options alphabet type is pulled from this (standard, url-safe, ordered) + * @return the number of decoded bytes converted + * @throws NullPointerException if source or destination arrays are null + * @throws IllegalArgumentException if srcOffset or destOffset are invalid + * or there is not enough room in the array. + * @since 1.3 + */ + private static int decode4to3( + byte[] source, int srcOffset, + byte[] destination, int destOffset, int options ) { + + // Lots of error checking and exception throwing + if( source == null ){ + throw new NullPointerException( "Source array was null." ); + } // end if + if( destination == null ){ + throw new NullPointerException( "Destination array was null." ); + } // end if + if( srcOffset < 0 || srcOffset + 3 >= source.length ){ + throw new IllegalArgumentException( String.format( + "Source array with length %d cannot have offset of %d and still process four bytes.", source.length, srcOffset ) ); + } // end if + if( destOffset < 0 || destOffset +2 >= destination.length ){ + throw new IllegalArgumentException( String.format( + "Destination array with length %d cannot have offset of %d and still store three bytes.", destination.length, destOffset ) ); + } // end if + + + byte[] DECODABET = getDecodabet( options ); + + // Example: Dk== + if( source[ srcOffset + 2] == EQUALS_SIGN ) { + // Two ways to do the same thing. Don't know which way I like best. + //int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6 ) + // | ( ( DECODABET[ source[ srcOffset + 1] ] << 24 ) >>> 12 ); + int outBuff = ( ( DECODABET[ source[ srcOffset ] ] & 0xFF ) << 18 ) + | ( ( DECODABET[ source[ srcOffset + 1] ] & 0xFF ) << 12 ); + + destination[ destOffset ] = (byte)( outBuff >>> 16 ); + return 1; + } + + // Example: DkL= + else if( source[ srcOffset + 3 ] == EQUALS_SIGN ) { + // Two ways to do the same thing. Don't know which way I like best. + //int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6 ) + // | ( ( DECODABET[ source[ srcOffset + 1 ] ] << 24 ) >>> 12 ) + // | ( ( DECODABET[ source[ srcOffset + 2 ] ] << 24 ) >>> 18 ); + int outBuff = ( ( DECODABET[ source[ srcOffset ] ] & 0xFF ) << 18 ) + | ( ( DECODABET[ source[ srcOffset + 1 ] ] & 0xFF ) << 12 ) + | ( ( DECODABET[ source[ srcOffset + 2 ] ] & 0xFF ) << 6 ); + + destination[ destOffset ] = (byte)( outBuff >>> 16 ); + destination[ destOffset + 1 ] = (byte)( outBuff >>> 8 ); + return 2; + } + + // Example: DkLE + else { + // Two ways to do the same thing. Don't know which way I like best. + //int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6 ) + // | ( ( DECODABET[ source[ srcOffset + 1 ] ] << 24 ) >>> 12 ) + // | ( ( DECODABET[ source[ srcOffset + 2 ] ] << 24 ) >>> 18 ) + // | ( ( DECODABET[ source[ srcOffset + 3 ] ] << 24 ) >>> 24 ); + int outBuff = ( ( DECODABET[ source[ srcOffset ] ] & 0xFF ) << 18 ) + | ( ( DECODABET[ source[ srcOffset + 1 ] ] & 0xFF ) << 12 ) + | ( ( DECODABET[ source[ srcOffset + 2 ] ] & 0xFF ) << 6) + | ( ( DECODABET[ source[ srcOffset + 3 ] ] & 0xFF ) ); + + + destination[ destOffset ] = (byte)( outBuff >> 16 ); + destination[ destOffset + 1 ] = (byte)( outBuff >> 8 ); + destination[ destOffset + 2 ] = (byte)( outBuff ); + + return 3; + } + } // end decodeToBytes + + + + + + /** + * Low-level access to decoding ASCII characters in + * the form of a byte array. Ignores GUNZIP option, if + * it's set. This is not generally a recommended method, + * although it is used internally as part of the decoding process. + * Special case: if len = 0, an empty array is returned. Still, + * if you need more speed and reduced memory footprint (and aren't + * gzipping), consider this method. + * + * @param source The Base64 encoded data + * @return decoded data + * @since 2.3.1 + */ + public static byte[] decode( byte[] source ){ + byte[] decoded = null; + try { + decoded = decode( source, 0, source.length, Base64.NO_OPTIONS ); + } catch( java.io.IOException ex ) { + assert false : "IOExceptions only come from GZipping, which is turned off: " + ex.getMessage(); + } + return decoded; + } + + + /** + * Low-level access to decoding ASCII characters in + * the form of a byte array. Ignores GUNZIP option, if + * it's set. This is not generally a recommended method, + * although it is used internally as part of the decoding process. + * Special case: if len = 0, an empty array is returned. Still, + * if you need more speed and reduced memory footprint (and aren't + * gzipping), consider this method. + * + * @param source The Base64 encoded data + * @param off The offset of where to begin decoding + * @param len The length of characters to decode + * @param options Can specify options such as alphabet type to use + * @return decoded data + * @throws java.io.IOException If bogus characters exist in source data + * @since 1.3 + */ + public static byte[] decode( byte[] source, int off, int len, int options ) + throws java.io.IOException { + + // Lots of error checking and exception throwing + if( source == null ){ + throw new NullPointerException( "Cannot decode null source array." ); + } // end if + if( off < 0 || off + len > source.length ){ + throw new IllegalArgumentException( String.format( + "Source array with length %d cannot have offset of %d and process %d bytes.", source.length, off, len ) ); + } // end if + + if( len == 0 ){ + return new byte[0]; + }else if( len < 4 ){ + throw new IllegalArgumentException( + "Base64-encoded string must have at least four characters, but length specified was " + len ); + } // end if + + byte[] DECODABET = getDecodabet( options ); + + int len34 = len * 3 / 4; // Estimate on array size + byte[] outBuff = new byte[ len34 ]; // Upper limit on size of output + int outBuffPosn = 0; // Keep track of where we're writing + + byte[] b4 = new byte[4]; // Four byte buffer from source, eliminating white space + int b4Posn = 0; // Keep track of four byte input buffer + int i = 0; // Source array counter + byte sbiCrop = 0; // Low seven bits (ASCII) of input + byte sbiDecode = 0; // Special value from DECODABET + + for( i = off; i < off+len; i++ ) { // Loop through source + + sbiCrop = (byte)(source[i] & 0x7f); // Only the low seven bits + sbiDecode = DECODABET[ sbiCrop ]; // Special value + + // White space, Equals sign, or legit Base64 character + // Note the values such as -5 and -9 in the + // DECODABETs at the top of the file. + if( sbiDecode >= WHITE_SPACE_ENC ) { + if( sbiDecode >= EQUALS_SIGN_ENC ) { + b4[ b4Posn++ ] = sbiCrop; // Save non-whitespace + if( b4Posn > 3 ) { // Time to decode? + outBuffPosn += decode4to3( b4, 0, outBuff, outBuffPosn, options ); + b4Posn = 0; + + // If that was the equals sign, break out of 'for' loop + if( sbiCrop == EQUALS_SIGN ) { + break; + } // end if: equals sign + } // end if: quartet built + } // end if: equals sign or better + } // end if: white space, equals sign or better + else { + // There's a bad input character in the Base64 stream. + throw new java.io.IOException( String.format( + "Bad Base64 input character '%c' in array position %d", source[i], i ) ); + } // end else: + } // each input character + + byte[] out = new byte[ outBuffPosn ]; + System.arraycopy( outBuff, 0, out, 0, outBuffPosn ); + return out; + } // end decode + + + + + /** + * Decodes data from Base64 notation, automatically + * detecting gzip-compressed data and decompressing it. + * + * @param s the string to decode + * @return the decoded data + * @throws java.io.IOException If there is a problem + * @since 1.4 + */ + public static byte[] decode( String s ) throws java.io.IOException { + return decode( s, NO_OPTIONS ); + } + + + public static byte[] decodeWithoutPadding(String source) throws java.io.IOException { + int padding = source.length() % 4; + + if (padding == 1) source = source + "="; + else if (padding == 2) source = source + "=="; + else if (padding == 3) source = source + "="; + + return decode(source); + } + + + + /** + * Decodes data from Base64 notation, automatically + * detecting gzip-compressed data and decompressing it. + * + * @param s the string to decode + * @param options encode options such as URL_SAFE + * @return the decoded data + * @throws java.io.IOException if there is an error + * @throws NullPointerException if s is null + * @since 1.4 + */ + public static byte[] decode( String s, int options ) throws java.io.IOException { + + if( s == null ){ + throw new NullPointerException( "Input string was null." ); + } // end if + + byte[] bytes; + try { + bytes = s.getBytes( PREFERRED_ENCODING ); + } // end try + catch( java.io.UnsupportedEncodingException uee ) { + bytes = s.getBytes(); + } // end catch + // + + // Decode + bytes = decode( bytes, 0, bytes.length, options ); + + // Check to see if it's gzip-compressed + // GZIP Magic Two-Byte Number: 0x8b1f (35615) + boolean dontGunzip = (options & DONT_GUNZIP) != 0; + if( (bytes != null) && (bytes.length >= 4) && (!dontGunzip) ) { + + int head = ((int)bytes[0] & 0xff) | ((bytes[1] << 8) & 0xff00); + if( java.util.zip.GZIPInputStream.GZIP_MAGIC == head ) { + java.io.ByteArrayInputStream bais = null; + java.util.zip.GZIPInputStream gzis = null; + java.io.ByteArrayOutputStream baos = null; + byte[] buffer = new byte[2048]; + int length = 0; + + try { + baos = new java.io.ByteArrayOutputStream(); + bais = new java.io.ByteArrayInputStream( bytes ); + gzis = new java.util.zip.GZIPInputStream( bais ); + + while( ( length = gzis.read( buffer ) ) >= 0 ) { + baos.write(buffer,0,length); + } // end while: reading input + + // No error? Get new bytes. + bytes = baos.toByteArray(); + + } // end try + catch( java.io.IOException e ) { + e.printStackTrace(); + // Just return originally-decoded bytes + } // end catch + finally { + try{ baos.close(); } catch( Exception e ){} + try{ gzis.close(); } catch( Exception e ){} + try{ bais.close(); } catch( Exception e ){} + } // end finally + + } // end if: gzipped + } // end if: bytes.length >= 2 + + return bytes; + } // end decode + + + + /** + * Attempts to decode Base64 data and deserialize a Java + * Object within. Returns null if there was an error. + * + * @param encodedObject The Base64 data to decode + * @return The decoded and deserialized object + * @throws NullPointerException if encodedObject is null + * @throws java.io.IOException if there is a general error + * @throws ClassNotFoundException if the decoded object is of a + * class that cannot be found by the JVM + * @since 1.5 + */ + public static Object decodeToObject( String encodedObject ) + throws java.io.IOException, ClassNotFoundException { + return decodeToObject(encodedObject,NO_OPTIONS,null); + } + + + /** + * Attempts to decode Base64 data and deserialize a Java + * Object within. Returns null if there was an error. + * If loader is not null, it will be the class loader + * used when deserializing. + * + * @param encodedObject The Base64 data to decode + * @param options Various parameters related to decoding + * @param loader Optional class loader to use in deserializing classes. + * @return The decoded and deserialized object + * @throws NullPointerException if encodedObject is null + * @throws java.io.IOException if there is a general error + * @throws ClassNotFoundException if the decoded object is of a + * class that cannot be found by the JVM + * @since 2.3.4 + */ + public static Object decodeToObject( + String encodedObject, int options, final ClassLoader loader ) + throws java.io.IOException, ClassNotFoundException { + + // Decode and gunzip if necessary + byte[] objBytes = decode( encodedObject, options ); + + java.io.ByteArrayInputStream bais = null; + java.io.ObjectInputStream ois = null; + Object obj = null; + + try { + bais = new java.io.ByteArrayInputStream( objBytes ); + + // If no custom class loader is provided, use Java's builtin OIS. + if( loader == null ){ + ois = new java.io.ObjectInputStream( bais ); + } // end if: no loader provided + + // Else make a customized object input stream that uses + // the provided class loader. + else { + ois = new java.io.ObjectInputStream(bais){ + @Override + public Class resolveClass(java.io.ObjectStreamClass streamClass) + throws java.io.IOException, ClassNotFoundException { + Class c = Class.forName(streamClass.getName(), false, loader); + if( c == null ){ + return super.resolveClass(streamClass); + } else { + return c; // Class loader knows of this class. + } // end else: not null + } // end resolveClass + }; // end ois + } // end else: no custom class loader + + obj = ois.readObject(); + } // end try + catch( java.io.IOException e ) { + throw e; // Catch and throw in order to execute finally{} + } // end catch + catch( ClassNotFoundException e ) { + throw e; // Catch and throw in order to execute finally{} + } // end catch + finally { + try{ bais.close(); } catch( Exception e ){} + try{ ois.close(); } catch( Exception e ){} + } // end finally + + return obj; + } // end decodeObject + + + + /** + * Convenience method for encoding data to a file. + * + *

As of v 2.3, if there is a error, + * the method will throw an java.io.IOException. This is new to v2.3! + * In earlier versions, it just returned false, but + * in retrospect that's a pretty poor way to handle it.

+ * + * @param dataToEncode byte array of data to encode in base64 form + * @param filename Filename for saving encoded data + * @throws java.io.IOException if there is an error + * @throws NullPointerException if dataToEncode is null + * @since 2.1 + */ + public static void encodeToFile( byte[] dataToEncode, String filename ) + throws java.io.IOException { + + if( dataToEncode == null ){ + throw new NullPointerException( "Data to encode was null." ); + } // end iff + + OutputStream bos = null; + try { + bos = new OutputStream( + new java.io.FileOutputStream( filename ), Base64.ENCODE ); + bos.write( dataToEncode ); + } // end try + catch( java.io.IOException e ) { + throw e; // Catch and throw to execute finally{} block + } // end catch: java.io.IOException + finally { + try{ bos.close(); } catch( Exception e ){} + } // end finally + + } // end encodeToFile + + + /** + * Convenience method for decoding data to a file. + * + *

As of v 2.3, if there is a error, + * the method will throw an java.io.IOException. This is new to v2.3! + * In earlier versions, it just returned false, but + * in retrospect that's a pretty poor way to handle it.

+ * + * @param dataToDecode Base64-encoded data as a string + * @param filename Filename for saving decoded data + * @throws java.io.IOException if there is an error + * @since 2.1 + */ + public static void decodeToFile( String dataToDecode, String filename ) + throws java.io.IOException { + + OutputStream bos = null; + try{ + bos = new OutputStream( + new java.io.FileOutputStream( filename ), Base64.DECODE ); + bos.write( dataToDecode.getBytes( PREFERRED_ENCODING ) ); + } // end try + catch( java.io.IOException e ) { + throw e; // Catch and throw to execute finally{} block + } // end catch: java.io.IOException + finally { + try{ bos.close(); } catch( Exception e ){} + } // end finally + + } // end decodeToFile + + + + + /** + * Convenience method for reading a base64-encoded + * file and decoding it. + * + *

As of v 2.3, if there is a error, + * the method will throw an java.io.IOException. This is new to v2.3! + * In earlier versions, it just returned false, but + * in retrospect that's a pretty poor way to handle it.

+ * + * @param filename Filename for reading encoded data + * @return decoded byte array + * @throws java.io.IOException if there is an error + * @since 2.1 + */ + public static byte[] decodeFromFile( String filename ) + throws java.io.IOException { + + byte[] decodedData = null; + InputStream bis = null; + try + { + // Set up some useful variables + java.io.File file = new java.io.File( filename ); + byte[] buffer = null; + int length = 0; + int numBytes = 0; + + // Check for size of file + if( file.length() > Integer.MAX_VALUE ) + { + throw new java.io.IOException( "File is too big for this convenience method (" + file.length() + " bytes)." ); + } // end if: file too big for int index + buffer = new byte[ (int)file.length() ]; + + // Open a stream + bis = new InputStream( + new java.io.BufferedInputStream( + new java.io.FileInputStream( file ) ), Base64.DECODE ); + + // Read until done + while( ( numBytes = bis.read( buffer, length, 4096 ) ) >= 0 ) { + length += numBytes; + } // end while + + // Save in a variable to return + decodedData = new byte[ length ]; + System.arraycopy( buffer, 0, decodedData, 0, length ); + + } // end try + catch( java.io.IOException e ) { + throw e; // Catch and release to execute finally{} + } // end catch: java.io.IOException + finally { + try{ bis.close(); } catch( Exception e) {} + } // end finally + + return decodedData; + } // end decodeFromFile + + + + /** + * Convenience method for reading a binary file + * and base64-encoding it. + * + *

As of v 2.3, if there is a error, + * the method will throw an java.io.IOException. This is new to v2.3! + * In earlier versions, it just returned false, but + * in retrospect that's a pretty poor way to handle it.

+ * + * @param filename Filename for reading binary data + * @return base64-encoded string + * @throws java.io.IOException if there is an error + * @since 2.1 + */ + public static String encodeFromFile( String filename ) + throws java.io.IOException { + + String encodedData = null; + InputStream bis = null; + try + { + // Set up some useful variables + java.io.File file = new java.io.File( filename ); + byte[] buffer = new byte[ Math.max((int)(file.length() * 1.4),40) ]; // Need max() for math on small files (v2.2.1) + int length = 0; + int numBytes = 0; + + // Open a stream + bis = new InputStream( + new java.io.BufferedInputStream( + new java.io.FileInputStream( file ) ), Base64.ENCODE ); + + // Read until done + while( ( numBytes = bis.read( buffer, length, 4096 ) ) >= 0 ) { + length += numBytes; + } // end while + + // Save in a variable to return + encodedData = new String( buffer, 0, length, Base64.PREFERRED_ENCODING ); + + } // end try + catch( java.io.IOException e ) { + throw e; // Catch and release to execute finally{} + } // end catch: java.io.IOException + finally { + try{ bis.close(); } catch( Exception e) {} + } // end finally + + return encodedData; + } // end encodeFromFile + + /** + * Reads infile and encodes it to outfile. + * + * @param infile Input file + * @param outfile Output file + * @throws java.io.IOException if there is an error + * @since 2.2 + */ + public static void encodeFileToFile( String infile, String outfile ) + throws java.io.IOException { + + String encoded = Base64.encodeFromFile( infile ); + java.io.OutputStream out = null; + try{ + out = new java.io.BufferedOutputStream( + new java.io.FileOutputStream( outfile ) ); + out.write( encoded.getBytes("US-ASCII") ); // Strict, 7-bit output. + } // end try + catch( java.io.IOException e ) { + throw e; // Catch and release to execute finally{} + } // end catch + finally { + try { out.close(); } + catch( Exception ex ){} + } // end finally + } // end encodeFileToFile + + + /** + * Reads infile and decodes it to outfile. + * + * @param infile Input file + * @param outfile Output file + * @throws java.io.IOException if there is an error + * @since 2.2 + */ + public static void decodeFileToFile( String infile, String outfile ) + throws java.io.IOException { + + byte[] decoded = Base64.decodeFromFile( infile ); + java.io.OutputStream out = null; + try{ + out = new java.io.BufferedOutputStream( + new java.io.FileOutputStream( outfile ) ); + out.write( decoded ); + } // end try + catch( java.io.IOException e ) { + throw e; // Catch and release to execute finally{} + } // end catch + finally { + try { out.close(); } + catch( Exception ex ){} + } // end finally + } // end decodeFileToFile + + + /* ******** I N N E R C L A S S I N P U T S T R E A M ******** */ + + + + /** + * A {@link InputStream} will read data from another + * java.io.InputStream, given in the constructor, + * and encode/decode to/from Base64 notation on the fly. + * + * @see Base64 + * @since 1.3 + */ + public static class InputStream extends java.io.FilterInputStream { + + private boolean encode; // Encoding or decoding + private int position; // Current position in the buffer + private byte[] buffer; // Small buffer holding converted data + private int bufferLength; // Length of buffer (3 or 4) + private int numSigBytes; // Number of meaningful bytes in the buffer + private int lineLength; + private boolean breakLines; // Break lines at less than 80 characters + private int options; // Record options used to create the stream. + private byte[] decodabet; // Local copies to avoid extra method calls + + + /** + * Constructs a {@link InputStream} in DECODE mode. + * + * @param in the java.io.InputStream from which to read data. + * @since 1.3 + */ + public InputStream( java.io.InputStream in ) { + this( in, DECODE ); + } // end constructor + + + /** + * Constructs a {@link InputStream} in + * either ENCODE or DECODE mode. + *

+ * Valid options:

+         *   ENCODE or DECODE: Encode or Decode as data is read.
+         *   DO_BREAK_LINES: break lines at 76 characters
+         *     (only meaningful when encoding)
+         * 
+ *

+ * Example: new Base64.InputStream( in, Base64.DECODE ) + * + * + * @param in the java.io.InputStream from which to read data. + * @param options Specified options + * @see Base64#ENCODE + * @see Base64#DECODE + * @see Base64#DO_BREAK_LINES + * @since 2.0 + */ + public InputStream( java.io.InputStream in, int options ) { + + super( in ); + this.options = options; // Record for later + this.breakLines = (options & DO_BREAK_LINES) > 0; + this.encode = (options & ENCODE) > 0; + this.bufferLength = encode ? 4 : 3; + this.buffer = new byte[ bufferLength ]; + this.position = -1; + this.lineLength = 0; + this.decodabet = getDecodabet(options); + } // end constructor + + /** + * Reads enough of the input stream to convert + * to/from Base64 and returns the next byte. + * + * @return next byte + * @since 1.3 + */ + @Override + public int read() throws java.io.IOException { + + // Do we need to get data? + if( position < 0 ) { + if( encode ) { + byte[] b3 = new byte[3]; + int numBinaryBytes = 0; + for( int i = 0; i < 3; i++ ) { + int b = in.read(); + + // If end of stream, b is -1. + if( b >= 0 ) { + b3[i] = (byte)b; + numBinaryBytes++; + } else { + break; // out of for loop + } // end else: end of stream + + } // end for: each needed input byte + + if( numBinaryBytes > 0 ) { + encode3to4( b3, 0, numBinaryBytes, buffer, 0, options ); + position = 0; + numSigBytes = 4; + } // end if: got data + else { + return -1; // Must be end of stream + } // end else + } // end if: encoding + + // Else decoding + else { + byte[] b4 = new byte[4]; + int i = 0; + for( i = 0; i < 4; i++ ) { + // Read four "meaningful" bytes: + int b = 0; + do{ b = in.read(); } + while( b >= 0 && decodabet[ b & 0x7f ] <= WHITE_SPACE_ENC ); + + if( b < 0 ) { + break; // Reads a -1 if end of stream + } // end if: end of stream + + b4[i] = (byte)b; + } // end for: each needed input byte + + if( i == 4 ) { + numSigBytes = decode4to3( b4, 0, buffer, 0, options ); + position = 0; + } // end if: got four characters + else if( i == 0 ){ + return -1; + } // end else if: also padded correctly + else { + // Must have broken out from above. + throw new java.io.IOException( "Improperly padded Base64 input." ); + } // end + + } // end else: decode + } // end else: get data + + // Got data? + if( position >= 0 ) { + // End of relevant data? + if( /*!encode &&*/ position >= numSigBytes ){ + return -1; + } // end if: got data + + if( encode && breakLines && lineLength >= MAX_LINE_LENGTH ) { + lineLength = 0; + return '\n'; + } // end if + else { + lineLength++; // This isn't important when decoding + // but throwing an extra "if" seems + // just as wasteful. + + int b = buffer[ position++ ]; + + if( position >= bufferLength ) { + position = -1; + } // end if: end + + return b & 0xFF; // This is how you "cast" a byte that's + // intended to be unsigned. + } // end else + } // end if: position >= 0 + + // Else error + else { + throw new java.io.IOException( "Error in Base64 code reading stream." ); + } // end else + } // end read + + + /** + * Calls {@link #read()} repeatedly until the end of stream + * is reached or len bytes are read. + * Returns number of bytes read into array or -1 if + * end of stream is encountered. + * + * @param dest array to hold values + * @param off offset for array + * @param len max number of bytes to read into array + * @return bytes read into array or -1 if end of stream is encountered. + * @since 1.3 + */ + @Override + public int read( byte[] dest, int off, int len ) + throws java.io.IOException { + int i; + int b; + for( i = 0; i < len; i++ ) { + b = read(); + + if( b >= 0 ) { + dest[off + i] = (byte) b; + } + else if( i == 0 ) { + return -1; + } + else { + break; // Out of 'for' loop + } // Out of 'for' loop + } // end for: each byte read + return i; + } // end read + + } // end inner class InputStream + + + + + + + /* ******** I N N E R C L A S S O U T P U T S T R E A M ******** */ + + + + /** + * A {@link OutputStream} will write data to another + * java.io.OutputStream, given in the constructor, + * and encode/decode to/from Base64 notation on the fly. + * + * @see Base64 + * @since 1.3 + */ + public static class OutputStream extends java.io.FilterOutputStream { + + private boolean encode; + private int position; + private byte[] buffer; + private int bufferLength; + private int lineLength; + private boolean breakLines; + private byte[] b4; // Scratch used in a few places + private boolean suspendEncoding; + private int options; // Record for later + private byte[] decodabet; // Local copies to avoid extra method calls + + /** + * Constructs a {@link OutputStream} in ENCODE mode. + * + * @param out the java.io.OutputStream to which data will be written. + * @since 1.3 + */ + public OutputStream( java.io.OutputStream out ) { + this( out, ENCODE ); + } // end constructor + + + /** + * Constructs a {@link OutputStream} in + * either ENCODE or DECODE mode. + *

+ * Valid options:

+         *   ENCODE or DECODE: Encode or Decode as data is read.
+         *   DO_BREAK_LINES: don't break lines at 76 characters
+         *     (only meaningful when encoding)
+         * 
+ *

+ * Example: new Base64.OutputStream( out, Base64.ENCODE ) + * + * @param out the java.io.OutputStream to which data will be written. + * @param options Specified options. + * @see Base64#ENCODE + * @see Base64#DECODE + * @see Base64#DO_BREAK_LINES + * @since 1.3 + */ + public OutputStream( java.io.OutputStream out, int options ) { + super( out ); + this.breakLines = (options & DO_BREAK_LINES) != 0; + this.encode = (options & ENCODE) != 0; + this.bufferLength = encode ? 3 : 4; + this.buffer = new byte[ bufferLength ]; + this.position = 0; + this.lineLength = 0; + this.suspendEncoding = false; + this.b4 = new byte[4]; + this.options = options; + this.decodabet = getDecodabet(options); + } // end constructor + + + /** + * Writes the byte to the output stream after + * converting to/from Base64 notation. + * When encoding, bytes are buffered three + * at a time before the output stream actually + * gets a write() call. + * When decoding, bytes are buffered four + * at a time. + * + * @param theByte the byte to write + * @since 1.3 + */ + @Override + public void write(int theByte) + throws java.io.IOException { + // Encoding suspended? + if( suspendEncoding ) { + this.out.write( theByte ); + return; + } // end if: supsended + + // Encode? + if( encode ) { + buffer[ position++ ] = (byte)theByte; + if( position >= bufferLength ) { // Enough to encode. + + this.out.write( encode3to4( b4, buffer, bufferLength, options ) ); + + lineLength += 4; + if( breakLines && lineLength >= MAX_LINE_LENGTH ) { + this.out.write( NEW_LINE ); + lineLength = 0; + } // end if: end of line + + position = 0; + } // end if: enough to output + } // end if: encoding + + // Else, Decoding + else { + // Meaningful Base64 character? + if( decodabet[ theByte & 0x7f ] > WHITE_SPACE_ENC ) { + buffer[ position++ ] = (byte)theByte; + if( position >= bufferLength ) { // Enough to output. + + int len = Base64.decode4to3( buffer, 0, b4, 0, options ); + out.write( b4, 0, len ); + position = 0; + } // end if: enough to output + } // end if: meaningful base64 character + else if( decodabet[ theByte & 0x7f ] != WHITE_SPACE_ENC ) { + throw new java.io.IOException( "Invalid character in Base64 data." ); + } // end else: not white space either + } // end else: decoding + } // end write + + + + /** + * Calls {@link #write(int)} repeatedly until len + * bytes are written. + * + * @param theBytes array from which to read bytes + * @param off offset for array + * @param len max number of bytes to read into array + * @since 1.3 + */ + @Override + public void write( byte[] theBytes, int off, int len ) + throws java.io.IOException { + // Encoding suspended? + if( suspendEncoding ) { + this.out.write( theBytes, off, len ); + return; + } // end if: supsended + + for( int i = 0; i < len; i++ ) { + write( theBytes[ off + i ] ); + } // end for: each byte written + + } // end write + + + + /** + * Method added by PHIL. [Thanks, PHIL. -Rob] + * This pads the buffer without closing the stream. + * @throws java.io.IOException if there's an error. + */ + public void flushBase64() throws java.io.IOException { + if( position > 0 ) { + if( encode ) { + out.write( encode3to4( b4, buffer, position, options ) ); + position = 0; + } // end if: encoding + else { + throw new java.io.IOException( "Base64 input not properly padded." ); + } // end else: decoding + } // end if: buffer partially full + + } // end flush + + + /** + * Flushes and closes (I think, in the superclass) the stream. + * + * @since 1.3 + */ + @Override + public void close() throws java.io.IOException { + // 1. Ensure that pending characters are written + flushBase64(); + + // 2. Actually close the stream + // Base class both flushes and closes. + super.close(); + + buffer = null; + out = null; + } // end close + + + + /** + * Suspends encoding of the stream. + * May be helpful if you need to embed a piece of + * base64-encoded data in a stream. + * + * @throws java.io.IOException if there's an error flushing + * @since 1.5.1 + */ + public void suspendEncoding() throws java.io.IOException { + flushBase64(); + this.suspendEncoding = true; + } // end suspendEncoding + + + /** + * Resumes encoding of the stream. + * May be helpful if you need to embed a piece of + * base64-encoded data in a stream. + * + * @since 1.5.1 + */ + public void resumeEncoding() { + this.suspendEncoding = false; + } // end resumeEncoding + + + + } // end inner class OutputStream + + +} // end class Base64 diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/util/BlacklistingTrustManager.java b/libsignal/src/main/java/org/session/libsignal/service/internal/util/BlacklistingTrustManager.java new file mode 100644 index 000000000..40b3e9eb5 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/util/BlacklistingTrustManager.java @@ -0,0 +1,110 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.internal.util; + +import org.session.libsignal.libsignal.util.Pair; +import org.session.libsignal.service.api.push.TrustStore; + +import java.io.IOException; +import java.io.InputStream; +import java.math.BigInteger; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.LinkedList; +import java.util.List; + +import javax.net.ssl.TrustManager; +import javax.net.ssl.TrustManagerFactory; +import javax.net.ssl.X509TrustManager; + +/** + * Trust manager that defers to a system X509 trust manager, and + * additionally rejects certificates if they have a blacklisted + * serial. + * + * @author Moxie Marlinspike + */ +public class BlacklistingTrustManager implements X509TrustManager { + + private static final List> BLACKLIST = new LinkedList>() {{ + add(new Pair("Open Whisper Systems", new BigInteger("4098"))); + }}; + + public static TrustManager[] createFor(TrustManager[] trustManagers) { + for (TrustManager trustManager : trustManagers) { + if (trustManager instanceof X509TrustManager) { + TrustManager[] results = new BlacklistingTrustManager[1]; + results[0] = new BlacklistingTrustManager((X509TrustManager)trustManager); + + return results; + } + } + + throw new AssertionError("No X509 Trust Managers!"); + } + + public static TrustManager[] createFor(TrustStore trustStore) { + try { + InputStream keyStoreInputStream = trustStore.getKeyStoreInputStream(); + KeyStore keyStore = KeyStore.getInstance("BKS"); + + keyStore.load(keyStoreInputStream, trustStore.getKeyStorePassword().toCharArray()); + + TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("X509"); + trustManagerFactory.init(keyStore); + + return BlacklistingTrustManager.createFor(trustManagerFactory.getTrustManagers()); + } catch (KeyStoreException e) { + throw new AssertionError(e); + } catch (CertificateException e) { + throw new AssertionError(e); + } catch (IOException e) { + throw new AssertionError(e); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } + } + + private final X509TrustManager trustManager; + + public BlacklistingTrustManager(X509TrustManager trustManager) { + this.trustManager = trustManager; + } + + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) + throws CertificateException + { + trustManager.checkClientTrusted(chain, authType); + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) + throws CertificateException + { + trustManager.checkServerTrusted(chain, authType); + + for (X509Certificate certificate : chain) { + for (Pair blacklistedSerial : BLACKLIST) { + if (certificate.getIssuerDN().getName().equals(blacklistedSerial.first()) && + certificate.getSerialNumber().equals(blacklistedSerial.second())) + { + throw new CertificateException("Blacklisted Serial: " + certificate.getSerialNumber()); + } + } + } + + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + return trustManager.getAcceptedIssuers(); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/util/ContentLengthInputStream.java b/libsignal/src/main/java/org/session/libsignal/service/internal/util/ContentLengthInputStream.java new file mode 100644 index 000000000..71322466b --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/util/ContentLengthInputStream.java @@ -0,0 +1,41 @@ +package org.session.libsignal.service.internal.util; + + +import java.io.FilterInputStream; +import java.io.IOException; +import java.io.InputStream; + +public class ContentLengthInputStream extends FilterInputStream { + + private long bytesRemaining; + + public ContentLengthInputStream(InputStream inputStream, long contentLength) { + super(inputStream); + this.bytesRemaining = contentLength; + } + + @Override + public int read() throws IOException { + if (bytesRemaining == 0) return -1; + int result = super.read(); + bytesRemaining--; + + return result; + } + + @Override + public int read(byte[] buffer) throws IOException { + return read(buffer, 0, buffer.length); + } + + @Override + public int read(byte[] buffer, int offset, int length) throws IOException { + if (bytesRemaining == 0) return -1; + + int result = super.read(buffer, offset, Math.min(length, Util.toIntExact(bytesRemaining))); + + bytesRemaining -= result; + return result; + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/util/Hex.java b/libsignal/src/main/java/org/session/libsignal/service/internal/util/Hex.java new file mode 100644 index 000000000..a1f4e695b --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/util/Hex.java @@ -0,0 +1,128 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.internal.util; + +import java.io.IOException; + +/** + * Utility for generating hex dumps. + */ +public class Hex { + + private final static int HEX_DIGITS_START = 10; + private final static int ASCII_TEXT_START = HEX_DIGITS_START + (16*2 + (16/2)); + + final static String EOL = System.getProperty("line.separator"); + + private final static char[] HEX_DIGITS = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' + }; + + public static String toString(byte[] bytes) { + return toString(bytes, 0, bytes.length); + } + + public static String toString(byte[] bytes, int offset, int length) { + StringBuffer buf = new StringBuffer(); + for (int i = 0; i < length; i++) { + appendHexChar(buf, bytes[offset + i]); + buf.append(' '); + } + return buf.toString(); + } + + public static String toStringCondensed(byte[] bytes) { + StringBuffer buf = new StringBuffer(); + for (int i=0;i> 1]; + + // two characters form the hex value. + for (int i = 0, j = 0; j < len; i++) { + int f = Character.digit(data[j], 16) << 4; + j++; + f = f | Character.digit(data[j], 16); + j++; + out[i] = (byte) (f & 0xFF); + } + + return out; + } + + public static String dump(byte[] bytes) { + return dump(bytes, 0, bytes.length); + } + + public static String dump(byte[] bytes, int offset, int length) { + StringBuffer buf = new StringBuffer(); + int lines = ((length - 1) / 16) + 1; + int lineOffset; + int lineLength; + + for (int i = 0; i < lines; i++) { + lineOffset = (i * 16) + offset; + lineLength = Math.min(16, (length - (i * 16))); + appendDumpLine(buf, i, bytes, lineOffset, lineLength); + buf.append(EOL); + } + + return buf.toString(); + } + + private static void appendDumpLine(StringBuffer buf, int line, byte[] bytes, int lineOffset, int lineLength) { + buf.append(HEX_DIGITS[(line >> 28) & 0xf]); + buf.append(HEX_DIGITS[(line >> 24) & 0xf]); + buf.append(HEX_DIGITS[(line >> 20) & 0xf]); + buf.append(HEX_DIGITS[(line >> 16) & 0xf]); + buf.append(HEX_DIGITS[(line >> 12) & 0xf]); + buf.append(HEX_DIGITS[(line >> 8) & 0xf]); + buf.append(HEX_DIGITS[(line >> 4) & 0xf]); + buf.append(HEX_DIGITS[(line ) & 0xf]); + buf.append(": "); + + for (int i = 0; i < 16; i++) { + int idx = i + lineOffset; + if (i < lineLength) { + int b = bytes[idx]; + appendHexChar(buf, b); + } else { + buf.append(" "); + } + if ((i % 2) == 1) { + buf.append(' '); + } + } + + for (int i = 0; i < 16 && i < lineLength; i++) { + int idx = i + lineOffset; + int b = bytes[idx]; + if (b >= 0x20 && b <= 0x7e) { + buf.append((char)b); + } else { + buf.append('.'); + } + } + } + + private static void appendHexChar(StringBuffer buf, int b) { + buf.append(HEX_DIGITS[(b >> 4) & 0xf]); + buf.append(HEX_DIGITS[b & 0xf]); + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/util/JsonUtil.java b/libsignal/src/main/java/org/session/libsignal/service/internal/util/JsonUtil.java new file mode 100644 index 000000000..0325ebe18 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/util/JsonUtil.java @@ -0,0 +1,78 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.internal.util; + + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializerProvider; + +import org.session.libsignal.libsignal.IdentityKey; +import org.session.libsignal.libsignal.InvalidKeyException; +import org.session.libsignal.libsignal.logging.Log; + +import java.io.IOException; + +public class JsonUtil { + + private static final String TAG = JsonUtil.class.getSimpleName(); + + private static final ObjectMapper objectMapper = new ObjectMapper(); + + static { + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + } + + public static String toJson(Object object) { + try { + return objectMapper.writeValueAsString(object); + } catch (JsonProcessingException e) { + Log.w(TAG, e); + return ""; + } + } + + public static T fromJson(String json, Class clazz) + throws IOException + { + return objectMapper.readValue(json, clazz); + } + + public static JsonNode fromJson(String json) throws IOException { + return objectMapper.readTree(json); + } + + public static class IdentityKeySerializer extends JsonSerializer { + @Override + public void serialize(IdentityKey value, JsonGenerator gen, SerializerProvider serializers) + throws IOException + { + gen.writeString(Base64.encodeBytesWithoutPadding(value.serialize())); + } + } + + public static class IdentityKeyDeserializer extends JsonDeserializer { + @Override + public IdentityKey deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + try { + return new IdentityKey(Base64.decodeWithoutPadding(p.getValueAsString()), 0); + } catch (InvalidKeyException e) { + throw new IOException(e); + } + } + } + + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/util/StaticCredentialsProvider.java b/libsignal/src/main/java/org/session/libsignal/service/internal/util/StaticCredentialsProvider.java new file mode 100644 index 000000000..38fd13e69 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/util/StaticCredentialsProvider.java @@ -0,0 +1,37 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.internal.util; + +import org.session.libsignal.service.api.util.CredentialsProvider; + +public class StaticCredentialsProvider implements CredentialsProvider { + + private final String user; + private final String password; + private final String signalingKey; + + public StaticCredentialsProvider(String user, String password, String signalingKey) { + this.user = user; + this.password = password; + this.signalingKey = signalingKey; + } + + @Override + public String getUser() { + return user; + } + + @Override + public String getPassword() { + return password; + } + + @Override + public String getSignalingKey() { + return signalingKey; + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/util/Util.java b/libsignal/src/main/java/org/session/libsignal/service/internal/util/Util.java new file mode 100644 index 000000000..71813ab3a --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/util/Util.java @@ -0,0 +1,154 @@ +/** + * Copyright (C) 2014-2016 Open Whisper Systems + * + * Licensed according to the LICENSE file in this repository. + */ + +package org.session.libsignal.service.internal.util; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +public class Util { + + public static byte[] join(byte[]... input) { + try { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + for (byte[] part : input) { + baos.write(part); + } + + return baos.toByteArray(); + } catch (IOException e) { + throw new AssertionError(e); + } + } + + public static String join(Collection list, String delimiter) { + StringBuilder result = new StringBuilder(); + int i = 0; + + for (String item : list) { + result.append(item); + + if (++i < list.size()) + result.append(delimiter); + } + + return result.toString(); + } + + + public static byte[][] split(byte[] input, int firstLength, int secondLength) { + byte[][] parts = new byte[2][]; + + parts[0] = new byte[firstLength]; + System.arraycopy(input, 0, parts[0], 0, firstLength); + + parts[1] = new byte[secondLength]; + System.arraycopy(input, firstLength, parts[1], 0, secondLength); + + return parts; + } + + public static byte[] trim(byte[] input, int length) { + byte[] result = new byte[length]; + System.arraycopy(input, 0, result, 0, result.length); + + return result; + } + + public static boolean isEmpty(String value) { + return value == null || value.trim().length() == 0; + } + + public static byte[] getSecretBytes(int size) { + try { + byte[] secret = new byte[size]; + SecureRandom.getInstance("SHA1PRNG").nextBytes(secret); + return secret; + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } + } + + public static byte[] getRandomLengthBytes(int maxSize) { + SecureRandom secureRandom = new SecureRandom(); + byte[] result = new byte[secureRandom.nextInt(maxSize) + 1]; + secureRandom.nextBytes(result); + return result; + } + + public static String readFully(InputStream in) throws IOException { + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + byte[] buffer = new byte[4096]; + int read; + + while ((read = in.read(buffer)) != -1) { + bout.write(buffer, 0, read); + } + + in.close(); + + return new String(bout.toByteArray()); + } + + public static void readFully(InputStream in, byte[] buffer) throws IOException { + int offset = 0; + + for (;;) { + int read = in.read(buffer, offset, buffer.length - offset); + + if (read + offset < buffer.length) offset += read; + else return; + } + } + + public static void copy(InputStream in, OutputStream out) throws IOException { + byte[] buffer = new byte[4096]; + int read; + + while ((read = in.read(buffer)) != -1) { + out.write(buffer, 0, read); + } + + in.close(); + out.close(); + } + + public static void sleep(long millis) { + try { + Thread.sleep(millis); + } catch (InterruptedException e) { + throw new AssertionError(e); + } + } + + public static void wait(Object lock, long millis) { + try { + lock.wait(millis); + } catch (InterruptedException e) { + throw new AssertionError(e); + } + } + + public static int toIntExact(long value) { + if ((int)value != value) { + throw new ArithmeticException("integer overflow"); + } + return (int)value; + } + + public static List immutableList(T... elements) { + return Collections.unmodifiableList(Arrays.asList(elements.clone())); + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/util/concurrent/ListenableFuture.java b/libsignal/src/main/java/org/session/libsignal/service/internal/util/concurrent/ListenableFuture.java new file mode 100644 index 000000000..b28438789 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/util/concurrent/ListenableFuture.java @@ -0,0 +1,13 @@ +package org.session.libsignal.service.internal.util.concurrent; + +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; + +public interface ListenableFuture extends Future { + void addListener(Listener listener); + + public interface Listener { + public void onSuccess(T result); + public void onFailure(ExecutionException e); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/util/concurrent/SettableFuture.java b/libsignal/src/main/java/org/session/libsignal/service/internal/util/concurrent/SettableFuture.java new file mode 100644 index 000000000..0f2c0c254 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/util/concurrent/SettableFuture.java @@ -0,0 +1,117 @@ +package org.session.libsignal.service.internal.util.concurrent; + +import org.session.libsignal.service.internal.util.concurrent.ListenableFuture; + +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +public class SettableFuture implements ListenableFuture { + + private final List> listeners = new LinkedList>(); + + private boolean completed; + private boolean canceled; + private volatile T result; + private volatile Throwable exception; + + @Override + public synchronized boolean cancel(boolean mayInterruptIfRunning) { + if (!completed && !canceled) { + canceled = true; + return true; + } + + return false; + } + + @Override + public synchronized boolean isCancelled() { + return canceled; + } + + @Override + public synchronized boolean isDone() { + return completed; + } + + public boolean set(T result) { + synchronized (this) { + if (completed || canceled) return false; + + this.result = result; + this.completed = true; + + notifyAll(); + } + + notifyAllListeners(); + return true; + } + + public boolean setException(Throwable throwable) { + synchronized (this) { + if (completed || canceled) return false; + + this.exception = throwable; + this.completed = true; + + notifyAll(); + } + + notifyAllListeners(); + return true; + } + + @Override + public synchronized T get() throws InterruptedException, ExecutionException { + while (!completed) wait(); + + if (exception != null) throw new ExecutionException(exception); + else return result; + } + + @Override + public synchronized T get(long timeout, TimeUnit unit) + throws InterruptedException, ExecutionException, TimeoutException + { + long startTime = System.currentTimeMillis(); + + while (!completed && System.currentTimeMillis() - startTime < unit.toMillis(timeout)) { + wait(unit.toMillis(timeout)); + } + + if (!completed) throw new TimeoutException(); + else return get(); + } + + @Override + public void addListener(Listener listener) { + synchronized (this) { + listeners.add(listener); + + if (!completed) return; + } + + notifyListener(listener); + } + + private void notifyAllListeners() { + List> localListeners; + + synchronized (this) { + localListeners = new LinkedList>(listeners); + } + + for (Listener listener : localListeners) { + notifyListener(listener); + } + } + + private void notifyListener(Listener listener) { + if (exception != null) listener.onFailure(new ExecutionException(exception)); + else listener.onSuccess(result); + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/websocket/WebSocketConnection.java b/libsignal/src/main/java/org/session/libsignal/service/internal/websocket/WebSocketConnection.java new file mode 100644 index 000000000..684193b22 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/websocket/WebSocketConnection.java @@ -0,0 +1,340 @@ +package org.session.libsignal.service.internal.websocket; + +import com.google.protobuf.InvalidProtocolBufferException; + +import org.session.libsignal.libsignal.logging.Log; +import org.session.libsignal.libsignal.util.Pair; +import org.session.libsignal.libsignal.util.guava.Optional; +import org.session.libsignal.service.api.push.TrustStore; +import org.session.libsignal.service.api.util.CredentialsProvider; +import org.session.libsignal.service.api.util.SleepTimer; +import org.session.libsignal.service.api.util.Tls12SocketFactory; +import org.session.libsignal.service.api.websocket.ConnectivityListener; +import org.session.libsignal.service.internal.util.BlacklistingTrustManager; +import org.session.libsignal.service.internal.util.Util; +import org.session.libsignal.service.internal.util.concurrent.SettableFuture; + +import java.io.IOException; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.Map; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.concurrent.atomic.AtomicBoolean; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +import okhttp3.ConnectionSpec; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.WebSocket; +import okhttp3.WebSocketListener; +import okio.ByteString; + +import static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage; +import static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage; +import static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage; + +public class WebSocketConnection extends WebSocketListener { + + private static final String TAG = WebSocketConnection.class.getSimpleName(); + private static final int KEEPALIVE_TIMEOUT_SECONDS = 55; + + private final LinkedList incomingRequests = new LinkedList(); + private final Map>> outgoingRequests = new HashMap>>(); + + private final String wsUri; + private final TrustStore trustStore; + private final Optional credentialsProvider; + private final String userAgent; + private final ConnectivityListener listener; + private final SleepTimer sleepTimer; + + private WebSocket client; + private KeepAliveSender keepAliveSender; + private int attempts; + private boolean connected; + + public WebSocketConnection(String httpUri, + TrustStore trustStore, + Optional credentialsProvider, + String userAgent, + ConnectivityListener listener, + SleepTimer timer) + { + this.trustStore = trustStore; + this.credentialsProvider = credentialsProvider; + this.userAgent = userAgent; + this.listener = listener; + this.sleepTimer = timer; + this.attempts = 0; + this.connected = false; + + String uri = httpUri.replace("https://", "wss://").replace("http://", "ws://"); + + if (credentialsProvider.isPresent()) this.wsUri = uri + "/v1/websocket/?login=%s&password=%s"; + else this.wsUri = uri + "/v1/websocket/"; + } + + public synchronized void connect() { + Log.w(TAG, "WSC connect()..."); + + if (client == null) { + String filledUri; + + if (credentialsProvider.isPresent()) { + filledUri = String.format(wsUri, credentialsProvider.get().getUser(), credentialsProvider.get().getPassword()); + } else { + filledUri = wsUri; + } + + Pair socketFactory = createTlsSocketFactory(trustStore); + + OkHttpClient okHttpClient = new OkHttpClient.Builder() + .sslSocketFactory(new Tls12SocketFactory(socketFactory.first()), socketFactory.second()) + .connectionSpecs(Util.immutableList(ConnectionSpec.RESTRICTED_TLS)) + .readTimeout(KEEPALIVE_TIMEOUT_SECONDS + 10, TimeUnit.SECONDS) + .connectTimeout(KEEPALIVE_TIMEOUT_SECONDS + 10, TimeUnit.SECONDS) + .build(); + + Request.Builder requestBuilder = new Request.Builder().url(filledUri); + + if (userAgent != null) { + requestBuilder.addHeader("X-Signal-Agent", userAgent); + } + + if (listener != null) { + listener.onConnecting(); + } + + this.connected = false; + this.client = okHttpClient.newWebSocket(requestBuilder.build(), this); + } + } + + public synchronized void disconnect() { + Log.w(TAG, "WSC disconnect()..."); + + if (client != null) { + client.close(1000, "OK"); + client = null; + connected = false; + } + + if (keepAliveSender != null) { + keepAliveSender.shutdown(); + keepAliveSender = null; + } + } + + public synchronized WebSocketRequestMessage readRequest(long timeoutMillis) + throws TimeoutException, IOException + { + if (client == null) { + throw new IOException("Connection closed!"); + } + + long startTime = System.currentTimeMillis(); + + while (client != null && incomingRequests.isEmpty() && elapsedTime(startTime) < timeoutMillis) { + Util.wait(this, Math.max(1, timeoutMillis - elapsedTime(startTime))); + } + + if (incomingRequests.isEmpty() && client == null) throw new IOException("Connection closed!"); + else if (incomingRequests.isEmpty()) throw new TimeoutException("Timeout exceeded"); + else return incomingRequests.removeFirst(); + } + + public synchronized Future> sendRequest(WebSocketRequestMessage request) throws IOException { + if (client == null || !connected) throw new IOException("No connection!"); + + WebSocketMessage message = WebSocketMessage.newBuilder() + .setType(WebSocketMessage.Type.REQUEST) + .setRequest(request) + .build(); + + SettableFuture> future = new SettableFuture>(); + outgoingRequests.put(request.getId(), future); + + if (!client.send(ByteString.of(message.toByteArray()))) { + throw new IOException("Write failed!"); + } + + return future; + } + + public synchronized void sendResponse(WebSocketResponseMessage response) throws IOException { + if (client == null) { + throw new IOException("Connection closed!"); + } + + WebSocketMessage message = WebSocketMessage.newBuilder() + .setType(WebSocketMessage.Type.RESPONSE) + .setResponse(response) + .build(); + + if (!client.send(ByteString.of(message.toByteArray()))) { + throw new IOException("Write failed!"); + } + } + + private synchronized void sendKeepAlive() throws IOException { + if (keepAliveSender != null && client != null) { + byte[] message = WebSocketMessage.newBuilder() + .setType(WebSocketMessage.Type.REQUEST) + .setRequest(WebSocketRequestMessage.newBuilder() + .setId(System.currentTimeMillis()) + .setPath("/v1/keepalive") + .setVerb("GET") + .build()).build() + .toByteArray(); + + if (!client.send(ByteString.of(message))) { + throw new IOException("Write failed!"); + } + } + } + + @Override + public synchronized void onOpen(WebSocket webSocket, Response response) { + if (client != null && keepAliveSender == null) { + Log.w(TAG, "onConnected()"); + attempts = 0; + connected = true; + keepAliveSender = new KeepAliveSender(); + keepAliveSender.start(); + + if (listener != null) listener.onConnected(); + } + } + + @Override + public synchronized void onMessage(WebSocket webSocket, ByteString payload) { + Log.w(TAG, "WSC onMessage()"); + try { + WebSocketMessage message = WebSocketMessage.parseFrom(payload.toByteArray()); + + Log.w(TAG, "Message Type: " + message.getType().getNumber()); + + if (message.getType().getNumber() == WebSocketMessage.Type.REQUEST_VALUE) { + incomingRequests.add(message.getRequest()); + } else if (message.getType().getNumber() == WebSocketMessage.Type.RESPONSE_VALUE) { + SettableFuture> listener = outgoingRequests.get(message.getResponse().getId()); + if (listener != null) listener.set(new Pair(message.getResponse().getStatus(), + new String(message.getResponse().getBody().toByteArray()))); + } + + notifyAll(); + } catch (InvalidProtocolBufferException e) { + Log.w(TAG, e); + } + } + + @Override + public synchronized void onClosed(WebSocket webSocket, int code, String reason) { + Log.w(TAG, "onClose()..."); + this.connected = false; + + Iterator>>> iterator = outgoingRequests.entrySet().iterator(); + + while (iterator.hasNext()) { + Map.Entry>> entry = iterator.next(); + entry.getValue().setException(new IOException("Closed: " + code + ", " + reason)); + iterator.remove(); + } + + if (keepAliveSender != null) { + keepAliveSender.shutdown(); + keepAliveSender = null; + } + + if (listener != null) { + listener.onDisconnected(); + } + + Util.wait(this, Math.min(++attempts * 200, TimeUnit.SECONDS.toMillis(15))); + + if (client != null) { + client.close(1000, "OK"); + client = null; + connected = false; + connect(); + } + + notifyAll(); + } + + @Override + public synchronized void onFailure(WebSocket webSocket, Throwable t, Response response) { + Log.w(TAG, "onFailure()"); + Log.w(TAG, t); + + if (response != null && (response.code() == 401 || response.code() == 403)) { + if (listener != null) listener.onAuthenticationFailure(); + } + + if (client != null) { + onClosed(webSocket, 1000, "OK"); + } + } + + @Override + public void onMessage(WebSocket webSocket, String text) { + Log.w(TAG, "onMessage(text)! " + text); + } + + @Override + public synchronized void onClosing(WebSocket webSocket, int code, String reason) { + Log.w(TAG, "onClosing()!..."); + webSocket.close(1000, "OK"); + } + + private long elapsedTime(long startTime) { + return System.currentTimeMillis() - startTime; + } + + private Pair createTlsSocketFactory(TrustStore trustStore) { + try { + SSLContext context = SSLContext.getInstance("TLS"); + TrustManager[] trustManagers = BlacklistingTrustManager.createFor(trustStore); + context.init(null, trustManagers, null); + + return new Pair(context.getSocketFactory(), (X509TrustManager)trustManagers[0]); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } catch (KeyManagementException e) { + throw new AssertionError(e); + } + } + + private class KeepAliveSender extends Thread { + + private AtomicBoolean stop = new AtomicBoolean(false); + + public void run() { + while (!stop.get()) { + try { + sleepTimer.sleep(TimeUnit.SECONDS.toMillis(KEEPALIVE_TIMEOUT_SECONDS)); + + Log.w(TAG, "Sending keep alive..."); + sendKeepAlive(); + } catch (Throwable e) { + Log.w(TAG, e); + } + } + } + + public void shutdown() { + stop.set(true); + } + } + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/websocket/WebSocketEventListener.java b/libsignal/src/main/java/org/session/libsignal/service/internal/websocket/WebSocketEventListener.java new file mode 100644 index 000000000..8586be9ab --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/websocket/WebSocketEventListener.java @@ -0,0 +1,9 @@ +package org.session.libsignal.service.internal.websocket; + +public interface WebSocketEventListener { + + public void onMessage(byte[] payload); + public void onClose(); + public void onConnected(); + +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/internal/websocket/WebSocketProtos.java b/libsignal/src/main/java/org/session/libsignal/service/internal/websocket/WebSocketProtos.java new file mode 100644 index 000000000..d711e0cd0 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/internal/websocket/WebSocketProtos.java @@ -0,0 +1,2842 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: WebSocketResources.proto + +package org.session.libsignal.service.internal.websocket; + +public final class WebSocketProtos { + private WebSocketProtos() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + } + public interface WebSocketRequestMessageOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional string verb = 1; + /** + * optional string verb = 1; + */ + boolean hasVerb(); + /** + * optional string verb = 1; + */ + String getVerb(); + /** + * optional string verb = 1; + */ + com.google.protobuf.ByteString + getVerbBytes(); + + // optional string path = 2; + /** + * optional string path = 2; + */ + boolean hasPath(); + /** + * optional string path = 2; + */ + String getPath(); + /** + * optional string path = 2; + */ + com.google.protobuf.ByteString + getPathBytes(); + + // optional bytes body = 3; + /** + * optional bytes body = 3; + */ + boolean hasBody(); + /** + * optional bytes body = 3; + */ + com.google.protobuf.ByteString getBody(); + + // repeated string headers = 5; + /** + * repeated string headers = 5; + */ + java.util.List + getHeadersList(); + /** + * repeated string headers = 5; + */ + int getHeadersCount(); + /** + * repeated string headers = 5; + */ + String getHeaders(int index); + /** + * repeated string headers = 5; + */ + com.google.protobuf.ByteString + getHeadersBytes(int index); + + // optional uint64 id = 4; + /** + * optional uint64 id = 4; + */ + boolean hasId(); + /** + * optional uint64 id = 4; + */ + long getId(); + } + /** + * Protobuf type {@code signalservice.WebSocketRequestMessage} + */ + public static final class WebSocketRequestMessage extends + com.google.protobuf.GeneratedMessage + implements WebSocketRequestMessageOrBuilder { + // Use WebSocketRequestMessage.newBuilder() to construct. + private WebSocketRequestMessage(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private WebSocketRequestMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final WebSocketRequestMessage defaultInstance; + public static WebSocketRequestMessage getDefaultInstance() { + return defaultInstance; + } + + public WebSocketRequestMessage getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private WebSocketRequestMessage( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + bitField0_ |= 0x00000001; + verb_ = input.readBytes(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + path_ = input.readBytes(); + break; + } + case 26: { + bitField0_ |= 0x00000004; + body_ = input.readBytes(); + break; + } + case 32: { + bitField0_ |= 0x00000008; + id_ = input.readUInt64(); + break; + } + case 42: { + if (!((mutable_bitField0_ & 0x00000008) == 0x00000008)) { + headers_ = new com.google.protobuf.LazyStringArrayList(); + mutable_bitField0_ |= 0x00000008; + } + headers_.add(input.readBytes()); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000008) == 0x00000008)) { + headers_ = new com.google.protobuf.UnmodifiableLazyStringList(headers_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.websocket.WebSocketProtos.internal_static_signalservice_WebSocketRequestMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.websocket.WebSocketProtos.internal_static_signalservice_WebSocketRequestMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage.class, org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public WebSocketRequestMessage parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new WebSocketRequestMessage(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional string verb = 1; + public static final int VERB_FIELD_NUMBER = 1; + private Object verb_; + /** + * optional string verb = 1; + */ + public boolean hasVerb() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string verb = 1; + */ + public String getVerb() { + Object ref = verb_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + verb_ = s; + } + return s; + } + } + /** + * optional string verb = 1; + */ + public com.google.protobuf.ByteString + getVerbBytes() { + Object ref = verb_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + verb_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional string path = 2; + public static final int PATH_FIELD_NUMBER = 2; + private Object path_; + /** + * optional string path = 2; + */ + public boolean hasPath() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string path = 2; + */ + public String getPath() { + Object ref = path_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + path_ = s; + } + return s; + } + } + /** + * optional string path = 2; + */ + public com.google.protobuf.ByteString + getPathBytes() { + Object ref = path_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + path_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // optional bytes body = 3; + public static final int BODY_FIELD_NUMBER = 3; + private com.google.protobuf.ByteString body_; + /** + * optional bytes body = 3; + */ + public boolean hasBody() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes body = 3; + */ + public com.google.protobuf.ByteString getBody() { + return body_; + } + + // repeated string headers = 5; + public static final int HEADERS_FIELD_NUMBER = 5; + private com.google.protobuf.LazyStringList headers_; + /** + * repeated string headers = 5; + */ + public java.util.List + getHeadersList() { + return headers_; + } + /** + * repeated string headers = 5; + */ + public int getHeadersCount() { + return headers_.size(); + } + /** + * repeated string headers = 5; + */ + public String getHeaders(int index) { + return headers_.get(index); + } + /** + * repeated string headers = 5; + */ + public com.google.protobuf.ByteString + getHeadersBytes(int index) { + return headers_.getByteString(index); + } + + // optional uint64 id = 4; + public static final int ID_FIELD_NUMBER = 4; + private long id_; + /** + * optional uint64 id = 4; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional uint64 id = 4; + */ + public long getId() { + return id_; + } + + private void initFields() { + verb_ = ""; + path_ = ""; + body_ = com.google.protobuf.ByteString.EMPTY; + headers_ = com.google.protobuf.LazyStringArrayList.EMPTY; + id_ = 0L; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBytes(1, getVerbBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, getPathBytes()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(3, body_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeUInt64(4, id_); + } + for (int i = 0; i < headers_.size(); i++) { + output.writeBytes(5, headers_.getByteString(i)); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, getVerbBytes()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, getPathBytes()); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, body_); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(4, id_); + } + { + int dataSize = 0; + for (int i = 0; i < headers_.size(); i++) { + dataSize += com.google.protobuf.CodedOutputStream + .computeBytesSizeNoTag(headers_.getByteString(i)); + } + size += dataSize; + size += 1 * getHeadersList().size(); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.WebSocketRequestMessage} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.websocket.WebSocketProtos.internal_static_signalservice_WebSocketRequestMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.websocket.WebSocketProtos.internal_static_signalservice_WebSocketRequestMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage.class, org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + verb_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + path_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + body_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000004); + headers_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000008); + id_ = 0L; + bitField0_ = (bitField0_ & ~0x00000010); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.websocket.WebSocketProtos.internal_static_signalservice_WebSocketRequestMessage_descriptor; + } + + public org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage getDefaultInstanceForType() { + return org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage build() { + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage buildPartial() { + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage result = new org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.verb_ = verb_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.path_ = path_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.body_ = body_; + if (((bitField0_ & 0x00000008) == 0x00000008)) { + headers_ = new com.google.protobuf.UnmodifiableLazyStringList( + headers_); + bitField0_ = (bitField0_ & ~0x00000008); + } + result.headers_ = headers_; + if (((from_bitField0_ & 0x00000010) == 0x00000010)) { + to_bitField0_ |= 0x00000008; + } + result.id_ = id_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage) { + return mergeFrom((org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage other) { + if (other == org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage.getDefaultInstance()) return this; + if (other.hasVerb()) { + bitField0_ |= 0x00000001; + verb_ = other.verb_; + onChanged(); + } + if (other.hasPath()) { + bitField0_ |= 0x00000002; + path_ = other.path_; + onChanged(); + } + if (other.hasBody()) { + setBody(other.getBody()); + } + if (!other.headers_.isEmpty()) { + if (headers_.isEmpty()) { + headers_ = other.headers_; + bitField0_ = (bitField0_ & ~0x00000008); + } else { + ensureHeadersIsMutable(); + headers_.addAll(other.headers_); + } + onChanged(); + } + if (other.hasId()) { + setId(other.getId()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional string verb = 1; + private Object verb_ = ""; + /** + * optional string verb = 1; + */ + public boolean hasVerb() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional string verb = 1; + */ + public String getVerb() { + Object ref = verb_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + verb_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string verb = 1; + */ + public com.google.protobuf.ByteString + getVerbBytes() { + Object ref = verb_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + verb_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string verb = 1; + */ + public Builder setVerb( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + verb_ = value; + onChanged(); + return this; + } + /** + * optional string verb = 1; + */ + public Builder clearVerb() { + bitField0_ = (bitField0_ & ~0x00000001); + verb_ = getDefaultInstance().getVerb(); + onChanged(); + return this; + } + /** + * optional string verb = 1; + */ + public Builder setVerbBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + verb_ = value; + onChanged(); + return this; + } + + // optional string path = 2; + private Object path_ = ""; + /** + * optional string path = 2; + */ + public boolean hasPath() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional string path = 2; + */ + public String getPath() { + Object ref = path_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + path_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string path = 2; + */ + public com.google.protobuf.ByteString + getPathBytes() { + Object ref = path_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + path_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string path = 2; + */ + public Builder setPath( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + path_ = value; + onChanged(); + return this; + } + /** + * optional string path = 2; + */ + public Builder clearPath() { + bitField0_ = (bitField0_ & ~0x00000002); + path_ = getDefaultInstance().getPath(); + onChanged(); + return this; + } + /** + * optional string path = 2; + */ + public Builder setPathBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + path_ = value; + onChanged(); + return this; + } + + // optional bytes body = 3; + private com.google.protobuf.ByteString body_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes body = 3; + */ + public boolean hasBody() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bytes body = 3; + */ + public com.google.protobuf.ByteString getBody() { + return body_; + } + /** + * optional bytes body = 3; + */ + public Builder setBody(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + body_ = value; + onChanged(); + return this; + } + /** + * optional bytes body = 3; + */ + public Builder clearBody() { + bitField0_ = (bitField0_ & ~0x00000004); + body_ = getDefaultInstance().getBody(); + onChanged(); + return this; + } + + // repeated string headers = 5; + private com.google.protobuf.LazyStringList headers_ = com.google.protobuf.LazyStringArrayList.EMPTY; + private void ensureHeadersIsMutable() { + if (!((bitField0_ & 0x00000008) == 0x00000008)) { + headers_ = new com.google.protobuf.LazyStringArrayList(headers_); + bitField0_ |= 0x00000008; + } + } + /** + * repeated string headers = 5; + */ + public java.util.List + getHeadersList() { + return java.util.Collections.unmodifiableList(headers_); + } + /** + * repeated string headers = 5; + */ + public int getHeadersCount() { + return headers_.size(); + } + /** + * repeated string headers = 5; + */ + public String getHeaders(int index) { + return headers_.get(index); + } + /** + * repeated string headers = 5; + */ + public com.google.protobuf.ByteString + getHeadersBytes(int index) { + return headers_.getByteString(index); + } + /** + * repeated string headers = 5; + */ + public Builder setHeaders( + int index, String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureHeadersIsMutable(); + headers_.set(index, value); + onChanged(); + return this; + } + /** + * repeated string headers = 5; + */ + public Builder addHeaders( + String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureHeadersIsMutable(); + headers_.add(value); + onChanged(); + return this; + } + /** + * repeated string headers = 5; + */ + public Builder addAllHeaders( + Iterable values) { + ensureHeadersIsMutable(); + super.addAll(values, headers_); + onChanged(); + return this; + } + /** + * repeated string headers = 5; + */ + public Builder clearHeaders() { + headers_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000008); + onChanged(); + return this; + } + /** + * repeated string headers = 5; + */ + public Builder addHeadersBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + ensureHeadersIsMutable(); + headers_.add(value); + onChanged(); + return this; + } + + // optional uint64 id = 4; + private long id_ ; + /** + * optional uint64 id = 4; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional uint64 id = 4; + */ + public long getId() { + return id_; + } + /** + * optional uint64 id = 4; + */ + public Builder setId(long value) { + bitField0_ |= 0x00000010; + id_ = value; + onChanged(); + return this; + } + /** + * optional uint64 id = 4; + */ + public Builder clearId() { + bitField0_ = (bitField0_ & ~0x00000010); + id_ = 0L; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.WebSocketRequestMessage) + } + + static { + defaultInstance = new WebSocketRequestMessage(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.WebSocketRequestMessage) + } + + public interface WebSocketResponseMessageOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional uint64 id = 1; + /** + * optional uint64 id = 1; + */ + boolean hasId(); + /** + * optional uint64 id = 1; + */ + long getId(); + + // optional uint32 status = 2; + /** + * optional uint32 status = 2; + */ + boolean hasStatus(); + /** + * optional uint32 status = 2; + */ + int getStatus(); + + // optional string message = 3; + /** + * optional string message = 3; + */ + boolean hasMessage(); + /** + * optional string message = 3; + */ + String getMessage(); + /** + * optional string message = 3; + */ + com.google.protobuf.ByteString + getMessageBytes(); + + // repeated string headers = 5; + /** + * repeated string headers = 5; + */ + java.util.List + getHeadersList(); + /** + * repeated string headers = 5; + */ + int getHeadersCount(); + /** + * repeated string headers = 5; + */ + String getHeaders(int index); + /** + * repeated string headers = 5; + */ + com.google.protobuf.ByteString + getHeadersBytes(int index); + + // optional bytes body = 4; + /** + * optional bytes body = 4; + */ + boolean hasBody(); + /** + * optional bytes body = 4; + */ + com.google.protobuf.ByteString getBody(); + } + /** + * Protobuf type {@code signalservice.WebSocketResponseMessage} + */ + public static final class WebSocketResponseMessage extends + com.google.protobuf.GeneratedMessage + implements WebSocketResponseMessageOrBuilder { + // Use WebSocketResponseMessage.newBuilder() to construct. + private WebSocketResponseMessage(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private WebSocketResponseMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final WebSocketResponseMessage defaultInstance; + public static WebSocketResponseMessage getDefaultInstance() { + return defaultInstance; + } + + public WebSocketResponseMessage getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private WebSocketResponseMessage( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + id_ = input.readUInt64(); + break; + } + case 16: { + bitField0_ |= 0x00000002; + status_ = input.readUInt32(); + break; + } + case 26: { + bitField0_ |= 0x00000004; + message_ = input.readBytes(); + break; + } + case 34: { + bitField0_ |= 0x00000008; + body_ = input.readBytes(); + break; + } + case 42: { + if (!((mutable_bitField0_ & 0x00000008) == 0x00000008)) { + headers_ = new com.google.protobuf.LazyStringArrayList(); + mutable_bitField0_ |= 0x00000008; + } + headers_.add(input.readBytes()); + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000008) == 0x00000008)) { + headers_ = new com.google.protobuf.UnmodifiableLazyStringList(headers_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.websocket.WebSocketProtos.internal_static_signalservice_WebSocketResponseMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.websocket.WebSocketProtos.internal_static_signalservice_WebSocketResponseMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage.class, org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public WebSocketResponseMessage parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new WebSocketResponseMessage(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // optional uint64 id = 1; + public static final int ID_FIELD_NUMBER = 1; + private long id_; + /** + * optional uint64 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint64 id = 1; + */ + public long getId() { + return id_; + } + + // optional uint32 status = 2; + public static final int STATUS_FIELD_NUMBER = 2; + private int status_; + /** + * optional uint32 status = 2; + */ + public boolean hasStatus() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional uint32 status = 2; + */ + public int getStatus() { + return status_; + } + + // optional string message = 3; + public static final int MESSAGE_FIELD_NUMBER = 3; + private Object message_; + /** + * optional string message = 3; + */ + public boolean hasMessage() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional string message = 3; + */ + public String getMessage() { + Object ref = message_; + if (ref instanceof String) { + return (String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + message_ = s; + } + return s; + } + } + /** + * optional string message = 3; + */ + public com.google.protobuf.ByteString + getMessageBytes() { + Object ref = message_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + message_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + // repeated string headers = 5; + public static final int HEADERS_FIELD_NUMBER = 5; + private com.google.protobuf.LazyStringList headers_; + /** + * repeated string headers = 5; + */ + public java.util.List + getHeadersList() { + return headers_; + } + /** + * repeated string headers = 5; + */ + public int getHeadersCount() { + return headers_.size(); + } + /** + * repeated string headers = 5; + */ + public String getHeaders(int index) { + return headers_.get(index); + } + /** + * repeated string headers = 5; + */ + public com.google.protobuf.ByteString + getHeadersBytes(int index) { + return headers_.getByteString(index); + } + + // optional bytes body = 4; + public static final int BODY_FIELD_NUMBER = 4; + private com.google.protobuf.ByteString body_; + /** + * optional bytes body = 4; + */ + public boolean hasBody() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional bytes body = 4; + */ + public com.google.protobuf.ByteString getBody() { + return body_; + } + + private void initFields() { + id_ = 0L; + status_ = 0; + message_ = ""; + headers_ = com.google.protobuf.LazyStringArrayList.EMPTY; + body_ = com.google.protobuf.ByteString.EMPTY; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeUInt64(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeUInt32(2, status_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeBytes(3, getMessageBytes()); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeBytes(4, body_); + } + for (int i = 0; i < headers_.size(); i++) { + output.writeBytes(5, headers_.getByteString(i)); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(2, status_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, getMessageBytes()); + } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(4, body_); + } + { + int dataSize = 0; + for (int i = 0; i < headers_.size(); i++) { + dataSize += com.google.protobuf.CodedOutputStream + .computeBytesSizeNoTag(headers_.getByteString(i)); + } + size += dataSize; + size += 1 * getHeadersList().size(); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.WebSocketResponseMessage} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.websocket.WebSocketProtos.internal_static_signalservice_WebSocketResponseMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.websocket.WebSocketProtos.internal_static_signalservice_WebSocketResponseMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage.class, org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + id_ = 0L; + bitField0_ = (bitField0_ & ~0x00000001); + status_ = 0; + bitField0_ = (bitField0_ & ~0x00000002); + message_ = ""; + bitField0_ = (bitField0_ & ~0x00000004); + headers_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000008); + body_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000010); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.websocket.WebSocketProtos.internal_static_signalservice_WebSocketResponseMessage_descriptor; + } + + public org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage getDefaultInstanceForType() { + return org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage build() { + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage buildPartial() { + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage result = new org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.id_ = id_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.status_ = status_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.message_ = message_; + if (((bitField0_ & 0x00000008) == 0x00000008)) { + headers_ = new com.google.protobuf.UnmodifiableLazyStringList( + headers_); + bitField0_ = (bitField0_ & ~0x00000008); + } + result.headers_ = headers_; + if (((from_bitField0_ & 0x00000010) == 0x00000010)) { + to_bitField0_ |= 0x00000008; + } + result.body_ = body_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage) { + return mergeFrom((org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage other) { + if (other == org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage.getDefaultInstance()) return this; + if (other.hasId()) { + setId(other.getId()); + } + if (other.hasStatus()) { + setStatus(other.getStatus()); + } + if (other.hasMessage()) { + bitField0_ |= 0x00000004; + message_ = other.message_; + onChanged(); + } + if (!other.headers_.isEmpty()) { + if (headers_.isEmpty()) { + headers_ = other.headers_; + bitField0_ = (bitField0_ & ~0x00000008); + } else { + ensureHeadersIsMutable(); + headers_.addAll(other.headers_); + } + onChanged(); + } + if (other.hasBody()) { + setBody(other.getBody()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional uint64 id = 1; + private long id_ ; + /** + * optional uint64 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional uint64 id = 1; + */ + public long getId() { + return id_; + } + /** + * optional uint64 id = 1; + */ + public Builder setId(long value) { + bitField0_ |= 0x00000001; + id_ = value; + onChanged(); + return this; + } + /** + * optional uint64 id = 1; + */ + public Builder clearId() { + bitField0_ = (bitField0_ & ~0x00000001); + id_ = 0L; + onChanged(); + return this; + } + + // optional uint32 status = 2; + private int status_ ; + /** + * optional uint32 status = 2; + */ + public boolean hasStatus() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional uint32 status = 2; + */ + public int getStatus() { + return status_; + } + /** + * optional uint32 status = 2; + */ + public Builder setStatus(int value) { + bitField0_ |= 0x00000002; + status_ = value; + onChanged(); + return this; + } + /** + * optional uint32 status = 2; + */ + public Builder clearStatus() { + bitField0_ = (bitField0_ & ~0x00000002); + status_ = 0; + onChanged(); + return this; + } + + // optional string message = 3; + private Object message_ = ""; + /** + * optional string message = 3; + */ + public boolean hasMessage() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional string message = 3; + */ + public String getMessage() { + Object ref = message_; + if (!(ref instanceof String)) { + String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + message_ = s; + return s; + } else { + return (String) ref; + } + } + /** + * optional string message = 3; + */ + public com.google.protobuf.ByteString + getMessageBytes() { + Object ref = message_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (String) ref); + message_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string message = 3; + */ + public Builder setMessage( + String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + message_ = value; + onChanged(); + return this; + } + /** + * optional string message = 3; + */ + public Builder clearMessage() { + bitField0_ = (bitField0_ & ~0x00000004); + message_ = getDefaultInstance().getMessage(); + onChanged(); + return this; + } + /** + * optional string message = 3; + */ + public Builder setMessageBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + message_ = value; + onChanged(); + return this; + } + + // repeated string headers = 5; + private com.google.protobuf.LazyStringList headers_ = com.google.protobuf.LazyStringArrayList.EMPTY; + private void ensureHeadersIsMutable() { + if (!((bitField0_ & 0x00000008) == 0x00000008)) { + headers_ = new com.google.protobuf.LazyStringArrayList(headers_); + bitField0_ |= 0x00000008; + } + } + /** + * repeated string headers = 5; + */ + public java.util.List + getHeadersList() { + return java.util.Collections.unmodifiableList(headers_); + } + /** + * repeated string headers = 5; + */ + public int getHeadersCount() { + return headers_.size(); + } + /** + * repeated string headers = 5; + */ + public String getHeaders(int index) { + return headers_.get(index); + } + /** + * repeated string headers = 5; + */ + public com.google.protobuf.ByteString + getHeadersBytes(int index) { + return headers_.getByteString(index); + } + /** + * repeated string headers = 5; + */ + public Builder setHeaders( + int index, String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureHeadersIsMutable(); + headers_.set(index, value); + onChanged(); + return this; + } + /** + * repeated string headers = 5; + */ + public Builder addHeaders( + String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureHeadersIsMutable(); + headers_.add(value); + onChanged(); + return this; + } + /** + * repeated string headers = 5; + */ + public Builder addAllHeaders( + Iterable values) { + ensureHeadersIsMutable(); + super.addAll(values, headers_); + onChanged(); + return this; + } + /** + * repeated string headers = 5; + */ + public Builder clearHeaders() { + headers_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000008); + onChanged(); + return this; + } + /** + * repeated string headers = 5; + */ + public Builder addHeadersBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + ensureHeadersIsMutable(); + headers_.add(value); + onChanged(); + return this; + } + + // optional bytes body = 4; + private com.google.protobuf.ByteString body_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes body = 4; + */ + public boolean hasBody() { + return ((bitField0_ & 0x00000010) == 0x00000010); + } + /** + * optional bytes body = 4; + */ + public com.google.protobuf.ByteString getBody() { + return body_; + } + /** + * optional bytes body = 4; + */ + public Builder setBody(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000010; + body_ = value; + onChanged(); + return this; + } + /** + * optional bytes body = 4; + */ + public Builder clearBody() { + bitField0_ = (bitField0_ & ~0x00000010); + body_ = getDefaultInstance().getBody(); + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:signalservice.WebSocketResponseMessage) + } + + static { + defaultInstance = new WebSocketResponseMessage(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.WebSocketResponseMessage) + } + + public interface WebSocketMessageOrBuilder + extends com.google.protobuf.MessageOrBuilder { + + // optional .signalservice.WebSocketMessage.Type type = 1; + /** + * optional .signalservice.WebSocketMessage.Type type = 1; + */ + boolean hasType(); + /** + * optional .signalservice.WebSocketMessage.Type type = 1; + */ + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage.Type getType(); + + // optional .signalservice.WebSocketRequestMessage request = 2; + /** + * optional .signalservice.WebSocketRequestMessage request = 2; + */ + boolean hasRequest(); + /** + * optional .signalservice.WebSocketRequestMessage request = 2; + */ + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage getRequest(); + /** + * optional .signalservice.WebSocketRequestMessage request = 2; + */ + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessageOrBuilder getRequestOrBuilder(); + + // optional .signalservice.WebSocketResponseMessage response = 3; + /** + * optional .signalservice.WebSocketResponseMessage response = 3; + */ + boolean hasResponse(); + /** + * optional .signalservice.WebSocketResponseMessage response = 3; + */ + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage getResponse(); + /** + * optional .signalservice.WebSocketResponseMessage response = 3; + */ + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessageOrBuilder getResponseOrBuilder(); + } + /** + * Protobuf type {@code signalservice.WebSocketMessage} + */ + public static final class WebSocketMessage extends + com.google.protobuf.GeneratedMessage + implements WebSocketMessageOrBuilder { + // Use WebSocketMessage.newBuilder() to construct. + private WebSocketMessage(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private WebSocketMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final WebSocketMessage defaultInstance; + public static WebSocketMessage getDefaultInstance() { + return defaultInstance; + } + + public WebSocketMessage getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private WebSocketMessage( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + int rawValue = input.readEnum(); + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage.Type value = org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage.Type.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(1, rawValue); + } else { + bitField0_ |= 0x00000001; + type_ = value; + } + break; + } + case 18: { + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage.Builder subBuilder = null; + if (((bitField0_ & 0x00000002) == 0x00000002)) { + subBuilder = request_.toBuilder(); + } + request_ = input.readMessage(org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(request_); + request_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000002; + break; + } + case 26: { + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage.Builder subBuilder = null; + if (((bitField0_ & 0x00000004) == 0x00000004)) { + subBuilder = response_.toBuilder(); + } + response_ = input.readMessage(org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(response_); + response_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000004; + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.websocket.WebSocketProtos.internal_static_signalservice_WebSocketMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.websocket.WebSocketProtos.internal_static_signalservice_WebSocketMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage.class, org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public WebSocketMessage parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new WebSocketMessage(input, extensionRegistry); + } + }; + + @Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + /** + * Protobuf enum {@code signalservice.WebSocketMessage.Type} + */ + public enum Type + implements com.google.protobuf.ProtocolMessageEnum { + /** + * UNKNOWN = 0; + */ + UNKNOWN(0, 0), + /** + * REQUEST = 1; + */ + REQUEST(1, 1), + /** + * RESPONSE = 2; + */ + RESPONSE(2, 2), + ; + + /** + * UNKNOWN = 0; + */ + public static final int UNKNOWN_VALUE = 0; + /** + * REQUEST = 1; + */ + public static final int REQUEST_VALUE = 1; + /** + * RESPONSE = 2; + */ + public static final int RESPONSE_VALUE = 2; + + + public final int getNumber() { return value; } + + public static Type valueOf(int value) { + switch (value) { + case 0: return UNKNOWN; + case 1: return REQUEST; + case 2: return RESPONSE; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static com.google.protobuf.Internal.EnumLiteMap + internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Type findValueByNumber(int number) { + return Type.valueOf(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(index); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage.getDescriptor().getEnumTypes().get(0); + } + + private static final Type[] VALUES = values(); + + public static Type valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int index; + private final int value; + + private Type(int index, int value) { + this.index = index; + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:signalservice.WebSocketMessage.Type) + } + + private int bitField0_; + // optional .signalservice.WebSocketMessage.Type type = 1; + public static final int TYPE_FIELD_NUMBER = 1; + private org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage.Type type_; + /** + * optional .signalservice.WebSocketMessage.Type type = 1; + */ + public boolean hasType() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional .signalservice.WebSocketMessage.Type type = 1; + */ + public org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage.Type getType() { + return type_; + } + + // optional .signalservice.WebSocketRequestMessage request = 2; + public static final int REQUEST_FIELD_NUMBER = 2; + private org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage request_; + /** + * optional .signalservice.WebSocketRequestMessage request = 2; + */ + public boolean hasRequest() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .signalservice.WebSocketRequestMessage request = 2; + */ + public org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage getRequest() { + return request_; + } + /** + * optional .signalservice.WebSocketRequestMessage request = 2; + */ + public org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessageOrBuilder getRequestOrBuilder() { + return request_; + } + + // optional .signalservice.WebSocketResponseMessage response = 3; + public static final int RESPONSE_FIELD_NUMBER = 3; + private org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage response_; + /** + * optional .signalservice.WebSocketResponseMessage response = 3; + */ + public boolean hasResponse() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .signalservice.WebSocketResponseMessage response = 3; + */ + public org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage getResponse() { + return response_; + } + /** + * optional .signalservice.WebSocketResponseMessage response = 3; + */ + public org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessageOrBuilder getResponseOrBuilder() { + return response_; + } + + private void initFields() { + type_ = org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage.Type.UNKNOWN; + request_ = org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage.getDefaultInstance(); + response_ = org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage.getDefaultInstance(); + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeEnum(1, type_.getNumber()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeMessage(2, request_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeMessage(3, response_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(1, type_.getNumber()); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, request_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, response_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @Override + protected Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code signalservice.WebSocketMessage} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder + implements org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.session.libsignal.service.internal.websocket.WebSocketProtos.internal_static_signalservice_WebSocketMessage_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.session.libsignal.service.internal.websocket.WebSocketProtos.internal_static_signalservice_WebSocketMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage.class, org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage.Builder.class); + } + + // Construct using org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getRequestFieldBuilder(); + getResponseFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + type_ = org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage.Type.UNKNOWN; + bitField0_ = (bitField0_ & ~0x00000001); + if (requestBuilder_ == null) { + request_ = org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage.getDefaultInstance(); + } else { + requestBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + if (responseBuilder_ == null) { + response_ = org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage.getDefaultInstance(); + } else { + responseBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.session.libsignal.service.internal.websocket.WebSocketProtos.internal_static_signalservice_WebSocketMessage_descriptor; + } + + public org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage getDefaultInstanceForType() { + return org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage.getDefaultInstance(); + } + + public org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage build() { + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage buildPartial() { + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage result = new org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.type_ = type_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + if (requestBuilder_ == null) { + result.request_ = request_; + } else { + result.request_ = requestBuilder_.build(); + } + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + if (responseBuilder_ == null) { + result.response_ = response_; + } else { + result.response_ = responseBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage) { + return mergeFrom((org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage other) { + if (other == org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage.getDefaultInstance()) return this; + if (other.hasType()) { + setType(other.getType()); + } + if (other.hasRequest()) { + mergeRequest(other.getRequest()); + } + if (other.hasResponse()) { + mergeResponse(other.getResponse()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // optional .signalservice.WebSocketMessage.Type type = 1; + private org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage.Type type_ = org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage.Type.UNKNOWN; + /** + * optional .signalservice.WebSocketMessage.Type type = 1; + */ + public boolean hasType() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional .signalservice.WebSocketMessage.Type type = 1; + */ + public org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage.Type getType() { + return type_; + } + /** + * optional .signalservice.WebSocketMessage.Type type = 1; + */ + public Builder setType(org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage.Type value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + type_ = value; + onChanged(); + return this; + } + /** + * optional .signalservice.WebSocketMessage.Type type = 1; + */ + public Builder clearType() { + bitField0_ = (bitField0_ & ~0x00000001); + type_ = org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage.Type.UNKNOWN; + onChanged(); + return this; + } + + // optional .signalservice.WebSocketRequestMessage request = 2; + private org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage request_ = org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage, org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage.Builder, org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessageOrBuilder> requestBuilder_; + /** + * optional .signalservice.WebSocketRequestMessage request = 2; + */ + public boolean hasRequest() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional .signalservice.WebSocketRequestMessage request = 2; + */ + public org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage getRequest() { + if (requestBuilder_ == null) { + return request_; + } else { + return requestBuilder_.getMessage(); + } + } + /** + * optional .signalservice.WebSocketRequestMessage request = 2; + */ + public Builder setRequest(org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage value) { + if (requestBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + request_ = value; + onChanged(); + } else { + requestBuilder_.setMessage(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .signalservice.WebSocketRequestMessage request = 2; + */ + public Builder setRequest( + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage.Builder builderForValue) { + if (requestBuilder_ == null) { + request_ = builderForValue.build(); + onChanged(); + } else { + requestBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .signalservice.WebSocketRequestMessage request = 2; + */ + public Builder mergeRequest(org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage value) { + if (requestBuilder_ == null) { + if (((bitField0_ & 0x00000002) == 0x00000002) && + request_ != org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage.getDefaultInstance()) { + request_ = + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage.newBuilder(request_).mergeFrom(value).buildPartial(); + } else { + request_ = value; + } + onChanged(); + } else { + requestBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .signalservice.WebSocketRequestMessage request = 2; + */ + public Builder clearRequest() { + if (requestBuilder_ == null) { + request_ = org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage.getDefaultInstance(); + onChanged(); + } else { + requestBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + /** + * optional .signalservice.WebSocketRequestMessage request = 2; + */ + public org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage.Builder getRequestBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getRequestFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.WebSocketRequestMessage request = 2; + */ + public org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessageOrBuilder getRequestOrBuilder() { + if (requestBuilder_ != null) { + return requestBuilder_.getMessageOrBuilder(); + } else { + return request_; + } + } + /** + * optional .signalservice.WebSocketRequestMessage request = 2; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage, org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage.Builder, org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessageOrBuilder> + getRequestFieldBuilder() { + if (requestBuilder_ == null) { + requestBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage, org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage.Builder, org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessageOrBuilder>( + request_, + getParentForChildren(), + isClean()); + request_ = null; + } + return requestBuilder_; + } + + // optional .signalservice.WebSocketResponseMessage response = 3; + private org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage response_ = org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage, org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage.Builder, org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessageOrBuilder> responseBuilder_; + /** + * optional .signalservice.WebSocketResponseMessage response = 3; + */ + public boolean hasResponse() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional .signalservice.WebSocketResponseMessage response = 3; + */ + public org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage getResponse() { + if (responseBuilder_ == null) { + return response_; + } else { + return responseBuilder_.getMessage(); + } + } + /** + * optional .signalservice.WebSocketResponseMessage response = 3; + */ + public Builder setResponse(org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage value) { + if (responseBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + response_ = value; + onChanged(); + } else { + responseBuilder_.setMessage(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .signalservice.WebSocketResponseMessage response = 3; + */ + public Builder setResponse( + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage.Builder builderForValue) { + if (responseBuilder_ == null) { + response_ = builderForValue.build(); + onChanged(); + } else { + responseBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .signalservice.WebSocketResponseMessage response = 3; + */ + public Builder mergeResponse(org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage value) { + if (responseBuilder_ == null) { + if (((bitField0_ & 0x00000004) == 0x00000004) && + response_ != org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage.getDefaultInstance()) { + response_ = + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage.newBuilder(response_).mergeFrom(value).buildPartial(); + } else { + response_ = value; + } + onChanged(); + } else { + responseBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .signalservice.WebSocketResponseMessage response = 3; + */ + public Builder clearResponse() { + if (responseBuilder_ == null) { + response_ = org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage.getDefaultInstance(); + onChanged(); + } else { + responseBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + /** + * optional .signalservice.WebSocketResponseMessage response = 3; + */ + public org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage.Builder getResponseBuilder() { + bitField0_ |= 0x00000004; + onChanged(); + return getResponseFieldBuilder().getBuilder(); + } + /** + * optional .signalservice.WebSocketResponseMessage response = 3; + */ + public org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessageOrBuilder getResponseOrBuilder() { + if (responseBuilder_ != null) { + return responseBuilder_.getMessageOrBuilder(); + } else { + return response_; + } + } + /** + * optional .signalservice.WebSocketResponseMessage response = 3; + */ + private com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage, org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage.Builder, org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessageOrBuilder> + getResponseFieldBuilder() { + if (responseBuilder_ == null) { + responseBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage, org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessage.Builder, org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketResponseMessageOrBuilder>( + response_, + getParentForChildren(), + isClean()); + response_ = null; + } + return responseBuilder_; + } + + // @@protoc_insertion_point(builder_scope:signalservice.WebSocketMessage) + } + + static { + defaultInstance = new WebSocketMessage(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:signalservice.WebSocketMessage) + } + + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_WebSocketRequestMessage_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_WebSocketRequestMessage_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_WebSocketResponseMessage_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_WebSocketResponseMessage_fieldAccessorTable; + private static com.google.protobuf.Descriptors.Descriptor + internal_static_signalservice_WebSocketMessage_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_signalservice_WebSocketMessage_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + String[] descriptorData = { + "\n\030WebSocketResources.proto\022\rsignalservic" + + "e\"`\n\027WebSocketRequestMessage\022\014\n\004verb\030\001 \001" + + "(\t\022\014\n\004path\030\002 \001(\t\022\014\n\004body\030\003 \001(\014\022\017\n\007header" + + "s\030\005 \003(\t\022\n\n\002id\030\004 \001(\004\"f\n\030WebSocketResponse" + + "Message\022\n\n\002id\030\001 \001(\004\022\016\n\006status\030\002 \001(\r\022\017\n\007m" + + "essage\030\003 \001(\t\022\017\n\007headers\030\005 \003(\t\022\014\n\004body\030\004 " + + "\001(\014\"\352\001\n\020WebSocketMessage\0222\n\004type\030\001 \001(\0162$" + + ".signalservice.WebSocketMessage.Type\0227\n\007" + + "request\030\002 \001(\0132&.signalservice.WebSocketR" + + "equestMessage\0229\n\010response\030\003 \001(\0132\'.signal", + "service.WebSocketResponseMessage\".\n\004Type" + + "\022\013\n\007UNKNOWN\020\000\022\013\n\007REQUEST\020\001\022\014\n\010RESPONSE\020\002" + + "BF\n3org.session.libsignal.service.int" + + "ernal.websocketB\017WebSocketProtos" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + internal_static_signalservice_WebSocketRequestMessage_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_signalservice_WebSocketRequestMessage_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_WebSocketRequestMessage_descriptor, + new String[] { "Verb", "Path", "Body", "Headers", "Id", }); + internal_static_signalservice_WebSocketResponseMessage_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_signalservice_WebSocketResponseMessage_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_WebSocketResponseMessage_descriptor, + new String[] { "Id", "Status", "Message", "Headers", "Body", }); + internal_static_signalservice_WebSocketMessage_descriptor = + getDescriptor().getMessageTypes().get(2); + internal_static_signalservice_WebSocketMessage_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_signalservice_WebSocketMessage_descriptor, + new String[] { "Type", "Request", "Response", }); + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/api/DotNetAPI.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/api/DotNetAPI.kt new file mode 100644 index 000000000..2271e9539 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/api/DotNetAPI.kt @@ -0,0 +1,253 @@ +package org.session.libsignal.service.loki.api + +import com.fasterxml.jackson.databind.JsonNode +import nl.komponents.kovenant.Promise +import nl.komponents.kovenant.functional.bind +import nl.komponents.kovenant.functional.map +import nl.komponents.kovenant.then +import okhttp3.MediaType +import okhttp3.MultipartBody +import okhttp3.Request +import okhttp3.RequestBody +import org.session.libsignal.libsignal.logging.Log +import org.session.libsignal.libsignal.loki.DiffieHellman +import org.session.libsignal.service.api.crypto.ProfileCipherOutputStream +import org.session.libsignal.service.api.push.exceptions.NonSuccessfulResponseCodeException +import org.session.libsignal.service.api.push.exceptions.PushNetworkException +import org.session.libsignal.service.api.util.StreamDetails +import org.session.libsignal.service.internal.push.ProfileAvatarData +import org.session.libsignal.service.internal.push.PushAttachmentData +import org.session.libsignal.service.internal.push.http.DigestingRequestBody +import org.session.libsignal.service.internal.push.http.ProfileCipherOutputStreamFactory +import org.session.libsignal.service.internal.util.Base64 +import org.session.libsignal.service.internal.util.Hex +import org.session.libsignal.service.internal.util.JsonUtil +import org.session.libsignal.service.loki.api.fileserver.FileServerAPI +import org.session.libsignal.service.loki.api.onionrequests.OnionRequestAPI +import org.session.libsignal.service.loki.api.utilities.HTTP +import org.session.libsignal.service.loki.database.LokiAPIDatabaseProtocol +import org.session.libsignal.service.loki.utilities.recover +import org.session.libsignal.service.loki.utilities.removing05PrefixIfNeeded +import org.session.libsignal.service.loki.utilities.retryIfNeeded +import java.util.* + +/** + * Base class that provides utilities for .NET based APIs. + */ +open class LokiDotNetAPI(internal val userPublicKey: String, private val userPrivateKey: ByteArray, private val apiDatabase: LokiAPIDatabaseProtocol) { + + internal enum class HTTPVerb { GET, PUT, POST, DELETE, PATCH } + + companion object { + private val authTokenRequestCache = hashMapOf>() + } + + public data class UploadResult(val id: Long, val url: String, val digest: ByteArray?) + + public fun getAuthToken(server: String): Promise { + val token = apiDatabase.getAuthToken(server) + if (token != null) { return Promise.of(token) } + // Avoid multiple token requests to the server by caching + var promise = authTokenRequestCache[server] + if (promise == null) { + promise = requestNewAuthToken(server).bind { submitAuthToken(it, server) }.then { newToken -> + apiDatabase.setAuthToken(server, newToken) + newToken + }.always { + authTokenRequestCache.remove(server) + } + authTokenRequestCache[server] = promise + } + return promise + } + + private fun requestNewAuthToken(server: String): Promise { + Log.d("Loki", "Requesting auth token for server: $server.") + val parameters: Map = mapOf( "pubKey" to userPublicKey ) + return execute(HTTPVerb.GET, server, "loki/v1/get_challenge", false, parameters).map(SnodeAPI.sharedContext) { json -> + try { + val base64EncodedChallenge = json["cipherText64"] as String + val challenge = Base64.decode(base64EncodedChallenge) + val base64EncodedServerPublicKey = json["serverPubKey64"] as String + var serverPublicKey = Base64.decode(base64EncodedServerPublicKey) + // Discard the "05" prefix if needed + if (serverPublicKey.count() == 33) { + val hexEncodedServerPublicKey = Hex.toStringCondensed(serverPublicKey) + serverPublicKey = Hex.fromStringCondensed(hexEncodedServerPublicKey.removing05PrefixIfNeeded()) + } + // The challenge is prefixed by the 16 bit IV + val tokenAsData = DiffieHellman.decrypt(challenge, serverPublicKey, userPrivateKey) + val token = tokenAsData.toString(Charsets.UTF_8) + token + } catch (exception: Exception) { + Log.d("Loki", "Couldn't parse auth token for server: $server.") + throw exception + } + } + } + + private fun submitAuthToken(token: String, server: String): Promise { + Log.d("Loki", "Submitting auth token for server: $server.") + val parameters = mapOf( "pubKey" to userPublicKey, "token" to token ) + return execute(HTTPVerb.POST, server, "loki/v1/submit_challenge", false, parameters, isJSONRequired = false).map { token } + } + + internal fun execute(verb: HTTPVerb, server: String, endpoint: String, isAuthRequired: Boolean = true, parameters: Map = mapOf(), isJSONRequired: Boolean = true): Promise, Exception> { + fun execute(token: String?): Promise, Exception> { + val sanitizedEndpoint = endpoint.removePrefix("/") + var url = "$server/$sanitizedEndpoint" + if (verb == HTTPVerb.GET || verb == HTTPVerb.DELETE) { + val queryParameters = parameters.map { "${it.key}=${it.value}" }.joinToString("&") + if (queryParameters.isNotEmpty()) { url += "?$queryParameters" } + } + var request = Request.Builder().url(url) + if (isAuthRequired) { + if (token == null) { throw IllegalStateException() } + request = request.header("Authorization", "Bearer $token") + } + when (verb) { + HTTPVerb.GET -> request = request.get() + HTTPVerb.DELETE -> request = request.delete() + else -> { + val parametersAsJSON = JsonUtil.toJson(parameters) + val body = RequestBody.create(MediaType.get("application/json"), parametersAsJSON) + when (verb) { + HTTPVerb.PUT -> request = request.put(body) + HTTPVerb.POST -> request = request.post(body) + HTTPVerb.PATCH -> request = request.patch(body) + else -> throw IllegalStateException() + } + } + } + val serverPublicKeyPromise = if (server == FileServerAPI.shared.server) Promise.of(FileServerAPI.fileServerPublicKey) + else FileServerAPI.shared.getPublicKeyForOpenGroupServer(server) + return serverPublicKeyPromise.bind { serverPublicKey -> + OnionRequestAPI.sendOnionRequest(request.build(), server, serverPublicKey, isJSONRequired = isJSONRequired).recover { exception -> + if (exception is HTTP.HTTPRequestFailedException) { + val statusCode = exception.statusCode + if (statusCode == 401 || statusCode == 403) { + apiDatabase.setAuthToken(server, null) + throw SnodeAPI.Error.TokenExpired + } + } + throw exception + } + } + } + return if (isAuthRequired) { + getAuthToken(server).bind { execute(it) } + } else { + execute(null) + } + } + + internal fun getUserProfiles(publicKeys: Set, server: String, includeAnnotations: Boolean): Promise>, Exception> { + val parameters = mapOf( "include_user_annotations" to includeAnnotations.toInt(), "ids" to publicKeys.joinToString { "@$it" } ) + return execute(HTTPVerb.GET, server, "users", parameters = parameters).map { json -> + val data = json["data"] as? List> + if (data == null) { + Log.d("Loki", "Couldn't parse user profiles for: $publicKeys from: $json.") + throw SnodeAPI.Error.ParsingFailed + } + data!! // For some reason the compiler can't infer that this can't be null at this point + } + } + + internal fun setSelfAnnotation(server: String, type: String, newValue: Any?): Promise, Exception> { + val annotation = mutableMapOf( "type" to type ) + if (newValue != null) { annotation["value"] = newValue } + val parameters = mapOf( "annotations" to listOf( annotation ) ) + return execute(HTTPVerb.PATCH, server, "users/me", parameters = parameters) + } + + @Throws(PushNetworkException::class, NonSuccessfulResponseCodeException::class) + fun uploadAttachment(server: String, attachment: PushAttachmentData): UploadResult { + // This function mimics what Signal does in PushServiceSocket + val contentType = "application/octet-stream" + val file = DigestingRequestBody(attachment.data, attachment.outputStreamFactory, contentType, attachment.dataSize, attachment.listener) + Log.d("Loki", "File size: ${attachment.dataSize} bytes.") + val body = MultipartBody.Builder() + .setType(MultipartBody.FORM) + .addFormDataPart("type", "network.loki") + .addFormDataPart("Content-Type", contentType) + .addFormDataPart("content", UUID.randomUUID().toString(), file) + .build() + val request = Request.Builder().url("$server/files").post(body) + return upload(server, request) { json -> // Retrying is handled by AttachmentUploadJob + val data = json["data"] as? Map<*, *> + if (data == null) { + Log.d("Loki", "Couldn't parse attachment from: $json.") + throw SnodeAPI.Error.ParsingFailed + } + val id = data["id"] as? Long ?: (data["id"] as? Int)?.toLong() ?: (data["id"] as? String)?.toLong() + val url = data["url"] as? String + if (id == null || url == null || url.isEmpty()) { + Log.d("Loki", "Couldn't parse upload from: $json.") + throw SnodeAPI.Error.ParsingFailed + } + UploadResult(id, url, file.transmittedDigest) + }.get() + } + + @Throws(PushNetworkException::class, NonSuccessfulResponseCodeException::class) + fun uploadProfilePicture(server: String, key: ByteArray, profilePicture: StreamDetails, setLastProfilePictureUpload: () -> Unit): UploadResult { + val profilePictureUploadData = ProfileAvatarData(profilePicture.stream, ProfileCipherOutputStream.getCiphertextLength(profilePicture.length), profilePicture.contentType, ProfileCipherOutputStreamFactory(key)) + val file = DigestingRequestBody(profilePictureUploadData.data, profilePictureUploadData.outputStreamFactory, + profilePictureUploadData.contentType, profilePictureUploadData.dataLength, null) + val body = MultipartBody.Builder() + .setType(MultipartBody.FORM) + .addFormDataPart("type", "network.loki") + .addFormDataPart("Content-Type", "application/octet-stream") + .addFormDataPart("content", UUID.randomUUID().toString(), file) + .build() + val request = Request.Builder().url("$server/files").post(body) + return retryIfNeeded(4) { + upload(server, request) { json -> + val data = json["data"] as? Map<*, *> + if (data == null) { + Log.d("Loki", "Couldn't parse profile picture from: $json.") + throw SnodeAPI.Error.ParsingFailed + } + val id = data["id"] as? Long ?: (data["id"] as? Int)?.toLong() ?: (data["id"] as? String)?.toLong() + val url = data["url"] as? String + if (id == null || url == null || url.isEmpty()) { + Log.d("Loki", "Couldn't parse profile picture from: $json.") + throw SnodeAPI.Error.ParsingFailed + } + setLastProfilePictureUpload() + UploadResult(id, url, file.transmittedDigest) + } + }.get() + } + + @Throws(PushNetworkException::class, NonSuccessfulResponseCodeException::class) + private fun upload(server: String, request: Request.Builder, parse: (Map<*, *>) -> UploadResult): Promise { + val promise: Promise, Exception> + if (server == FileServerAPI.shared.server) { + request.addHeader("Authorization", "Bearer loki") + // Uploads to the Loki File Server shouldn't include any personally identifiable information, so use a dummy auth token + promise = OnionRequestAPI.sendOnionRequest(request.build(), FileServerAPI.shared.server, FileServerAPI.fileServerPublicKey) + } else { + promise = FileServerAPI.shared.getPublicKeyForOpenGroupServer(server).bind { openGroupServerPublicKey -> + getAuthToken(server).bind { token -> + request.addHeader("Authorization", "Bearer $token") + OnionRequestAPI.sendOnionRequest(request.build(), server, openGroupServerPublicKey) + } + } + } + return promise.map { json -> + parse(json) + }.recover { exception -> + if (exception is HTTP.HTTPRequestFailedException) { + val statusCode = exception.statusCode + if (statusCode == 401 || statusCode == 403) { + apiDatabase.setAuthToken(server, null) + } + throw NonSuccessfulResponseCodeException("Request returned with status code ${exception.statusCode}.") + } + throw PushNetworkException(exception) + } + } +} + +private fun Boolean.toInt(): Int { return if (this) 1 else 0 } diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/api/LokiMessage.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/api/LokiMessage.kt new file mode 100644 index 000000000..3353a29ff --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/api/LokiMessage.kt @@ -0,0 +1,85 @@ +package org.session.libsignal.service.loki.api + +import nl.komponents.kovenant.Promise +import nl.komponents.kovenant.deferred +import org.session.libsignal.libsignal.logging.Log +import org.session.libsignal.service.internal.util.Base64 +import org.session.libsignal.service.loki.api.crypto.ProofOfWork +import org.session.libsignal.service.loki.protocol.meta.TTLUtilities +import org.session.libsignal.service.loki.utilities.prettifiedDescription + +internal data class LokiMessage( + /** + * The hex encoded public key of the receiver. + */ + internal val recipientPublicKey: String, + /** + * The content of the message. + */ + internal val data: String, + /** + * The time to live for the message in milliseconds. + */ + internal val ttl: Int, + /** + * Whether this message is a ping. + */ + internal val isPing: Boolean, + /** + * When the proof of work was calculated, if applicable (P2P messages don't require proof of work). + * + * - Note: Expressed as milliseconds since 00:00:00 UTC on 1 January 1970. + */ + internal var timestamp: Long? = null, + /** + * The base 64 encoded proof of work, if applicable (P2P messages don't require proof of work). + */ + internal var nonce: String? = null +) { + + internal companion object { + + internal fun from(message: SignalMessageInfo): LokiMessage? { + try { + val wrappedMessage = MessageWrapper.wrap(message) + val data = Base64.encodeBytes(wrappedMessage) + val destination = message.recipientPublicKey + var ttl = TTLUtilities.fallbackMessageTTL + val messageTTL = message.ttl + if (messageTTL != null && messageTTL != 0) { ttl = messageTTL } + val isPing = message.isPing + return LokiMessage(destination, data, ttl, isPing) + } catch (e: Exception) { + Log.d("Loki", "Failed to convert Signal message to Loki message: ${message.prettifiedDescription()}.") + return null + } + } + } + + @kotlin.ExperimentalUnsignedTypes + internal fun calculatePoW(): Promise { + val deferred = deferred() + // Run PoW in a background thread + Thread { + val now = System.currentTimeMillis() + val nonce = ProofOfWork.calculate(data, recipientPublicKey, now, ttl) + if (nonce != null ) { + deferred.resolve(copy(nonce = nonce, timestamp = now)) + } else { + deferred.reject(SnodeAPI.Error.ProofOfWorkCalculationFailed) + } + }.start() + return deferred.promise + } + + internal fun toJSON(): Map { + val result = mutableMapOf( "pubKey" to recipientPublicKey, "data" to data, "ttl" to ttl.toString() ) + val timestamp = timestamp + val nonce = nonce + if (timestamp != null && nonce != null) { + result["timestamp"] = timestamp.toString() + result["nonce"] = nonce + } + return result + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/api/MessageWrapper.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/api/MessageWrapper.kt new file mode 100644 index 000000000..d6df33f3a --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/api/MessageWrapper.kt @@ -0,0 +1,84 @@ +package org.session.libsignal.service.loki.api + +import com.google.protobuf.ByteString +import org.session.libsignal.libsignal.logging.Log +import org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope +import org.session.libsignal.service.internal.util.Base64 +import org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketMessage +import org.session.libsignal.service.internal.websocket.WebSocketProtos.WebSocketRequestMessage +import java.security.SecureRandom + +object MessageWrapper { + + // region Types + sealed class Error(val description: String) : Exception() { + object FailedToWrapData : Error("Failed to wrap data.") + object FailedToWrapMessageInEnvelope : Error("Failed to wrap message in envelope.") + object FailedToWrapEnvelopeInWebSocketMessage : Error("Failed to wrap envelope in web socket message.") + object FailedToUnwrapData : Error("Failed to unwrap data.") + } + // endregion + + // region Wrapping + /** + * Wraps `message` in a `SignalServiceProtos.Envelope` and then a `WebSocketProtos.WebSocketMessage` to match the desktop application. + */ + fun wrap(message: SignalMessageInfo): ByteArray { + try { + val envelope = createEnvelope(message) + val webSocketMessage = createWebSocketMessage(envelope) + return webSocketMessage.toByteArray() + } catch (e: Exception) { + throw if (e is Error) { e } else { Error.FailedToWrapData } + } + } + + private fun createEnvelope(message: SignalMessageInfo): Envelope { + try { + val builder = Envelope.newBuilder() + builder.type = message.type + builder.timestamp = message.timestamp + builder.source = message.senderPublicKey + builder.sourceDevice = message.senderDeviceID + builder.content = ByteString.copyFrom(Base64.decode(message.content)) + return builder.build() + } catch (e: Exception) { + Log.d("Loki", "Failed to wrap message in envelope: ${e.message}.") + throw Error.FailedToWrapMessageInEnvelope + } + } + + private fun createWebSocketMessage(envelope: Envelope): WebSocketMessage { + try { + val requestBuilder = WebSocketRequestMessage.newBuilder() + requestBuilder.verb = "PUT" + requestBuilder.path = "/api/v1/message" + requestBuilder.id = SecureRandom.getInstance("SHA1PRNG").nextLong() + requestBuilder.body = envelope.toByteString() + val messageBuilder = WebSocketMessage.newBuilder() + messageBuilder.request = requestBuilder.build() + messageBuilder.type = WebSocketMessage.Type.REQUEST + return messageBuilder.build() + } catch (e: Exception) { + Log.d("Loki", "Failed to wrap envelope in web socket message: ${e.message}.") + throw Error.FailedToWrapEnvelopeInWebSocketMessage + } + } + // endregion + + // region Unwrapping + /** + * `data` shouldn't be base 64 encoded. + */ + fun unwrap(data: ByteArray): Envelope { + try { + val webSocketMessage = WebSocketMessage.parseFrom(data) + val envelopeAsData = webSocketMessage.request.body + return Envelope.parseFrom(envelopeAsData) + } catch (e: Exception) { + Log.d("Loki", "Failed to unwrap data: ${e.message}.") + throw Error.FailedToUnwrapData + } + } + // endregion +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/api/Poller.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/api/Poller.kt new file mode 100644 index 000000000..1bc159af8 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/api/Poller.kt @@ -0,0 +1,95 @@ +package org.session.libsignal.service.loki.api + +import nl.komponents.kovenant.* +import nl.komponents.kovenant.functional.bind +import org.session.libsignal.libsignal.logging.Log +import org.session.libsignal.service.internal.push.SignalServiceProtos +import org.session.libsignal.service.loki.database.LokiAPIDatabaseProtocol +import java.security.SecureRandom +import java.util.* + +private class PromiseCanceledException : Exception("Promise canceled.") + +class Poller(public var userPublicKey: String, private val database: LokiAPIDatabaseProtocol, private val onMessagesReceived: (List) -> Unit) { + private var hasStarted: Boolean = false + private val usedSnodes: MutableSet = mutableSetOf() + public var isCaughtUp = false + + // region Settings + companion object { + private val retryInterval: Long = 1 * 1000 + } + // endregion + + // region Public API + fun startIfNeeded() { + if (hasStarted) { return } + Log.d("Loki", "Started polling.") + hasStarted = true + setUpPolling() + } + + fun stopIfNeeded() { + Log.d("Loki", "Stopped polling.") + hasStarted = false + usedSnodes.clear() + } + // endregion + + // region Private API + private fun setUpPolling() { + if (!hasStarted) { return; } + val thread = Thread.currentThread() + SwarmAPI.shared.getSwarm(userPublicKey).bind(SnodeAPI.messagePollingContext) { + usedSnodes.clear() + val deferred = deferred(SnodeAPI.messagePollingContext) + pollNextSnode(deferred) + deferred.promise + }.always { + Timer().schedule(object : TimerTask() { + + override fun run() { + thread.run { setUpPolling() } + } + }, retryInterval) + } + } + + private fun pollNextSnode(deferred: Deferred) { + val swarm = database.getSwarm(userPublicKey) ?: setOf() + val unusedSnodes = swarm.subtract(usedSnodes) + if (unusedSnodes.isNotEmpty()) { + val index = SecureRandom().nextInt(unusedSnodes.size) + val nextSnode = unusedSnodes.elementAt(index) + usedSnodes.add(nextSnode) + Log.d("Loki", "Polling $nextSnode.") + poll(nextSnode, deferred).fail { exception -> + if (exception is PromiseCanceledException) { + Log.d("Loki", "Polling $nextSnode canceled.") + } else { + Log.d("Loki", "Polling $nextSnode failed; dropping it and switching to next snode.") + SwarmAPI.shared.dropSnodeFromSwarmIfNeeded(nextSnode, userPublicKey) + pollNextSnode(deferred) + } + } + } else { + isCaughtUp = true + deferred.resolve() + } + } + + private fun poll(snode: Snode, deferred: Deferred): Promise { + if (!hasStarted) { return Promise.ofFail(PromiseCanceledException()) } + return SnodeAPI.shared.getRawMessages(snode, userPublicKey).bind(SnodeAPI.messagePollingContext) { rawResponse -> + isCaughtUp = true + if (deferred.promise.isDone()) { + task { Unit } // The long polling connection has been canceled; don't recurse + } else { + val messages = SnodeAPI.shared.parseRawMessagesResponse(rawResponse, snode, userPublicKey) + onMessagesReceived(messages) + poll(snode, deferred) + } + } + } + // endregion +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/api/PushNotificationAPI.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/api/PushNotificationAPI.kt new file mode 100644 index 000000000..b8defc7dd --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/api/PushNotificationAPI.kt @@ -0,0 +1,43 @@ +package org.session.libsignal.service.loki.api + +import nl.komponents.kovenant.functional.map +import okhttp3.* +import org.session.libsignal.libsignal.logging.Log +import org.session.libsignal.service.internal.util.JsonUtil +import org.session.libsignal.service.loki.api.onionrequests.OnionRequestAPI +import org.session.libsignal.service.loki.utilities.retryIfNeeded +import java.io.IOException + +public class PushNotificationAPI private constructor(public val server: String) { + + companion object { + private val maxRetryCount = 4 + public val pnServerPublicKey = "642a6585919742e5a2d4dc51244964fbcd8bcab2b75612407de58b810740d049" + + lateinit var shared: PushNotificationAPI + + public fun configureIfNeeded(isDebugMode: Boolean) { + if (::shared.isInitialized) { return; } + val server = if (isDebugMode) "https://live.apns.getsession.org" else "https://live.apns.getsession.org" + shared = PushNotificationAPI(server) + } + } + + public fun notify(messageInfo: SignalMessageInfo) { + val message = LokiMessage.from(messageInfo) ?: return + val parameters = mapOf( "data" to message.data, "send_to" to message.recipientPublicKey ) + val url = "${server}/notify" + val body = RequestBody.create(MediaType.get("application/json"), JsonUtil.toJson(parameters)) + val request = Request.Builder().url(url).post(body) + retryIfNeeded(maxRetryCount) { + OnionRequestAPI.sendOnionRequest(request.build(), server, PushNotificationAPI.pnServerPublicKey, "/loki/v2/lsrpc").map { json -> + val code = json["code"] as? Int + if (code == null || code == 0) { + Log.d("Loki", "[Loki] Couldn't notify PN server due to error: ${json["message"] as? String ?: "null"}.") + } + }.fail { exception -> + Log.d("Loki", "[Loki] Couldn't notify PN server due to error: $exception.") + } + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/api/SignalMessageInfo.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/api/SignalMessageInfo.kt new file mode 100644 index 000000000..5b41d26a5 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/api/SignalMessageInfo.kt @@ -0,0 +1,14 @@ +package org.session.libsignal.service.loki.api + +import org.session.libsignal.service.internal.push.SignalServiceProtos + +data class SignalMessageInfo( + val type: SignalServiceProtos.Envelope.Type, + val timestamp: Long, + val senderPublicKey: String, + val senderDeviceID: Int, + val content: String, + val recipientPublicKey: String, + val ttl: Int?, + val isPing: Boolean +) diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/api/Snode.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/api/Snode.kt new file mode 100644 index 000000000..82b6a29d3 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/api/Snode.kt @@ -0,0 +1,34 @@ +package org.session.libsignal.service.loki.api + +public class Snode(val address: String, val port: Int, val publicKeySet: KeySet?) { + + val ip: String get() = address.removePrefix("https://") + + internal enum class Method(val rawValue: String) { + /** + * Only supported by snode targets. + */ + GetSwarm("get_snodes_for_pubkey"), + /** + * Only supported by snode targets. + */ + GetMessages("retrieve"), + SendMessage("store") + } + + data class KeySet(val ed25519Key: String, val x25519Key: String) + + override fun equals(other: Any?): Boolean { + return if (other is Snode) { + address == other.address && port == other.port + } else { + false + } + } + + override fun hashCode(): Int { + return address.hashCode() xor port.hashCode() + } + + override fun toString(): String { return "$address:$port" } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/api/SnodeAPI.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/api/SnodeAPI.kt new file mode 100644 index 000000000..384c0c36c --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/api/SnodeAPI.kt @@ -0,0 +1,282 @@ +package org.session.libsignal.service.loki.api + +import nl.komponents.kovenant.Kovenant +import nl.komponents.kovenant.Promise +import nl.komponents.kovenant.deferred +import nl.komponents.kovenant.functional.bind +import nl.komponents.kovenant.functional.map +import nl.komponents.kovenant.task +import org.session.libsignal.libsignal.logging.Log +import org.session.libsignal.service.internal.push.SignalServiceProtos.Envelope +import org.session.libsignal.service.internal.util.Base64 +import org.session.libsignal.service.loki.api.onionrequests.OnionRequestAPI +import org.session.libsignal.service.loki.api.utilities.HTTP +import org.session.libsignal.service.loki.database.LokiAPIDatabaseProtocol +import org.session.libsignal.service.loki.utilities.Broadcaster +import org.session.libsignal.service.loki.utilities.createContext +import org.session.libsignal.service.loki.utilities.prettifiedDescription +import org.session.libsignal.service.loki.utilities.retryIfNeeded +import java.net.ConnectException +import java.net.SocketTimeoutException + +class SnodeAPI private constructor(public var userPublicKey: String, public val database: LokiAPIDatabaseProtocol, public val broadcaster: Broadcaster) { + + companion object { + val messageSendingContext = Kovenant.createContext("LokiAPIMessageSendingContext") + val messagePollingContext = Kovenant.createContext("LokiAPIMessagePollingContext") + /** + * For operations that are shared between message sending and message polling. + */ + val sharedContext = Kovenant.createContext("LokiAPISharedContext") + + // region Initialization + lateinit var shared: SnodeAPI + + fun configureIfNeeded(userHexEncodedPublicKey: String, database: LokiAPIDatabaseProtocol, broadcaster: Broadcaster) { + if (::shared.isInitialized) { return; } + shared = SnodeAPI(userHexEncodedPublicKey, database, broadcaster) + } + // endregion + + // region Settings + private val maxRetryCount = 6 + private val useOnionRequests = true + + internal var powDifficulty = 1 + // endregion + } + + // region Error + sealed class Error(val description: String) : Exception() { + class HTTPRequestFailed(val code: Int) : Error("HTTP request failed with error code: $code.") + object Generic : Error("An error occurred.") + object ResponseBodyMissing: Error("Response body missing.") + object MessageSigningFailed: Error("Failed to sign message.") + /** + * Only applicable to snode targets as proof of work isn't required for P2P messaging. + */ + object ProofOfWorkCalculationFailed : Error("Failed to calculate proof of work.") + object MessageConversionFailed : Error("Failed to convert Signal message to Loki message.") + object ClockOutOfSync : Error("The user's clock is out of sync with the service node network.") + object SnodeMigrated : Error("The snode previously associated with the given public key has migrated to a different swarm.") + object InsufficientProofOfWork : Error("The proof of work is insufficient.") + object TokenExpired : Error("The auth token being used has expired.") + object ParsingFailed : Error("Couldn't parse JSON.") + } + // endregion + + // region Internal API + /** + * `publicKey` is the hex encoded public key of the user the call is associated with. This is needed for swarm cache maintenance. + */ + internal fun invoke(method: Snode.Method, snode: Snode, publicKey: String, parameters: Map): RawResponsePromise { + val url = "${snode.address}:${snode.port}/storage_rpc/v1" + if (useOnionRequests) { + return OnionRequestAPI.sendOnionRequest(method, parameters, snode, publicKey) + } else { + val deferred = deferred, Exception>() + Thread { + val payload = mapOf( "method" to method.rawValue, "params" to parameters ) + try { + val json = HTTP.execute(HTTP.Verb.POST, url, payload) + deferred.resolve(json) + } catch (exception: Exception) { + if (exception is ConnectException || exception is SocketTimeoutException) { + dropSnodeIfNeeded(snode, publicKey) + } else { + val httpRequestFailedException = exception as? HTTP.HTTPRequestFailedException + if (httpRequestFailedException != null) { + @Suppress("NAME_SHADOWING") val exception = handleSnodeError(httpRequestFailedException.statusCode, httpRequestFailedException.json, snode, publicKey) + return@Thread deferred.reject(exception) + } + Log.d("Loki", "Unhandled exception: $exception.") + } + deferred.reject(exception) + } + }.start() + return deferred.promise + } + } + + public fun getRawMessages(snode: Snode, publicKey: String): RawResponsePromise { + val lastHashValue = database.getLastMessageHashValue(snode, publicKey) ?: "" + val parameters = mapOf( "pubKey" to publicKey, "lastHash" to lastHashValue ) + return invoke(Snode.Method.GetMessages, snode, publicKey, parameters) + } + // endregion + + // region Public API + fun getMessages(publicKey: String): MessageListPromise { + return retryIfNeeded(maxRetryCount) { + SwarmAPI.shared.getSingleTargetSnode(publicKey).bind(messagePollingContext) { snode -> + getRawMessages(snode, publicKey).map(messagePollingContext) { parseRawMessagesResponse(it, snode, publicKey) } + } + } + } + + @kotlin.ExperimentalUnsignedTypes + fun sendSignalMessage(message: SignalMessageInfo): Promise, Exception> { + val lokiMessage = LokiMessage.from(message) ?: return task { throw Error.MessageConversionFailed } + val destination = lokiMessage.recipientPublicKey + fun broadcast(event: String) { + val dayInMs = 86400000 + if (message.ttl != dayInMs && message.ttl != 4 * dayInMs) { return } + broadcaster.broadcast(event, message.timestamp) + } + broadcast("calculatingPoW") + return lokiMessage.calculatePoW().bind { lokiMessageWithPoW -> + broadcast("contactingNetwork") + retryIfNeeded(maxRetryCount) { + SwarmAPI.shared.getTargetSnodes(destination).map { swarm -> + swarm.map { snode -> + broadcast("sendingMessage") + val parameters = lokiMessageWithPoW.toJSON() + retryIfNeeded(maxRetryCount) { + invoke(Snode.Method.SendMessage, snode, destination, parameters).map { rawResponse -> + val json = rawResponse as? Map<*, *> + val powDifficulty = json?.get("difficulty") as? Int + if (powDifficulty != null) { + if (powDifficulty != SnodeAPI.powDifficulty && powDifficulty < 100) { + Log.d("Loki", "Setting proof of work difficulty to $powDifficulty (snode: $snode).") + SnodeAPI.powDifficulty = powDifficulty + } + } else { + Log.d("Loki", "Failed to update proof of work difficulty from: ${rawResponse.prettifiedDescription()}.") + } + rawResponse + } + } + }.toSet() + } + } + } + } + // endregion + + // region Parsing + + // The parsing utilities below use a best attempt approach to parsing; they warn for parsing failures but don't throw exceptions. + + public fun parseRawMessagesResponse(rawResponse: RawResponse, snode: Snode, publicKey: String): List { + val messages = rawResponse["messages"] as? List<*> + if (messages != null) { + updateLastMessageHashValueIfPossible(snode, publicKey, messages) + val newRawMessages = removeDuplicates(publicKey, messages) + return parseEnvelopes(newRawMessages) + } else { + return listOf() + } + } + + private fun updateLastMessageHashValueIfPossible(snode: Snode, publicKey: String, rawMessages: List<*>) { + val lastMessageAsJSON = rawMessages.lastOrNull() as? Map<*, *> + val hashValue = lastMessageAsJSON?.get("hash") as? String + val expiration = lastMessageAsJSON?.get("expiration") as? Int + if (hashValue != null) { + database.setLastMessageHashValue(snode, publicKey, hashValue) + } else if (rawMessages.isNotEmpty()) { + Log.d("Loki", "Failed to update last message hash value from: ${rawMessages.prettifiedDescription()}.") + } + } + + private fun removeDuplicates(publicKey: String, rawMessages: List<*>): List<*> { + val receivedMessageHashValues = database.getReceivedMessageHashValues(publicKey)?.toMutableSet() ?: mutableSetOf() + return rawMessages.filter { rawMessage -> + val rawMessageAsJSON = rawMessage as? Map<*, *> + val hashValue = rawMessageAsJSON?.get("hash") as? String + if (hashValue != null) { + val isDuplicate = receivedMessageHashValues.contains(hashValue) + receivedMessageHashValues.add(hashValue) + database.setReceivedMessageHashValues(publicKey, receivedMessageHashValues) + !isDuplicate + } else { + Log.d("Loki", "Missing hash value for message: ${rawMessage?.prettifiedDescription()}.") + false + } + } + } + + private fun parseEnvelopes(rawMessages: List<*>): List { + return rawMessages.mapNotNull { rawMessage -> + val rawMessageAsJSON = rawMessage as? Map<*, *> + val base64EncodedData = rawMessageAsJSON?.get("data") as? String + val data = base64EncodedData?.let { Base64.decode(it) } + if (data != null) { + try { + MessageWrapper.unwrap(data) + } catch (e: Exception) { + Log.d("Loki", "Failed to unwrap data for message: ${rawMessage.prettifiedDescription()}.") + null + } + } else { + Log.d("Loki", "Failed to decode data for message: ${rawMessage?.prettifiedDescription()}.") + null + } + } + } + // endregion + + // region Error Handling + private fun dropSnodeIfNeeded(snode: Snode, publicKey: String? = null) { + val oldFailureCount = SwarmAPI.shared.snodeFailureCount[snode] ?: 0 + val newFailureCount = oldFailureCount + 1 + SwarmAPI.shared.snodeFailureCount[snode] = newFailureCount + Log.d("Loki", "Couldn't reach snode at $snode; setting failure count to $newFailureCount.") + if (newFailureCount >= SwarmAPI.snodeFailureThreshold) { + Log.d("Loki", "Failure threshold reached for: $snode; dropping it.") + if (publicKey != null) { + SwarmAPI.shared.dropSnodeFromSwarmIfNeeded(snode, publicKey) + } + SwarmAPI.shared.snodePool = SwarmAPI.shared.snodePool.toMutableSet().minus(snode).toSet() + Log.d("Loki", "Snode pool count: ${SwarmAPI.shared.snodePool.count()}.") + SwarmAPI.shared.snodeFailureCount[snode] = 0 + } + } + + internal fun handleSnodeError(statusCode: Int, json: Map<*, *>?, snode: Snode, publicKey: String? = null): Exception { + when (statusCode) { + 400, 500, 503 -> { // Usually indicates that the snode isn't up to date + dropSnodeIfNeeded(snode, publicKey) + return Error.HTTPRequestFailed(statusCode) + } + 406 -> { + Log.d("Loki", "The user's clock is out of sync with the service node network.") + broadcaster.broadcast("clockOutOfSync") + return Error.ClockOutOfSync + } + 421 -> { + // The snode isn't associated with the given public key anymore + if (publicKey != null) { + Log.d("Loki", "Invalidating swarm for: $publicKey.") + SwarmAPI.shared.dropSnodeFromSwarmIfNeeded(snode, publicKey) + } else { + Log.d("Loki", "Got a 421 without an associated public key.") + } + return Error.SnodeMigrated + } + 432 -> { + // The PoW difficulty is too low + val powDifficulty = json?.get("difficulty") as? Int + if (powDifficulty != null && powDifficulty < 100) { + Log.d("Loki", "Setting proof of work difficulty to $powDifficulty (snode: $snode).") + SnodeAPI.powDifficulty = powDifficulty + } else { + Log.d("Loki", "Failed to update proof of work difficulty.") + } + return Error.InsufficientProofOfWork + } + else -> { + dropSnodeIfNeeded(snode, publicKey) + Log.d("Loki", "Unhandled response code: ${statusCode}.") + return Error.Generic + } + } + } + // endregion +} + +// region Convenience +typealias RawResponse = Map<*, *> +typealias MessageListPromise = Promise, Exception> +typealias RawResponsePromise = Promise +// endregion diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/api/SwarmAPI.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/api/SwarmAPI.kt new file mode 100644 index 000000000..9159fa6ae --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/api/SwarmAPI.kt @@ -0,0 +1,165 @@ +package org.session.libsignal.service.loki.api + +import nl.komponents.kovenant.Promise +import nl.komponents.kovenant.deferred +import nl.komponents.kovenant.functional.bind +import nl.komponents.kovenant.functional.map +import nl.komponents.kovenant.task +import org.session.libsignal.libsignal.logging.Log +import org.session.libsignal.service.loki.api.utilities.HTTP +import org.session.libsignal.service.loki.database.LokiAPIDatabaseProtocol +import org.session.libsignal.service.loki.utilities.getRandomElement +import org.session.libsignal.service.loki.utilities.prettifiedDescription +import java.security.SecureRandom + +class SwarmAPI private constructor(private val database: LokiAPIDatabaseProtocol) { + internal var snodeFailureCount: MutableMap = mutableMapOf() + + internal var snodePool: Set + get() = database.getSnodePool() + set(newValue) { database.setSnodePool(newValue) } + + companion object { + private val seedNodePool: Set = setOf( "https://storage.seed1.loki.network", "https://storage.seed3.loki.network", "https://public.loki.foundation" ) + + // region Settings + private val minimumSnodePoolCount = 64 + private val minimumSwarmSnodeCount = 2 + private val targetSwarmSnodeCount = 2 + + /** + * A snode is kicked out of a swarm and/or the snode pool if it fails this many times. + */ + internal val snodeFailureThreshold = 4 + // endregion + + // region Initialization + lateinit var shared: SwarmAPI + + fun configureIfNeeded(database: LokiAPIDatabaseProtocol) { + if (::shared.isInitialized) { return; } + shared = SwarmAPI(database) + } + // endregion + } + + // region Swarm API + internal fun getRandomSnode(): Promise { + val snodePool = this.snodePool + if (snodePool.count() < minimumSnodePoolCount) { + val target = seedNodePool.random() + val url = "$target/json_rpc" + Log.d("Loki", "Populating snode pool using: $target.") + val parameters = mapOf( + "method" to "get_n_service_nodes", + "params" to mapOf( + "active_only" to true, + "fields" to mapOf( "public_ip" to true, "storage_port" to true, "pubkey_x25519" to true, "pubkey_ed25519" to true ) + ) + ) + val deferred = deferred() + deferred(SnodeAPI.sharedContext) + Thread { + try { + val json = HTTP.execute(HTTP.Verb.POST, url, parameters, useSeedNodeConnection = true) + val intermediate = json["result"] as? Map<*, *> + val rawSnodes = intermediate?.get("service_node_states") as? List<*> + if (rawSnodes != null) { + @Suppress("NAME_SHADOWING") val snodePool = rawSnodes.mapNotNull { rawSnode -> + val rawSnodeAsJSON = rawSnode as? Map<*, *> + val address = rawSnodeAsJSON?.get("public_ip") as? String + val port = rawSnodeAsJSON?.get("storage_port") as? Int + val ed25519Key = rawSnodeAsJSON?.get("pubkey_ed25519") as? String + val x25519Key = rawSnodeAsJSON?.get("pubkey_x25519") as? String + if (address != null && port != null && ed25519Key != null && x25519Key != null && address != "0.0.0.0") { + Snode("https://$address", port, Snode.KeySet(ed25519Key, x25519Key)) + } else { + Log.d("Loki", "Failed to parse: ${rawSnode?.prettifiedDescription()}.") + null + } + }.toMutableSet() + Log.d("Loki", "Persisting snode pool to database.") + this.snodePool = snodePool + try { + deferred.resolve(snodePool.getRandomElement()) + } catch (exception: Exception) { + Log.d("Loki", "Got an empty snode pool from: $target.") + deferred.reject(SnodeAPI.Error.Generic) + } + } else { + Log.d("Loki", "Failed to update snode pool from: ${(rawSnodes as List<*>?)?.prettifiedDescription()}.") + deferred.reject(SnodeAPI.Error.Generic) + } + } catch (exception: Exception) { + deferred.reject(exception) + } + }.start() + return deferred.promise + } else { + return Promise.of(snodePool.getRandomElement()) + } + } + + public fun getSwarm(publicKey: String): Promise, Exception> { + val cachedSwarm = database.getSwarm(publicKey) + if (cachedSwarm != null && cachedSwarm.size >= minimumSwarmSnodeCount) { + val cachedSwarmCopy = mutableSetOf() // Workaround for a Kotlin compiler issue + cachedSwarmCopy.addAll(cachedSwarm) + return task { cachedSwarmCopy } + } else { + val parameters = mapOf( "pubKey" to publicKey ) + return getRandomSnode().bind { + SnodeAPI.shared.invoke(Snode.Method.GetSwarm, it, publicKey, parameters) + }.map(SnodeAPI.sharedContext) { + parseSnodes(it).toSet() + }.success { + database.setSwarm(publicKey, it) + } + } + } + + internal fun dropSnodeFromSwarmIfNeeded(snode: Snode, publicKey: String) { + val swarm = database.getSwarm(publicKey)?.toMutableSet() + if (swarm != null && swarm.contains(snode)) { + swarm.remove(snode) + database.setSwarm(publicKey, swarm) + } + } + + internal fun getSingleTargetSnode(publicKey: String): Promise { + // SecureRandom() should be cryptographically secure + return getSwarm(publicKey).map { it.shuffled(SecureRandom()).random() } + } + + internal fun getTargetSnodes(publicKey: String): Promise, Exception> { + // SecureRandom() should be cryptographically secure + return getSwarm(publicKey).map { it.shuffled(SecureRandom()).take(targetSwarmSnodeCount) } + } + // endregion + + // region Parsing + private fun parseSnodes(rawResponse: Any): List { + val json = rawResponse as? Map<*, *> + val rawSnodes = json?.get("snodes") as? List<*> + if (rawSnodes != null) { + return rawSnodes.mapNotNull { rawSnode -> + val rawSnodeAsJSON = rawSnode as? Map<*, *> + val address = rawSnodeAsJSON?.get("ip") as? String + val portAsString = rawSnodeAsJSON?.get("port") as? String + val port = portAsString?.toInt() + val ed25519Key = rawSnodeAsJSON?.get("pubkey_ed25519") as? String + val x25519Key = rawSnodeAsJSON?.get("pubkey_x25519") as? String + if (address != null && port != null && ed25519Key != null && x25519Key != null && address != "0.0.0.0") { + Snode("https://$address", port, Snode.KeySet(ed25519Key, x25519Key)) + } else { + Log.d("Loki", "Failed to parse snode from: ${rawSnode?.prettifiedDescription()}.") + null + } + } + } else { + Log.d("Loki", "Failed to parse snodes from: ${rawResponse.prettifiedDescription()}.") + return listOf() + } + } + // endregion +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/api/crypto/ProofOfWork.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/api/crypto/ProofOfWork.kt new file mode 100644 index 000000000..875030e6f --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/api/crypto/ProofOfWork.kt @@ -0,0 +1,64 @@ +package org.session.libsignal.service.loki.api.crypto + +import org.session.libsignal.libsignal.logging.Log +import org.session.libsignal.service.internal.util.Base64 +import org.session.libsignal.service.loki.api.SnodeAPI +import java.math.BigInteger +import java.nio.ByteBuffer +import java.security.MessageDigest + +/** + * Based on the desktop messenger's proof of work implementation. For more information, see libloki/proof-of-work.js. + */ +object ProofOfWork { + + // region Settings + private val nonceSize = 8 + // endregion + + // region Implementation + @kotlin.ExperimentalUnsignedTypes + fun calculate(data: String, hexEncodedPublicKey: String, timestamp: Long, ttl: Int): String? { + try { + val sha512 = MessageDigest.getInstance("SHA-512") + val payloadAsString = timestamp.toString() + ttl.toString() + hexEncodedPublicKey + data + val payload = payloadAsString.toByteArray() + val target = determineTarget(ttl, payload.size) + var currentTrialValue = ULong.MAX_VALUE + var nonce: Long = 0 + val initialHash = sha512.digest(payload) + while (currentTrialValue > target) { + nonce += 1 + // This is different from bitmessage's PoW implementation + // newHash = hash(nonce + hash(data)) → hash(nonce + initialHash) + val newHash = sha512.digest(nonce.toByteArray() + initialHash) + currentTrialValue = newHash.sliceArray(0 until nonceSize).toULong() + } + return Base64.encodeBytes(nonce.toByteArray()) + } catch (e: Exception) { + Log.d("Loki", "Couldn't calculate proof of work due to error: $e.") + return null + } + } + + @kotlin.ExperimentalUnsignedTypes + private fun determineTarget(ttl: Int, payloadSize: Int): ULong { + val x1 = BigInteger.valueOf(2).pow(16) - 1.toBigInteger() + val x2 = BigInteger.valueOf(2).pow(64) - 1.toBigInteger() + val size = (payloadSize + nonceSize).toBigInteger() + val ttlInSeconds = (ttl / 1000).toBigInteger() + val x3 = (ttlInSeconds * size) / x1 + val x4 = size + x3 + val x5 = SnodeAPI.powDifficulty.toBigInteger() * x4 + return (x2 / x5).toULong() + } + // endregion +} + +// region Convenience +@kotlin.ExperimentalUnsignedTypes +private fun BigInteger.toULong() = toLong().toULong() +private fun Long.toByteArray() = ByteBuffer.allocate(8).putLong(this).array() +@kotlin.ExperimentalUnsignedTypes +private fun ByteArray.toULong() = ByteBuffer.wrap(this).long.toULong() +// endregion diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/api/fileserver/FileServerAPI.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/api/fileserver/FileServerAPI.kt new file mode 100644 index 000000000..f77f29796 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/api/fileserver/FileServerAPI.kt @@ -0,0 +1,262 @@ +package org.session.libsignal.service.loki.api.fileserver + +import nl.komponents.kovenant.Promise +import nl.komponents.kovenant.functional.bind +import nl.komponents.kovenant.functional.map +import okhttp3.Request +import org.session.libsignal.libsignal.logging.Log +import org.session.libsignal.libsignal.util.Hex +import org.session.libsignal.service.internal.util.Base64 +import org.session.libsignal.service.internal.util.JsonUtil +import org.session.libsignal.service.loki.api.SnodeAPI +import org.session.libsignal.service.loki.api.LokiDotNetAPI +import org.session.libsignal.service.loki.api.onionrequests.OnionRequestAPI +import org.session.libsignal.service.loki.database.LokiAPIDatabaseProtocol +import org.session.libsignal.service.loki.protocol.shelved.multidevice.DeviceLink +import org.session.libsignal.service.loki.utilities.* +import java.net.URL +import java.util.concurrent.ConcurrentHashMap +import kotlin.collections.set + +class FileServerAPI(public val server: String, userPublicKey: String, userPrivateKey: ByteArray, private val database: LokiAPIDatabaseProtocol) : LokiDotNetAPI(userPublicKey, userPrivateKey, database) { + + companion object { + // region Settings + /** + * Deprecated. + */ + private val deviceLinkType = "network.loki.messenger.devicemapping" + /** + * Deprecated. + */ + private val deviceLinkRequestCache = ConcurrentHashMap, Exception>>() + /** + * Deprecated. + */ + private val deviceLinkUpdateInterval = 60 * 1000 + private val lastDeviceLinkUpdate = ConcurrentHashMap() + + internal val fileServerPublicKey = "62509D59BDEEC404DD0D489C1E15BA8F94FD3D619B01C1BF48A9922BFCB7311C" + internal val maxRetryCount = 4 + + public val maxFileSize = 10_000_000 // 10 MB + /** + * The file server has a file size limit of `maxFileSize`, which the Service Nodes try to enforce as well. However, the limit applied by the Service Nodes + * is on the **HTTP request** and not the actual file size. Because the file server expects the file data to be base 64 encoded, the size of the HTTP + * request for a given file will be at least `ceil(n / 3) * 4` bytes, where n is the file size in bytes. This is the minimum size because there might also + * be other parameters in the request. On average the multiplier appears to be about 1.5, so when checking whether the file will exceed the file size limit when + * uploading a file we just divide the size of the file by this number. The alternative would be to actually check the size of the HTTP request but that's only + * possible after proof of work has been calculated and the onion request encryption has happened, which takes several seconds. + */ + public val fileSizeORMultiplier = 2 // TODO: It should be possible to set this to 1.5? + public val fileStorageBucketURL = "https://file-static.lokinet.org" + // endregion + + // region Initialization + lateinit var shared: FileServerAPI + + /** + * Must be called before `LokiAPI` is used. + */ + fun configure(userPublicKey: String, userPrivateKey: ByteArray, database: LokiAPIDatabaseProtocol) { + if (Companion::shared.isInitialized) { return } + val server = "https://file.getsession.org" + shared = FileServerAPI(server, userPublicKey, userPrivateKey, database) + } + // endregion + } + + // region Device Link Update Result + sealed class DeviceLinkUpdateResult { + class Success(val publicKey: String, val deviceLinks: Set) : DeviceLinkUpdateResult() + class Failure(val publicKey: String, val error: Exception) : DeviceLinkUpdateResult() + } + // endregion + + // region API + public fun hasDeviceLinkCacheExpired(referenceTime: Long = System.currentTimeMillis(), publicKey: String): Boolean { + return !lastDeviceLinkUpdate.containsKey(publicKey) || (referenceTime - lastDeviceLinkUpdate[publicKey]!! > deviceLinkUpdateInterval) + } + + fun getDeviceLinks(publicKey: String, isForcedUpdate: Boolean = false): Promise, Exception> { + return Promise.of(setOf()) + /* + if (deviceLinkRequestCache.containsKey(publicKey) && !isForcedUpdate) { + val result = deviceLinkRequestCache[publicKey] + if (result != null) { return result } // A request was already pending + } + val promise = getDeviceLinks(setOf(publicKey), isForcedUpdate) + deviceLinkRequestCache[publicKey] = promise + promise.always { + deviceLinkRequestCache.remove(publicKey) + } + return promise + */ + } + + fun getDeviceLinks(publicKeys: Set, isForcedUpdate: Boolean = false): Promise, Exception> { + return Promise.of(setOf()) + /* + val validPublicKeys = publicKeys.filter { PublicKeyValidation.isValid(it) } + val now = System.currentTimeMillis() + // IMPORTANT: Don't fetch device links for the current user (i.e. don't remove the it != userHexEncodedPublicKey) check below + val updatees = validPublicKeys.filter { it != userPublicKey && (hasDeviceLinkCacheExpired(now, it) || isForcedUpdate) }.toSet() + val cachedDeviceLinks = validPublicKeys.minus(updatees).flatMap { database.getDeviceLinks(it) }.toSet() + if (updatees.isEmpty()) { + return Promise.of(cachedDeviceLinks) + } else { + return getUserProfiles(updatees, server, true).map(SnodeAPI.sharedContext) { data -> + data.map dataMap@ { node -> + val publicKey = node["username"] as String + val annotations = node["annotations"] as List> + val deviceLinksAnnotation = annotations.find { + annotation -> (annotation["type"] as String) == deviceLinkType + } ?: return@dataMap DeviceLinkUpdateResult.Success(publicKey, setOf()) + val value = deviceLinksAnnotation["value"] as Map<*, *> + val deviceLinksAsJSON = value["authorisations"] as List> + val deviceLinks = deviceLinksAsJSON.mapNotNull { deviceLinkAsJSON -> + try { + val masterPublicKey = deviceLinkAsJSON["primaryDevicePubKey"] as String + val slavePublicKey = deviceLinkAsJSON["secondaryDevicePubKey"] as String + var requestSignature: ByteArray? = null + var authorizationSignature: ByteArray? = null + if (deviceLinkAsJSON["requestSignature"] != null) { + val base64EncodedSignature = deviceLinkAsJSON["requestSignature"] as String + requestSignature = Base64.decode(base64EncodedSignature) + } + if (deviceLinkAsJSON["grantSignature"] != null) { + val base64EncodedSignature = deviceLinkAsJSON["grantSignature"] as String + authorizationSignature = Base64.decode(base64EncodedSignature) + } + val deviceLink = DeviceLink(masterPublicKey, slavePublicKey, requestSignature, authorizationSignature) + val isValid = deviceLink.verify() + if (!isValid) { + Log.d("Loki", "Ignoring invalid device link: $deviceLinkAsJSON.") + return@mapNotNull null + } + deviceLink + } catch (e: Exception) { + Log.d("Loki", "Failed to parse device links for $publicKey from $deviceLinkAsJSON due to error: $e.") + null + } + }.toSet() + DeviceLinkUpdateResult.Success(publicKey, deviceLinks) + } + }.recover { e -> + publicKeys.map { DeviceLinkUpdateResult.Failure(it, e) } + }.success { updateResults -> + for (updateResult in updateResults) { + if (updateResult is DeviceLinkUpdateResult.Success) { + database.clearDeviceLinks(updateResult.publicKey) + updateResult.deviceLinks.forEach { database.addDeviceLink(it) } + } else { + // Do nothing + } + } + }.map(SnodeAPI.sharedContext) { updateResults -> + val deviceLinks = mutableListOf() + for (updateResult in updateResults) { + when (updateResult) { + is DeviceLinkUpdateResult.Success -> { + lastDeviceLinkUpdate[updateResult.publicKey] = now + deviceLinks.addAll(updateResult.deviceLinks) + } + is DeviceLinkUpdateResult.Failure -> { + if (updateResult.error is SnodeAPI.Error.ParsingFailed) { + lastDeviceLinkUpdate[updateResult.publicKey] = now // Don't infinitely update in case of a parsing failure + } + deviceLinks.addAll(database.getDeviceLinks(updateResult.publicKey)) // Fall back on cached device links in case of a failure + } + } + } + // Updatees that didn't show up in the response provided by the file server are assumed to not have any device links + val excludedUpdatees = updatees.filter { updatee -> + updateResults.find { updateResult -> + when (updateResult) { + is DeviceLinkUpdateResult.Success -> updateResult.publicKey == updatee + is DeviceLinkUpdateResult.Failure -> updateResult.publicKey == updatee + } + } == null + } + excludedUpdatees.forEach { + lastDeviceLinkUpdate[it] = now + } + deviceLinks.union(cachedDeviceLinks) + }.recover { + publicKeys.flatMap { database.getDeviceLinks(it) }.toSet() + } + } + */ + } + + fun setDeviceLinks(deviceLinks: Set): Promise { + return Promise.of(Unit) + /* + val isMaster = deviceLinks.find { it.masterPublicKey == userPublicKey } != null + val deviceLinksAsJSON = deviceLinks.map { it.toJSON() } + val value = if (deviceLinks.isNotEmpty()) mapOf( "isPrimary" to isMaster, "authorisations" to deviceLinksAsJSON ) else null + val annotation = mapOf( "type" to deviceLinkType, "value" to value ) + val parameters = mapOf( "annotations" to listOf( annotation ) ) + return retryIfNeeded(maxRetryCount) { + execute(HTTPVerb.PATCH, server, "/users/me", parameters = parameters) + }.map { Unit } + */ + } + + fun addDeviceLink(deviceLink: DeviceLink): Promise { + return Promise.of(Unit) + /* + Log.d("Loki", "Updating device links.") + return getDeviceLinks(userPublicKey, true).bind { deviceLinks -> + val mutableDeviceLinks = deviceLinks.toMutableSet() + mutableDeviceLinks.add(deviceLink) + setDeviceLinks(mutableDeviceLinks) + }.success { + database.addDeviceLink(deviceLink) + }.map { Unit } + */ + } + + fun removeDeviceLink(deviceLink: DeviceLink): Promise { + return Promise.of(Unit) + /* + Log.d("Loki", "Updating device links.") + return getDeviceLinks(userPublicKey, true).bind { deviceLinks -> + val mutableDeviceLinks = deviceLinks.toMutableSet() + mutableDeviceLinks.remove(deviceLink) + setDeviceLinks(mutableDeviceLinks) + }.success { + database.removeDeviceLink(deviceLink) + }.map { Unit } + */ + } + // endregion + + // region Open Group Server Public Key + fun getPublicKeyForOpenGroupServer(openGroupServer: String): Promise { + val publicKey = database.getOpenGroupPublicKey(openGroupServer) + if (publicKey != null && PublicKeyValidation.isValid(publicKey, 64, false)) { + return Promise.of(publicKey) + } else { + val url = "$server/loki/v1/getOpenGroupKey/${URL(openGroupServer).host}" + val request = Request.Builder().url(url) + request.addHeader("Content-Type", "application/json") + request.addHeader("Authorization", "Bearer loki") // Tokenless request; use a dummy token + return OnionRequestAPI.sendOnionRequest(request.build(), server, fileServerPublicKey).map { json -> + try { + val bodyAsString = json["data"] as String + val body = JsonUtil.fromJson(bodyAsString) + val base64EncodedPublicKey = body.get("data").asText() + val prefixedPublicKey = Base64.decode(base64EncodedPublicKey) + val hexEncodedPrefixedPublicKey = prefixedPublicKey.toHexString() + val result = hexEncodedPrefixedPublicKey.removing05PrefixIfNeeded() + database.setOpenGroupPublicKey(openGroupServer, result) + result + } catch (exception: Exception) { + Log.d("Loki", "Couldn't parse open group public key from: $json.") + throw exception + } + } + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/api/onionrequests/OnionRequestAPI.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/api/onionrequests/OnionRequestAPI.kt new file mode 100644 index 000000000..b5e04e675 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/api/onionrequests/OnionRequestAPI.kt @@ -0,0 +1,459 @@ +package org.session.libsignal.service.loki.api.onionrequests + +import nl.komponents.kovenant.Promise +import nl.komponents.kovenant.all +import nl.komponents.kovenant.deferred +import nl.komponents.kovenant.functional.bind +import nl.komponents.kovenant.functional.map +import okhttp3.Request +import org.session.libsignal.libsignal.logging.Log +import org.session.libsignal.service.internal.util.Base64 +import org.session.libsignal.service.internal.util.JsonUtil +import org.session.libsignal.service.loki.api.* +import org.session.libsignal.service.loki.api.fileserver.FileServerAPI +import org.session.libsignal.service.loki.api.utilities.* +import org.session.libsignal.service.loki.api.utilities.EncryptionResult +import org.session.libsignal.service.loki.api.utilities.getBodyForOnionRequest +import org.session.libsignal.service.loki.api.utilities.getHeadersForOnionRequest +import org.session.libsignal.service.loki.utilities.* + +private typealias Path = List + +/** + * See the "Onion Requests" section of [The Session Whitepaper](https://arxiv.org/pdf/2002.04609.pdf) for more information. + */ +public object OnionRequestAPI { + private val pathFailureCount = mutableMapOf() + private val snodeFailureCount = mutableMapOf() + public var guardSnodes = setOf() + public var paths: List // Not a set to ensure we consistently show the same path to the user + get() = SnodeAPI.shared.database.getOnionRequestPaths() + set(newValue) { + if (newValue.isEmpty()) { + SnodeAPI.shared.database.clearOnionRequestPaths() + } else { + SnodeAPI.shared.database.setOnionRequestPaths(newValue) + } + } + + // region Settings + /** + * The number of snodes (including the guard snode) in a path. + */ + private val pathSize = 3 + /** + * The number of times a path can fail before it's replaced. + */ + private val pathFailureThreshold = 2 + /** + * The number of times a snode can fail before it's replaced. + */ + private val snodeFailureThreshold = 2 + /** + * The number of paths to maintain. + */ + public val targetPathCount = 2 // A main path and a backup path for the case where the target snode is in the main path + + /** + * The number of guard snodes required to maintain `targetPathCount` paths. + */ + private val targetGuardSnodeCount + get() = targetPathCount // One per path + // endregion + + class HTTPRequestFailedAtDestinationException(val statusCode: Int, val json: Map<*, *>) + : Exception("HTTP request failed at destination with status code $statusCode.") + class InsufficientSnodesException : Exception("Couldn't find enough snodes to build a path.") + + private data class OnionBuildingResult( + internal val guardSnode: Snode, + internal val finalEncryptionResult: EncryptionResult, + internal val destinationSymmetricKey: ByteArray + ) + + internal sealed class Destination { + class Snode(val snode: org.session.libsignal.service.loki.api.Snode) : Destination() + class Server(val host: String, val target: String, val x25519PublicKey: String) : Destination() + } + + // region Private API + /** + * Tests the given snode. The returned promise errors out if the snode is faulty; the promise is fulfilled otherwise. + */ + private fun testSnode(snode: Snode): Promise { + val deferred = deferred() + Thread { // No need to block the shared context for this + val url = "${snode.address}:${snode.port}/get_stats/v1" + try { + val json = HTTP.execute(HTTP.Verb.GET, url) + val version = json["version"] as? String + if (version == null) { deferred.reject(Exception("Missing snode version.")); return@Thread } + if (version >= "2.0.7") { + deferred.resolve(Unit) + } else { + val message = "Unsupported snode version: $version." + Log.d("Loki", message) + deferred.reject(Exception(message)) + } + } catch (exception: Exception) { + deferred.reject(exception) + } + }.start() + return deferred.promise + } + + /** + * Finds `targetGuardSnodeCount` guard snodes to use for path building. The returned promise errors out if not + * enough (reliable) snodes are available. + */ + private fun getGuardSnodes(reusableGuardSnodes: List): Promise, Exception> { + if (guardSnodes.count() >= targetGuardSnodeCount) { + return Promise.of(guardSnodes) + } else { + Log.d("Loki", "Populating guard snode cache.") + return SwarmAPI.shared.getRandomSnode().bind(SnodeAPI.sharedContext) { // Just used to populate the snode pool + var unusedSnodes = SwarmAPI.shared.snodePool.minus(reusableGuardSnodes) + val reusableGuardSnodeCount = reusableGuardSnodes.count() + if (unusedSnodes.count() < (targetGuardSnodeCount - reusableGuardSnodeCount)) { throw InsufficientSnodesException() } + fun getGuardSnode(): Promise { + val candidate = unusedSnodes.getRandomElementOrNull() + ?: return Promise.ofFail(InsufficientSnodesException()) + unusedSnodes = unusedSnodes.minus(candidate) + Log.d("Loki", "Testing guard snode: $candidate.") + // Loop until a reliable guard snode is found + val deferred = deferred() + testSnode(candidate).success { + deferred.resolve(candidate) + }.fail { + getGuardSnode().success { + deferred.resolve(candidate) + }.fail { exception -> + if (exception is InsufficientSnodesException) { + deferred.reject(exception) + } + } + } + return deferred.promise + } + val promises = (0 until (targetGuardSnodeCount - reusableGuardSnodeCount)).map { getGuardSnode() } + all(promises).map(SnodeAPI.sharedContext) { guardSnodes -> + val guardSnodesAsSet = (guardSnodes + reusableGuardSnodes).toSet() + OnionRequestAPI.guardSnodes = guardSnodesAsSet + guardSnodesAsSet + } + } + } + } + + /** + * Builds and returns `targetPathCount` paths. The returned promise errors out if not + * enough (reliable) snodes are available. + */ + private fun buildPaths(reusablePaths: List): Promise, Exception> { + Log.d("Loki", "Building onion request paths.") + SnodeAPI.shared.broadcaster.broadcast("buildingPaths") + return SwarmAPI.shared.getRandomSnode().bind(SnodeAPI.sharedContext) { // Just used to populate the snode pool + val reusableGuardSnodes = reusablePaths.map { it[0] } + getGuardSnodes(reusableGuardSnodes).map(SnodeAPI.sharedContext) { guardSnodes -> + var unusedSnodes = SwarmAPI.shared.snodePool.minus(guardSnodes).minus(reusablePaths.flatten()) + val reusableGuardSnodeCount = reusableGuardSnodes.count() + val pathSnodeCount = (targetGuardSnodeCount - reusableGuardSnodeCount) * pathSize - (targetGuardSnodeCount - reusableGuardSnodeCount) + if (unusedSnodes.count() < pathSnodeCount) { throw InsufficientSnodesException() } + // Don't test path snodes as this would reveal the user's IP to them + guardSnodes.minus(reusableGuardSnodes).map { guardSnode -> + val result = listOf( guardSnode ) + (0 until (pathSize - 1)).map { + val pathSnode = unusedSnodes.getRandomElement() + unusedSnodes = unusedSnodes.minus(pathSnode) + pathSnode + } + Log.d("Loki", "Built new onion request path: $result.") + result + } + }.map { paths -> + OnionRequestAPI.paths = paths + reusablePaths + SnodeAPI.shared.broadcaster.broadcast("pathsBuilt") + paths + } + } + } + + /** + * Returns a `Path` to be used for building an onion request. Builds new paths as needed. + */ + private fun getPath(snodeToExclude: Snode?): Promise { + if (pathSize < 1) { throw Exception("Can't build path of size zero.") } + val paths = this.paths + val guardSnodes = mutableSetOf() + if (paths.isNotEmpty()) { + guardSnodes.add(paths[0][0]) + if (paths.count() >= 2) { + guardSnodes.add(paths[1][0]) + } + } + OnionRequestAPI.guardSnodes = guardSnodes + fun getPath(paths: List): Path { + if (snodeToExclude != null) { + return paths.filter { !it.contains(snodeToExclude) }.getRandomElement() + } else { + return paths.getRandomElement() + } + } + if (paths.count() >= targetPathCount) { + return Promise.of(getPath(paths)) + } else if (paths.isNotEmpty()) { + if (paths.any { !it.contains(snodeToExclude) }) { + buildPaths(paths) // Re-build paths in the background + return Promise.of(getPath(paths)) + } else { + return buildPaths(paths).map(SnodeAPI.sharedContext) { newPaths -> + getPath(newPaths) + } + } + } else { + return buildPaths(listOf()).map(SnodeAPI.sharedContext) { newPaths -> + getPath(newPaths) + } + } + } + + private fun dropGuardSnode(snode: Snode) { + guardSnodes = guardSnodes.filter { it != snode }.toSet() + } + + private fun dropSnode(snode: Snode) { + // We repair the path here because we can do it sync. In the case where we drop a whole + // path we leave the re-building up to getPath() because re-building the path in that case + // is async. + snodeFailureCount[snode] = 0 + val oldPaths = paths.toMutableList() + val pathIndex = oldPaths.indexOfFirst { it.contains(snode) } + if (pathIndex == -1) { return } + val path = oldPaths[pathIndex].toMutableList() + val snodeIndex = path.indexOf(snode) + if (snodeIndex == -1) { return } + path.removeAt(snodeIndex) + val unusedSnodes = SwarmAPI.shared.snodePool.minus(oldPaths.flatten()) + if (unusedSnodes.isEmpty()) { throw InsufficientSnodesException() } + path.add(unusedSnodes.getRandomElement()) + // Don't test the new snode as this would reveal the user's IP + oldPaths.removeAt(pathIndex) + val newPaths = oldPaths + listOf( path ) + paths = newPaths + } + + private fun dropPath(path: Path) { + pathFailureCount[path] = 0 + val paths = OnionRequestAPI.paths.toMutableList() + val pathIndex = paths.indexOf(path) + if (pathIndex == -1) { return } + paths.removeAt(pathIndex) + OnionRequestAPI.paths = paths + } + + /** + * Builds an onion around `payload` and returns the result. + */ + private fun buildOnionForDestination(payload: Map<*, *>, destination: Destination): Promise { + lateinit var guardSnode: Snode + lateinit var destinationSymmetricKey: ByteArray // Needed by LokiAPI to decrypt the response sent back by the destination + lateinit var encryptionResult: EncryptionResult + val snodeToExclude = when (destination) { + is Destination.Snode -> destination.snode + is Destination.Server -> null + } + return getPath(snodeToExclude).bind(SnodeAPI.sharedContext) { path -> + guardSnode = path.first() + // Encrypt in reverse order, i.e. the destination first + OnionRequestEncryption.encryptPayloadForDestination(payload, destination).bind(SnodeAPI.sharedContext) { r -> + destinationSymmetricKey = r.symmetricKey + // Recursively encrypt the layers of the onion (again in reverse order) + encryptionResult = r + @Suppress("NAME_SHADOWING") var path = path + var rhs = destination + fun addLayer(): Promise { + if (path.isEmpty()) { + return Promise.of(encryptionResult) + } else { + val lhs = Destination.Snode(path.last()) + path = path.dropLast(1) + return OnionRequestEncryption.encryptHop(lhs, rhs, encryptionResult).bind(SnodeAPI.sharedContext) { r -> + encryptionResult = r + rhs = lhs + addLayer() + } + } + } + addLayer() + } + }.map(SnodeAPI.sharedContext) { OnionBuildingResult(guardSnode, encryptionResult, destinationSymmetricKey) } + } + + /** + * Sends an onion request to `destination`. Builds new paths as needed. + */ + private fun sendOnionRequest(destination: Destination, payload: Map<*, *>, isJSONRequired: Boolean = true): Promise, Exception> { + val deferred = deferred, Exception>() + lateinit var guardSnode: Snode + buildOnionForDestination(payload, destination).success { result -> + guardSnode = result.guardSnode + val url = "${guardSnode.address}:${guardSnode.port}/onion_req/v2" + val finalEncryptionResult = result.finalEncryptionResult + val onion = finalEncryptionResult.ciphertext + if (destination is Destination.Server && onion.count().toDouble() > 0.75 * FileServerAPI.maxFileSize.toDouble()) { + Log.d("Loki", "Approaching request size limit: ~${onion.count()} bytes.") + } + @Suppress("NAME_SHADOWING") val parameters = mapOf( + "ephemeral_key" to finalEncryptionResult.ephemeralPublicKey.toHexString() + ) + val body: ByteArray + try { + body = OnionRequestEncryption.encode(onion, parameters) + } catch (exception: Exception) { + return@success deferred.reject(exception) + } + val destinationSymmetricKey = result.destinationSymmetricKey + Thread { + try { + val json = HTTP.execute(HTTP.Verb.POST, url, body) + val base64EncodedIVAndCiphertext = json["result"] as? String ?: return@Thread deferred.reject(Exception("Invalid JSON")) + val ivAndCiphertext = Base64.decode(base64EncodedIVAndCiphertext) + try { + val plaintext = DecryptionUtilities.decryptUsingAESGCM(ivAndCiphertext, destinationSymmetricKey) + try { + @Suppress("NAME_SHADOWING") val json = JsonUtil.fromJson(plaintext.toString(Charsets.UTF_8), Map::class.java) + val statusCode = json["status"] as Int + if (statusCode == 406) { + @Suppress("NAME_SHADOWING") val body = mapOf( "result" to "Your clock is out of sync with the service node network." ) + val exception = HTTPRequestFailedAtDestinationException(statusCode, body) + return@Thread deferred.reject(exception) + } else if (json["body"] != null) { + @Suppress("NAME_SHADOWING") val body: Map<*, *> + if (json["body"] is Map<*, *>) { + body = json["body"] as Map<*, *> + } else { + val bodyAsString = json["body"] as String + if (!isJSONRequired) { + body = mapOf( "result" to bodyAsString ) + } else { + body = JsonUtil.fromJson(bodyAsString, Map::class.java) + } + } + if (statusCode != 200) { + val exception = HTTPRequestFailedAtDestinationException(statusCode, body) + return@Thread deferred.reject(exception) + } + deferred.resolve(body) + } else { + if (statusCode != 200) { + val exception = HTTPRequestFailedAtDestinationException(statusCode, json) + return@Thread deferred.reject(exception) + } + deferred.resolve(json) + } + } catch (exception: Exception) { + deferred.reject(Exception("Invalid JSON: ${plaintext.toString(Charsets.UTF_8)}.")) + } + } catch (exception: Exception) { + deferred.reject(exception) + } + } catch (exception: Exception) { + deferred.reject(exception) + } + }.start() + }.fail { exception -> + deferred.reject(exception) + } + val promise = deferred.promise + promise.fail { exception -> + val path = paths.firstOrNull { it.contains(guardSnode) } + if (exception is HTTP.HTTPRequestFailedException) { + fun handleUnspecificError() { + if (path == null) { return } + var pathFailureCount = OnionRequestAPI.pathFailureCount[path] ?: 0 + pathFailureCount += 1 + if (pathFailureCount >= pathFailureThreshold) { + dropGuardSnode(guardSnode) + path.forEach { snode -> + @Suppress("ThrowableNotThrown") + SnodeAPI.shared.handleSnodeError(exception.statusCode, exception.json, snode, null) // Intentionally don't throw + } + dropPath(path) + } else { + OnionRequestAPI.pathFailureCount[path] = pathFailureCount + } + } + val json = exception.json + val message = json?.get("result") as? String + val prefix = "Next node not found: " + if (message != null && message.startsWith(prefix)) { + val ed25519PublicKey = message.substringAfter(prefix) + val snode = path?.firstOrNull { it.publicKeySet!!.ed25519Key == ed25519PublicKey } + if (snode != null) { + var snodeFailureCount = OnionRequestAPI.snodeFailureCount[snode] ?: 0 + snodeFailureCount += 1 + if (snodeFailureCount >= snodeFailureThreshold) { + @Suppress("ThrowableNotThrown") + SnodeAPI.shared.handleSnodeError(exception.statusCode, json, snode, null) // Intentionally don't throw + try { + dropSnode(snode) + } catch (exception: Exception) { + handleUnspecificError() + } + } else { + OnionRequestAPI.snodeFailureCount[snode] = snodeFailureCount + } + } else { + handleUnspecificError() + } + } else if (message == "Loki Server error") { + // Do nothing + } else { + handleUnspecificError() + } + } + } + return promise + } + // endregion + + // region Internal API + /** + * Sends an onion request to `snode`. Builds new paths as needed. + */ + internal fun sendOnionRequest(method: Snode.Method, parameters: Map<*, *>, snode: Snode, publicKey: String): Promise, Exception> { + val payload = mapOf( "method" to method.rawValue, "params" to parameters ) + return sendOnionRequest(Destination.Snode(snode), payload).recover { exception -> + @Suppress("NAME_SHADOWING") val exception = exception as? HTTPRequestFailedAtDestinationException ?: throw exception + throw SnodeAPI.shared.handleSnodeError(exception.statusCode, exception.json, snode, publicKey) + } + } + + /** + * Sends an onion request to `server`. Builds new paths as needed. + * + * `publicKey` is the hex encoded public key of the user the call is associated with. This is needed for swarm cache maintenance. + */ + public fun sendOnionRequest(request: Request, server: String, x25519PublicKey: String, target: String = "/loki/v3/lsrpc", isJSONRequired: Boolean = true): Promise, Exception> { + val headers = request.getHeadersForOnionRequest() + val url = request.url() + val urlAsString = url.toString() + val host = url.host() + val endpoint = when { + server.count() < urlAsString.count() -> urlAsString.substringAfter("$server/") + else -> "" + } + val body = request.getBodyForOnionRequest() ?: "null" + val payload = mapOf( + "body" to body, + "endpoint" to endpoint, + "method" to request.method(), + "headers" to headers + ) + val destination = Destination.Server(host, target, x25519PublicKey) + return sendOnionRequest(destination, payload, isJSONRequired).recover { exception -> + Log.d("Loki", "Couldn't reach server: $urlAsString due to error: $exception.") + throw exception + } + } + // endregion +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/api/onionrequests/OnionRequestEncryption.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/api/onionrequests/OnionRequestEncryption.kt new file mode 100644 index 000000000..fad358998 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/api/onionrequests/OnionRequestEncryption.kt @@ -0,0 +1,94 @@ +package org.session.libsignal.service.loki.api.onionrequests + +import nl.komponents.kovenant.Promise +import nl.komponents.kovenant.deferred +import org.session.libsignal.service.internal.util.JsonUtil +import org.session.libsignal.service.loki.api.utilities.EncryptionResult +import org.session.libsignal.service.loki.api.utilities.EncryptionUtilities +import org.session.libsignal.service.loki.utilities.toHexString +import java.nio.Buffer +import java.nio.ByteBuffer +import java.nio.ByteOrder + +object OnionRequestEncryption { + + internal fun encode(ciphertext: ByteArray, json: Map<*, *>): ByteArray { + // The encoding of V2 onion requests looks like: | 4 bytes: size N of ciphertext | N bytes: ciphertext | json as utf8 | + val jsonAsData = JsonUtil.toJson(json).toByteArray() + val ciphertextSize = ciphertext.size + val buffer = ByteBuffer.allocate(Int.SIZE_BYTES) + buffer.order(ByteOrder.LITTLE_ENDIAN) + buffer.putInt(ciphertextSize) + val ciphertextSizeAsData = ByteArray(buffer.capacity()) + // Casting here avoids an issue where this gets compiled down to incorrect byte code. See + // https://github.com/eclipse/jetty.project/issues/3244 for more info + (buffer as Buffer).position(0) + buffer.get(ciphertextSizeAsData) + return ciphertextSizeAsData + ciphertext + jsonAsData + } + + /** + * Encrypts `payload` for `destination` and returns the result. Use this to build the core of an onion request. + */ + internal fun encryptPayloadForDestination(payload: Map<*, *>, destination: OnionRequestAPI.Destination): Promise { + val deferred = deferred() + Thread { + try { + // Wrapping isn't needed for file server or open group onion requests + when (destination) { + is OnionRequestAPI.Destination.Snode -> { + val snodeX25519PublicKey = destination.snode.publicKeySet!!.x25519Key + val payloadAsData = JsonUtil.toJson(payload).toByteArray() + val plaintext = encode(payloadAsData, mapOf( "headers" to "" )) + val result = EncryptionUtilities.encryptForX25519PublicKey(plaintext, snodeX25519PublicKey) + deferred.resolve(result) + } + is OnionRequestAPI.Destination.Server -> { + val plaintext = JsonUtil.toJson(payload).toByteArray() + val result = EncryptionUtilities.encryptForX25519PublicKey(plaintext, destination.x25519PublicKey) + deferred.resolve(result) + } + } + } catch (exception: Exception) { + deferred.reject(exception) + } + }.start() + return deferred.promise + } + + /** + * Encrypts the previous encryption result (i.e. that of the hop after this one) for this hop. Use this to build the layers of an onion request. + */ + internal fun encryptHop(lhs: OnionRequestAPI.Destination, rhs: OnionRequestAPI.Destination, previousEncryptionResult: EncryptionResult): Promise { + val deferred = deferred() + Thread { + try { + val payload: MutableMap + when (rhs) { + is OnionRequestAPI.Destination.Snode -> { + payload = mutableMapOf( "destination" to rhs.snode.publicKeySet!!.ed25519Key ) + } + is OnionRequestAPI.Destination.Server -> { + payload = mutableMapOf( "host" to rhs.host, "target" to rhs.target, "method" to "POST" ) + } + } + payload["ephemeral_key"] = previousEncryptionResult.ephemeralPublicKey.toHexString() + val x25519PublicKey: String + when (lhs) { + is OnionRequestAPI.Destination.Snode -> { + x25519PublicKey = lhs.snode.publicKeySet!!.x25519Key + } + is OnionRequestAPI.Destination.Server -> { + x25519PublicKey = lhs.x25519PublicKey + } + } + val plaintext = encode(previousEncryptionResult.ciphertext, payload) + val result = EncryptionUtilities.encryptForX25519PublicKey(plaintext, x25519PublicKey) + deferred.resolve(result) + } catch (exception: Exception) { + deferred.reject(exception) + } + }.start() + return deferred.promise + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/api/opengroups/PublicChat.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/api/opengroups/PublicChat.kt new file mode 100644 index 000000000..87ae011ad --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/api/opengroups/PublicChat.kt @@ -0,0 +1,37 @@ +package org.session.libsignal.service.loki.api.opengroups + +import org.session.libsignal.service.internal.util.JsonUtil + +public data class PublicChat( + public val channel: Long, + private val serverURL: String, + public val displayName: String, + public val isDeletable: Boolean +) { + public val server get() = serverURL.toLowerCase() + public val id get() = getId(channel, server) + + companion object { + + @JvmStatic fun getId(channel: Long, server: String): String { + return "$server.$channel" + } + + @JvmStatic fun fromJSON(jsonAsString: String): PublicChat? { + try { + val json = JsonUtil.fromJson(jsonAsString) + val channel = json.get("channel").asLong() + val server = json.get("server").asText().toLowerCase() + val displayName = json.get("displayName").asText() + val isDeletable = json.get("isDeletable").asBoolean() + return PublicChat(channel, server, displayName, isDeletable) + } catch (e: Exception) { + return null + } + } + } + + public fun toJSON(): Map { + return mapOf( "channel" to channel, "server" to server, "displayName" to displayName, "isDeletable" to isDeletable ) + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/api/opengroups/PublicChatAPI.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/api/opengroups/PublicChatAPI.kt new file mode 100644 index 000000000..5ca9cb787 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/api/opengroups/PublicChatAPI.kt @@ -0,0 +1,378 @@ +package org.session.libsignal.service.loki.api.opengroups + +import nl.komponents.kovenant.Kovenant +import nl.komponents.kovenant.Promise +import nl.komponents.kovenant.deferred +import nl.komponents.kovenant.functional.map +import nl.komponents.kovenant.then +import org.session.libsignal.libsignal.logging.Log +import org.session.libsignal.service.internal.util.Base64 +import org.session.libsignal.service.internal.util.Hex +import org.session.libsignal.service.internal.util.JsonUtil +import org.session.libsignal.service.loki.api.LokiDotNetAPI +import org.session.libsignal.service.loki.api.SnodeAPI +import org.session.libsignal.service.loki.api.fileserver.FileServerAPI +import org.session.libsignal.service.loki.database.LokiAPIDatabaseProtocol +import org.session.libsignal.service.loki.database.LokiOpenGroupDatabaseProtocol +import org.session.libsignal.service.loki.database.LokiUserDatabaseProtocol +import org.session.libsignal.service.loki.utilities.DownloadUtilities +import org.session.libsignal.service.loki.utilities.createContext +import org.session.libsignal.service.loki.utilities.retryIfNeeded +import java.io.ByteArrayOutputStream +import java.text.SimpleDateFormat +import java.util.* + +class PublicChatAPI(userPublicKey: String, private val userPrivateKey: ByteArray, private val apiDatabase: LokiAPIDatabaseProtocol, + private val userDatabase: LokiUserDatabaseProtocol, private val openGroupDatabase: LokiOpenGroupDatabaseProtocol) : LokiDotNetAPI(userPublicKey, userPrivateKey, apiDatabase) { + + companion object { + private val moderators: HashMap>> = hashMapOf() // Server URL to (channel ID to set of moderator IDs) + val sharedContext = Kovenant.createContext("LokiPublicChatAPISharedContext") + + // region Settings + private val fallbackBatchCount = 64 + private val maxRetryCount = 8 + // endregion + + // region Convenience + private val channelInfoType = "net.patter-app.settings" + private val attachmentType = "net.app.core.oembed" + @JvmStatic + public val publicChatMessageType = "network.loki.messenger.publicChat" + @JvmStatic + public val profilePictureType = "network.loki.messenger.avatar" + + fun getDefaultChats(): List { + return listOf() // Don't auto-join any open groups right now + } + + public fun isUserModerator(hexEncodedPublicKey: String, channel: Long, server: String): Boolean { + if (moderators[server] != null && moderators[server]!![channel] != null) { + return moderators[server]!![channel]!!.contains(hexEncodedPublicKey) + } + return false + } + // endregion + } + + // region Public API + public fun getMessages(channel: Long, server: String): Promise, Exception> { + Log.d("Loki", "Getting messages for open group with ID: $channel on server: $server.") + val parameters = mutableMapOf( "include_annotations" to 1 ) + val lastMessageServerID = apiDatabase.getLastMessageServerID(channel, server) + if (lastMessageServerID != null) { + parameters["since_id"] = lastMessageServerID + } else { + parameters["count"] = fallbackBatchCount + parameters["include_deleted"] = 0 + } + return execute(HTTPVerb.GET, server, "channels/$channel/messages", parameters = parameters).then(sharedContext) { json -> + try { + val data = json["data"] as List> + val messages = data.mapNotNull { message -> + try { + val isDeleted = message["is_deleted"] as? Boolean ?: false + if (isDeleted) { return@mapNotNull null } + // Ignore messages without annotations + if (message["annotations"] == null) { return@mapNotNull null } + val annotation = (message["annotations"] as List>).find { + ((it["type"] as? String ?: "") == publicChatMessageType) && it["value"] != null + } ?: return@mapNotNull null + val value = annotation["value"] as Map<*, *> + val serverID = message["id"] as? Long ?: (message["id"] as? Int)?.toLong() ?: (message["id"] as String).toLong() + val user = message["user"] as Map<*, *> + val publicKey = user["username"] as String + val displayName = user["name"] as? String ?: "Anonymous" + var profilePicture: PublicChatMessage.ProfilePicture? = null + if (user["annotations"] != null) { + val profilePictureAnnotation = (user["annotations"] as List>).find { + ((it["type"] as? String ?: "") == profilePictureType) && it["value"] != null + } + val profilePictureAnnotationValue = profilePictureAnnotation?.get("value") as? Map<*, *> + if (profilePictureAnnotationValue != null && profilePictureAnnotationValue["profileKey"] != null && profilePictureAnnotationValue["url"] != null) { + try { + val profileKey = Base64.decode(profilePictureAnnotationValue["profileKey"] as String) + val url = profilePictureAnnotationValue["url"] as String + profilePicture = PublicChatMessage.ProfilePicture(profileKey, url) + } catch (e: Exception) {} + } + } + @Suppress("NAME_SHADOWING") val body = message["text"] as String + val timestamp = value["timestamp"] as? Long ?: (value["timestamp"] as? Int)?.toLong() ?: (value["timestamp"] as String).toLong() + var quote: PublicChatMessage.Quote? = null + if (value["quote"] != null) { + val replyTo = message["reply_to"] as? Long ?: (message["reply_to"] as? Int)?.toLong() ?: (message["reply_to"] as String).toLong() + val quoteAnnotation = value["quote"] as? Map<*, *> + val quoteTimestamp = quoteAnnotation?.get("id") as? Long ?: (quoteAnnotation?.get("id") as? Int)?.toLong() ?: (quoteAnnotation?.get("id") as? String)?.toLong() ?: 0L + val author = quoteAnnotation?.get("author") as? String + val text = quoteAnnotation?.get("text") as? String + quote = if (quoteTimestamp > 0L && author != null && text != null) PublicChatMessage.Quote(quoteTimestamp, author, text, replyTo) else null + } + val attachmentsAsJSON = (message["annotations"] as List>).filter { + ((it["type"] as? String ?: "") == attachmentType) && it["value"] != null + } + val attachments = attachmentsAsJSON.mapNotNull { it["value"] as? Map<*, *> }.mapNotNull { attachmentAsJSON -> + try { + val kindAsString = attachmentAsJSON["lokiType"] as String + val kind = PublicChatMessage.Attachment.Kind.values().first { it.rawValue == kindAsString } + val id = attachmentAsJSON["id"] as? Long ?: (attachmentAsJSON["id"] as? Int)?.toLong() ?: (attachmentAsJSON["id"] as String).toLong() + val contentType = attachmentAsJSON["contentType"] as String + val size = attachmentAsJSON["size"] as? Int ?: (attachmentAsJSON["size"] as? Long)?.toInt() ?: (attachmentAsJSON["size"] as String).toInt() + val fileName = attachmentAsJSON["fileName"] as String + val flags = 0 + val url = attachmentAsJSON["url"] as String + val caption = attachmentAsJSON["caption"] as? String + val linkPreviewURL = attachmentAsJSON["linkPreviewUrl"] as? String + val linkPreviewTitle = attachmentAsJSON["linkPreviewTitle"] as? String + if (kind == PublicChatMessage.Attachment.Kind.LinkPreview && (linkPreviewURL == null || linkPreviewTitle == null)) { + null + } else { + PublicChatMessage.Attachment(kind, server, id, contentType, size, fileName, flags, 0, 0, caption, url, linkPreviewURL, linkPreviewTitle) + } + } catch (e: Exception) { + Log.d("Loki","Couldn't parse attachment due to error: $e.") + null + } + } + // Set the last message server ID here to avoid the situation where a message doesn't have a valid signature and this function is called over and over + @Suppress("NAME_SHADOWING") val lastMessageServerID = apiDatabase.getLastMessageServerID(channel, server) + if (serverID > lastMessageServerID ?: 0) { apiDatabase.setLastMessageServerID(channel, server, serverID) } + val hexEncodedSignature = value["sig"] as String + val signatureVersion = value["sigver"] as? Long ?: (value["sigver"] as? Int)?.toLong() ?: (value["sigver"] as String).toLong() + val signature = PublicChatMessage.Signature(Hex.fromStringCondensed(hexEncodedSignature), signatureVersion) + val format = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US) + format.timeZone = TimeZone.getTimeZone("GMT") + val dateAsString = message["created_at"] as String + val serverTimestamp = format.parse(dateAsString).time + // Verify the message + val groupMessage = PublicChatMessage(serverID, publicKey, displayName, body, timestamp, publicChatMessageType, quote, attachments, profilePicture, signature, serverTimestamp) + if (groupMessage.hasValidSignature()) groupMessage else null + } catch (exception: Exception) { + Log.d("Loki", "Couldn't parse message for open group with ID: $channel on server: $server from: ${JsonUtil.toJson(message)}. Exception: ${exception.message}") + return@mapNotNull null + } + }.sortedBy { it.serverTimestamp } + messages + } catch (exception: Exception) { + Log.d("Loki", "Couldn't parse messages for open group with ID: $channel on server: $server.") + throw exception + } + } + } + + public fun getDeletedMessageServerIDs(channel: Long, server: String): Promise, Exception> { + Log.d("Loki", "Getting deleted messages for open group with ID: $channel on server: $server.") + val parameters = mutableMapOf() + val lastDeletionServerID = apiDatabase.getLastDeletionServerID(channel, server) + if (lastDeletionServerID != null) { + parameters["since_id"] = lastDeletionServerID + } else { + parameters["count"] = fallbackBatchCount + } + return execute(HTTPVerb.GET, server, "loki/v1/channel/$channel/deletes", parameters = parameters).then(sharedContext) { json -> + try { + val deletedMessageServerIDs = (json["data"] as List>).mapNotNull { deletion -> + try { + val serverID = deletion["id"] as? Long ?: (deletion["id"] as? Int)?.toLong() ?: (deletion["id"] as String).toLong() + val messageServerID = deletion["message_id"] as? Long ?: (deletion["message_id"] as? Int)?.toLong() ?: (deletion["message_id"] as String).toLong() + @Suppress("NAME_SHADOWING") val lastDeletionServerID = apiDatabase.getLastDeletionServerID(channel, server) + if (serverID > (lastDeletionServerID ?: 0)) { apiDatabase.setLastDeletionServerID(channel, server, serverID) } + messageServerID + } catch (exception: Exception) { + Log.d("Loki", "Couldn't parse deleted message for open group with ID: $channel on server: $server. Exception: ${exception.message}") + return@mapNotNull null + } + } + deletedMessageServerIDs + } catch (exception: Exception) { + Log.d("Loki", "Couldn't parse deleted messages for open group with ID: $channel on server: $server.") + throw exception + } + } + } + + public fun sendMessage(message: PublicChatMessage, channel: Long, server: String): Promise { + val deferred = deferred() + Thread { + val signedMessage = message.sign(userPrivateKey) + if (signedMessage == null) { + deferred.reject(SnodeAPI.Error.MessageSigningFailed) + } else { + retryIfNeeded(maxRetryCount) { + Log.d("Loki", "Sending message to open group with ID: $channel on server: $server.") + val parameters = signedMessage.toJSON() + execute(HTTPVerb.POST, server, "channels/$channel/messages", parameters = parameters).then(sharedContext) { json -> + try { + val data = json["data"] as Map<*, *> + val serverID = (data["id"] as? Long) ?: (data["id"] as? Int)?.toLong() ?: (data["id"] as String).toLong() + val displayName = userDatabase.getDisplayName(userPublicKey) ?: "Anonymous" + val text = data["text"] as String + val format = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US) + format.timeZone = TimeZone.getTimeZone("GMT") + val dateAsString = data["created_at"] as String + val timestamp = format.parse(dateAsString).time + @Suppress("NAME_SHADOWING") val message = PublicChatMessage(serverID, userPublicKey, displayName, text, timestamp, publicChatMessageType, message.quote, message.attachments, null, signedMessage.signature, timestamp) + message + } catch (exception: Exception) { + Log.d("Loki", "Couldn't parse message for open group with ID: $channel on server: $server.") + throw exception + } + } + }.success { + deferred.resolve(it) + }.fail { + deferred.reject(it) + } + } + }.start() + return deferred.promise + } + + public fun deleteMessage(messageServerID: Long, channel: Long, server: String, isSentByUser: Boolean): Promise { + return retryIfNeeded(maxRetryCount) { + val isModerationRequest = !isSentByUser + Log.d("Loki", "Deleting message with ID: $messageServerID from open group with ID: $channel on server: $server (isModerationRequest = $isModerationRequest).") + val endpoint = if (isSentByUser) "channels/$channel/messages/$messageServerID" else "loki/v1/moderation/message/$messageServerID" + execute(HTTPVerb.DELETE, server, endpoint, isJSONRequired = false).then { + Log.d("Loki", "Deleted message with ID: $messageServerID from open group with ID: $channel on server: $server.") + messageServerID + } + } + } + + public fun deleteMessages(messageServerIDs: List, channel: Long, server: String, isSentByUser: Boolean): Promise, Exception> { + return retryIfNeeded(maxRetryCount) { + val isModerationRequest = !isSentByUser + val parameters = mapOf( "ids" to messageServerIDs.joinToString(",") ) + Log.d("Loki", "Deleting messages with IDs: ${messageServerIDs.joinToString()} from open group with ID: $channel on server: $server (isModerationRequest = $isModerationRequest).") + val endpoint = if (isSentByUser) "loki/v1/messages" else "loki/v1/moderation/messages" + execute(HTTPVerb.DELETE, server, endpoint, parameters = parameters, isJSONRequired = false).then { json -> + Log.d("Loki", "Deleted messages with IDs: $messageServerIDs from open group with ID: $channel on server: $server.") + messageServerIDs + } + } + } + + public fun getModerators(channel: Long, server: String): Promise, Exception> { + return execute(HTTPVerb.GET, server, "loki/v1/channel/$channel/get_moderators").then(sharedContext) { json -> + try { + @Suppress("UNCHECKED_CAST") val moderators = json["moderators"] as? List + val moderatorsAsSet = moderators.orEmpty().toSet() + if (Companion.moderators[server] != null) { + Companion.moderators[server]!![channel] = moderatorsAsSet + } else { + Companion.moderators[server] = hashMapOf( channel to moderatorsAsSet ) + } + moderatorsAsSet + } catch (exception: Exception) { + Log.d("Loki", "Couldn't parse moderators for open group with ID: $channel on server: $server.") + throw exception + } + } + } + + public fun getChannelInfo(channel: Long, server: String): Promise { + return retryIfNeeded(maxRetryCount) { + val parameters = mapOf( "include_annotations" to 1 ) + execute(HTTPVerb.GET, server, "/channels/$channel", parameters = parameters).then(sharedContext) { json -> + try { + val data = json["data"] as Map<*, *> + val annotations = data["annotations"] as List> + val annotation = annotations.find { (it["type"] as? String ?: "") == channelInfoType } ?: throw SnodeAPI.Error.ParsingFailed + val info = annotation["value"] as Map<*, *> + val displayName = info["name"] as String + val countInfo = data["counts"] as Map<*, *> + val memberCount = countInfo["subscribers"] as? Int ?: (countInfo["subscribers"] as? Long)?.toInt() ?: (countInfo["subscribers"] as String).toInt() + val profilePictureURL = info["avatar"] as String + val publicChatInfo = PublicChatInfo(displayName, profilePictureURL, memberCount) + apiDatabase.setUserCount(channel, server, memberCount) + publicChatInfo + } catch (exception: Exception) { + Log.d("Loki", "Couldn't parse info for open group with ID: $channel on server: $server.") + throw exception + } + } + } + } + + public fun updateProfileIfNeeded(channel: Long, server: String, groupID: String, info: PublicChatInfo, isForcedUpdate: Boolean) { + apiDatabase.setUserCount(channel, server, info.memberCount) + openGroupDatabase.updateTitle(groupID, info.displayName) + // Download and update profile picture if needed + val oldProfilePictureURL = apiDatabase.getOpenGroupProfilePictureURL(channel, server) + if (isForcedUpdate || oldProfilePictureURL != info.profilePictureURL) { + val profilePictureAsByteArray = downloadOpenGroupProfilePicture(server, info.profilePictureURL) ?: return + openGroupDatabase.updateProfilePicture(groupID, profilePictureAsByteArray) + apiDatabase.setOpenGroupProfilePictureURL(channel, server, info.profilePictureURL) + } + } + + public fun downloadOpenGroupProfilePicture(server: String, endpoint: String): ByteArray? { + val url = "${server.removeSuffix("/")}/${endpoint.removePrefix("/")}" + Log.d("Loki", "Downloading open group profile picture from \"$url\".") + val outputStream = ByteArrayOutputStream() + try { + DownloadUtilities.downloadFile(outputStream, url, FileServerAPI.maxFileSize, null) + Log.d("Loki", "Open group profile picture was successfully loaded from \"$url\"") + return outputStream.toByteArray() + } catch (e: Exception) { + Log.d("Loki", "Failed to download open group profile picture from \"$url\" due to error: $e.") + return null + } finally { + outputStream.close() + } + } + + public fun join(channel: Long, server: String): Promise { + return retryIfNeeded(maxRetryCount) { + execute(HTTPVerb.POST, server, "/channels/$channel/subscribe").then { + Log.d("Loki", "Joined channel with ID: $channel on server: $server.") + } + } + } + + public fun leave(channel: Long, server: String): Promise { + return retryIfNeeded(maxRetryCount) { + execute(HTTPVerb.DELETE, server, "/channels/$channel/subscribe").then { + Log.d("Loki", "Left channel with ID: $channel on server: $server.") + } + } + } + + public fun getDisplayNames(publicKeys: Set, server: String): Promise, Exception> { + return getUserProfiles(publicKeys, server, false).map(sharedContext) { json -> + val mapping = mutableMapOf() + for (user in json) { + if (user["username"] != null) { + val publicKey = user["username"] as String + val displayName = user["name"] as? String ?: "Anonymous" + mapping[publicKey] = displayName + } + } + mapping + } + } + + public fun setDisplayName(newDisplayName: String?, server: String): Promise { + Log.d("Loki", "Updating display name on server: $server.") + val parameters = mapOf( "name" to (newDisplayName ?: "") ) + return execute(HTTPVerb.PATCH, server, "users/me", parameters = parameters).map { Unit } + } + + public fun setProfilePicture(server: String, profileKey: ByteArray, url: String?): Promise { + return setProfilePicture(server, Base64.encodeBytes(profileKey), url) + } + + public fun setProfilePicture(server: String, profileKey: String, url: String?): Promise { + Log.d("Loki", "Updating profile picture on server: $server.") + val value = when (url) { + null -> null + else -> mapOf( "profileKey" to profileKey, "url" to url ) + } + // TODO: This may actually completely replace the annotations, have to double check it + return setSelfAnnotation(server, profilePictureType, value).map { Unit }.fail { + Log.d("Loki", "Failed to update profile picture due to error: $it.") + } + } + // endregion +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/api/opengroups/PublicChatInfo.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/api/opengroups/PublicChatInfo.kt new file mode 100644 index 000000000..78395634f --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/api/opengroups/PublicChatInfo.kt @@ -0,0 +1,7 @@ +package org.session.libsignal.service.loki.api.opengroups + +public data class PublicChatInfo ( + public val displayName: String, + public val profilePictureURL: String, + public val memberCount: Int +) diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/api/opengroups/PublicChatMessage.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/api/opengroups/PublicChatMessage.kt new file mode 100644 index 000000000..f498cb3f9 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/api/opengroups/PublicChatMessage.kt @@ -0,0 +1,178 @@ +package org.session.libsignal.service.loki.api.opengroups + +import org.whispersystems.curve25519.Curve25519 +import org.session.libsignal.libsignal.logging.Log +import org.session.libsignal.service.internal.util.Hex +import org.session.libsignal.service.loki.utilities.removing05PrefixIfNeeded + +public data class PublicChatMessage( + public val serverID: Long?, + public val senderPublicKey: String, + public val displayName: String, + public val body: String, + public val timestamp: Long, + public val type: String, + public val quote: Quote?, + public val attachments: List, + public val profilePicture: ProfilePicture?, + public val signature: Signature?, + public val serverTimestamp: Long +) { + + // region Settings + companion object { + private val curve = Curve25519.getInstance(Curve25519.BEST) + private val signatureVersion: Long = 1 + private val attachmentType = "net.app.core.oembed" + } + // endregion + + // region Types + public data class ProfilePicture( + public val profileKey: ByteArray, + public val url: String + ) + + public data class Quote( + public val quotedMessageTimestamp: Long, + public val quoteePublicKey: String, + public val quotedMessageBody: String, + public val quotedMessageServerID: Long? = null + ) + + public data class Signature( + public val data: ByteArray, + public val version: Long + ) + + public data class Attachment( + public val kind: Kind, + public val server: String, + public val serverID: Long, + public val contentType: String, + public val size: Int, + public val fileName: String, + public val flags: Int, + public val width: Int, + public val height: Int, + public val caption: String?, + public val url: String, + /** + Guaranteed to be non-`nil` if `kind` is `LinkPreview`. + */ + public val linkPreviewURL: String?, + /** + Guaranteed to be non-`nil` if `kind` is `LinkPreview`. + */ + public val linkPreviewTitle: String? + ) { + public val dotNetAPIType = when { + contentType.startsWith("image") -> "photo" + contentType.startsWith("video") -> "video" + contentType.startsWith("audio") -> "audio" + else -> "other" + } + + public enum class Kind(val rawValue: String) { + Attachment("attachment"), LinkPreview("preview") + } + } + // endregion + + // region Initialization + constructor(hexEncodedPublicKey: String, displayName: String, body: String, timestamp: Long, type: String, quote: Quote?, attachments: List) + : this(null, hexEncodedPublicKey, displayName, body, timestamp, type, quote, attachments, null, null, 0) + // endregion + + // region Crypto + internal fun sign(privateKey: ByteArray): PublicChatMessage? { + val data = getValidationData(signatureVersion) + if (data == null) { + Log.d("Loki", "Failed to sign public chat message.") + return null + } + try { + val signatureData = curve.calculateSignature(privateKey, data) + val signature = Signature(signatureData, signatureVersion) + return copy(signature = signature) + } catch (e: Exception) { + Log.d("Loki", "Failed to sign public chat message due to error: ${e.message}.") + return null + } + } + + internal fun hasValidSignature(): Boolean { + if (signature == null) { return false } + val data = getValidationData(signature.version) ?: return false + val publicKey = Hex.fromStringCondensed(senderPublicKey.removing05PrefixIfNeeded()) + try { + return curve.verifySignature(publicKey, data, signature.data) + } catch (e: Exception) { + Log.d("Loki", "Failed to verify public chat message due to error: ${e.message}.") + return false + } + } + // endregion + + // region Parsing + internal fun toJSON(): Map { + val value = mutableMapOf( "timestamp" to timestamp ) + if (quote != null) { + value["quote"] = mapOf( "id" to quote.quotedMessageTimestamp, "author" to quote.quoteePublicKey, "text" to quote.quotedMessageBody ) + } + if (signature != null) { + value["sig"] = Hex.toStringCondensed(signature.data) + value["sigver"] = signature.version + } + val annotation = mapOf( "type" to type, "value" to value ) + val annotations = mutableListOf( annotation ) + attachments.forEach { attachment -> + val attachmentValue = mutableMapOf( + // Fields required by the .NET API + "version" to 1, + "type" to attachment.dotNetAPIType, + // Custom fields + "lokiType" to attachment.kind.rawValue, + "server" to attachment.server, + "id" to attachment.serverID, + "contentType" to attachment.contentType, + "size" to attachment.size, + "fileName" to attachment.fileName, + "flags" to attachment.flags, + "width" to attachment.width, + "height" to attachment.height, + "url" to attachment.url + ) + if (attachment.caption != null) { attachmentValue["caption"] = attachment.caption } + if (attachment.linkPreviewURL != null) { attachmentValue["linkPreviewUrl"] = attachment.linkPreviewURL } + if (attachment.linkPreviewTitle != null) { attachmentValue["linkPreviewTitle"] = attachment.linkPreviewTitle } + val attachmentAnnotation = mapOf( "type" to attachmentType, "value" to attachmentValue ) + annotations.add(attachmentAnnotation) + } + val result = mutableMapOf( "text" to body, "annotations" to annotations ) + if (quote?.quotedMessageServerID != null) { + result["reply_to"] = quote.quotedMessageServerID + } + return result + } + // endregion + + // region Convenience + private fun getValidationData(signatureVersion: Long): ByteArray? { + var string = "${body.trim()}$timestamp" + if (quote != null) { + string += "${quote.quotedMessageTimestamp}${quote.quoteePublicKey}${quote.quotedMessageBody.trim()}" + if (quote.quotedMessageServerID != null) { + string += "${quote.quotedMessageServerID}" + } + } + string += attachments.sortedBy { it.serverID }.map { it.serverID }.joinToString("") + string += "$signatureVersion" + try { + return string.toByteArray(Charsets.UTF_8) + } catch (exception: Exception) { + return null + } + } + // endregion +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/api/shelved/p2p/LokiP2PAPI.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/api/shelved/p2p/LokiP2PAPI.kt new file mode 100644 index 000000000..3a22806c4 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/api/shelved/p2p/LokiP2PAPI.kt @@ -0,0 +1,70 @@ +package org.session.libsignal.service.loki.api.shelved.p2p + +import java.util.* +import kotlin.concurrent.timer + +class LokiP2PAPI private constructor(private val userHexEncodedPublicKey: String, private val onPeerConnectionStatusChanged: (Boolean, String) -> Void, private val delegate: LokiP2PAPIDelegate) { + internal val peerInfo = mutableMapOf() + private val pingIntervals = mutableMapOf() + private val timers = mutableMapOf() + + // region Settings + /** + * The pinging interval for offline users. + */ + private val offlinePingInterval = 2 * 60 * 1000 + // endregion + + // region Types + internal data class PeerInfo(val contactHexEncodedPublicKey: String, val address: String, val port: Int, val isOnline: Boolean) + // endregion + + // region Initialization + companion object { + private var isConfigured = false + + lateinit var shared: LokiP2PAPI + + /** + * Must be called before `LokiAPI` is used. + */ + fun configure(userHexEncodedPublicKey: String, onPeerConnectionStatusChanged: (Boolean, String) -> Void, delegate: LokiP2PAPIDelegate) { + if (isConfigured) { return } + shared = LokiP2PAPI(userHexEncodedPublicKey, onPeerConnectionStatusChanged, delegate) + isConfigured = true + } + } + // endregion + + // region Public API + fun handlePeerInfoReceived(contactHexEncodedPublicKey: String, address: String, port: Int, isP2PMessage: Boolean) { + // Avoid peers pinging eachother at the same time by staggering their timers + val pingInterval = if (contactHexEncodedPublicKey < this.userHexEncodedPublicKey) 1 * 60 else 2 * 60 + pingIntervals[contactHexEncodedPublicKey] = pingInterval + val oldPeerInfo = peerInfo[contactHexEncodedPublicKey] + val newPeerInfo = PeerInfo(contactHexEncodedPublicKey, address, port, false) + peerInfo[contactHexEncodedPublicKey] = newPeerInfo + // Ping the peer back and mark them online based on the result of that call if either: + // • We didn't know about the peer at all, i.e. no P2P connection was established yet during this session + // • The message wasn't a P2P message, i.e. no P2P connection was established yet during this session or it was dropped for some reason + // • The peer was marked offline before; test the new P2P connection + // • The peer's address and/or port changed; test the new P2P connection + if (oldPeerInfo == null || !isP2PMessage || !oldPeerInfo.isOnline || oldPeerInfo.address != address || oldPeerInfo.port != port) { + delegate.ping(contactHexEncodedPublicKey) + } else { + mark(true, contactHexEncodedPublicKey) + } + } + + fun mark(isOnline: Boolean, contactHexEncodedPublicKey: String) { + val oldTimer = timers[contactHexEncodedPublicKey] + oldTimer?.cancel() + val pingInterval = if (isOnline) { pingIntervals[contactHexEncodedPublicKey]!! } else { offlinePingInterval } + val newTimer = timer(period = pingInterval.toLong()) { delegate.ping(contactHexEncodedPublicKey) } + timers[contactHexEncodedPublicKey] = newTimer + val updatedPeerInfo = peerInfo[contactHexEncodedPublicKey]!!.copy(isOnline = isOnline) + peerInfo[contactHexEncodedPublicKey] = updatedPeerInfo + onPeerConnectionStatusChanged(isOnline, contactHexEncodedPublicKey) + } + // endregion +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/api/shelved/p2p/LokiP2PAPIDelegate.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/api/shelved/p2p/LokiP2PAPIDelegate.kt new file mode 100644 index 000000000..d6d5e11f6 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/api/shelved/p2p/LokiP2PAPIDelegate.kt @@ -0,0 +1,6 @@ +package org.session.libsignal.service.loki.api.shelved.p2p + +interface LokiP2PAPIDelegate { + + fun ping(contactHexEncodedPublicKey: String) +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/api/utilities/DecryptionUtilities.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/api/utilities/DecryptionUtilities.kt new file mode 100644 index 000000000..017a554b9 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/api/utilities/DecryptionUtilities.kt @@ -0,0 +1,19 @@ +package org.session.libsignal.service.loki.api.utilities + +import javax.crypto.Cipher +import javax.crypto.spec.GCMParameterSpec +import javax.crypto.spec.SecretKeySpec + +internal object DecryptionUtilities { + + /** + * Sync. Don't call from the main thread. + */ + internal fun decryptUsingAESGCM(ivAndCiphertext: ByteArray, symmetricKey: ByteArray): ByteArray { + val iv = ivAndCiphertext.sliceArray(0 until EncryptionUtilities.ivSize) + val ciphertext = ivAndCiphertext.sliceArray(EncryptionUtilities.ivSize until ivAndCiphertext.count()) + val cipher = Cipher.getInstance("AES/GCM/NoPadding") + cipher.init(Cipher.DECRYPT_MODE, SecretKeySpec(symmetricKey, "AES"), GCMParameterSpec(EncryptionUtilities.gcmTagSize, iv)) + return cipher.doFinal(ciphertext) + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/api/utilities/EncryptionUtilities.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/api/utilities/EncryptionUtilities.kt new file mode 100644 index 000000000..7d79a406d --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/api/utilities/EncryptionUtilities.kt @@ -0,0 +1,45 @@ +package org.session.libsignal.service.loki.api.utilities + +import org.whispersystems.curve25519.Curve25519 +import org.session.libsignal.libsignal.util.ByteUtil +import org.session.libsignal.libsignal.util.Hex +import org.session.libsignal.service.internal.util.Util +import javax.crypto.Cipher +import javax.crypto.Mac +import javax.crypto.spec.GCMParameterSpec +import javax.crypto.spec.SecretKeySpec + +internal data class EncryptionResult( + internal val ciphertext: ByteArray, + internal val symmetricKey: ByteArray, + internal val ephemeralPublicKey: ByteArray +) + +internal object EncryptionUtilities { + internal val gcmTagSize = 128 + internal val ivSize = 12 + + /** + * Sync. Don't call from the main thread. + */ + internal fun encryptUsingAESGCM(plaintext: ByteArray, symmetricKey: ByteArray): ByteArray { + val iv = Util.getSecretBytes(ivSize) + val cipher = Cipher.getInstance("AES/GCM/NoPadding") + cipher.init(Cipher.ENCRYPT_MODE, SecretKeySpec(symmetricKey, "AES"), GCMParameterSpec(gcmTagSize, iv)) + return ByteUtil.combine(iv, cipher.doFinal(plaintext)) + } + + /** + * Sync. Don't call from the main thread. + */ + internal fun encryptForX25519PublicKey(plaintext: ByteArray, hexEncodedX25519PublicKey: String): EncryptionResult { + val x25519PublicKey = Hex.fromStringCondensed(hexEncodedX25519PublicKey) + val ephemeralKeyPair = Curve25519.getInstance(Curve25519.BEST).generateKeyPair() + val ephemeralSharedSecret = Curve25519.getInstance(Curve25519.BEST).calculateAgreement(x25519PublicKey, ephemeralKeyPair.privateKey) + val mac = Mac.getInstance("HmacSHA256") + mac.init(SecretKeySpec("LOKI".toByteArray(), "HmacSHA256")) + val symmetricKey = mac.doFinal(ephemeralSharedSecret) + val ciphertext = encryptUsingAESGCM(plaintext, symmetricKey) + return EncryptionResult(ciphertext, symmetricKey, ephemeralKeyPair.publicKey) + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/api/utilities/HTTP.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/api/utilities/HTTP.kt new file mode 100644 index 000000000..5f932ab46 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/api/utilities/HTTP.kt @@ -0,0 +1,110 @@ +package org.session.libsignal.service.loki.api.utilities + +import okhttp3.* +import org.session.libsignal.libsignal.logging.Log +import org.session.libsignal.service.internal.util.JsonUtil +import java.security.SecureRandom +import java.security.cert.X509Certificate +import java.util.concurrent.TimeUnit +import javax.net.ssl.SSLContext +import javax.net.ssl.X509TrustManager + +object HTTP { + + private val seedNodeConnection by lazy { + OkHttpClient().newBuilder() + .connectTimeout(timeout, TimeUnit.SECONDS) + .readTimeout(timeout, TimeUnit.SECONDS) + .writeTimeout(timeout, TimeUnit.SECONDS) + .build() + } + + private val defaultConnection by lazy { + // Snode to snode communication uses self-signed certificates but clients can safely ignore this + val trustManager = object : X509TrustManager { + + override fun checkClientTrusted(chain: Array?, authorizationType: String?) { } + override fun checkServerTrusted(chain: Array?, authorizationType: String?) { } + override fun getAcceptedIssuers(): Array { + return arrayOf() + } + } + val sslContext = SSLContext.getInstance("SSL") + sslContext.init(null, arrayOf( trustManager ), SecureRandom()) + OkHttpClient().newBuilder() + .sslSocketFactory(sslContext.socketFactory, trustManager) + .hostnameVerifier { _, _ -> true } + .connectTimeout(timeout, TimeUnit.SECONDS) + .readTimeout(timeout, TimeUnit.SECONDS) + .writeTimeout(timeout, TimeUnit.SECONDS) + .build() + } + + private const val timeout: Long = 20 + + class HTTPRequestFailedException(val statusCode: Int, val json: Map<*, *>?) + : kotlin.Exception("HTTP request failed with status code $statusCode.") + + enum class Verb(val rawValue: String) { + GET("GET"), PUT("PUT"), POST("POST"), DELETE("DELETE") + } + + /** + * Sync. Don't call from the main thread. + */ + fun execute(verb: Verb, url: String, useSeedNodeConnection: Boolean = false): Map<*, *> { + return execute(verb = verb, url = url, body = null, useSeedNodeConnection = useSeedNodeConnection) + } + + /** + * Sync. Don't call from the main thread. + */ + fun execute(verb: Verb, url: String, parameters: Map?, useSeedNodeConnection: Boolean = false): Map<*, *> { + if (parameters != null) { + val body = JsonUtil.toJson(parameters).toByteArray() + return execute(verb = verb, url = url, body = body, useSeedNodeConnection = useSeedNodeConnection) + } else { + return execute(verb = verb, url = url, body = null, useSeedNodeConnection = useSeedNodeConnection) + } + } + + /** + * Sync. Don't call from the main thread. + */ + fun execute(verb: Verb, url: String, body: ByteArray?, useSeedNodeConnection: Boolean = false): Map<*, *> { + val request = Request.Builder().url(url) + when (verb) { + Verb.GET -> request.get() + Verb.PUT, Verb.POST -> { + if (body == null) { throw Exception("Invalid request body.") } + val contentType = MediaType.get("application/json; charset=utf-8") + @Suppress("NAME_SHADOWING") val body = RequestBody.create(contentType, body) + if (verb == Verb.PUT) request.put(body) else request.post(body) + } + Verb.DELETE -> request.delete() + } + lateinit var response: Response + try { + val connection = if (useSeedNodeConnection) seedNodeConnection else defaultConnection + response = connection.newCall(request.build()).execute() + } catch (exception: Exception) { + Log.d("Loki", "${verb.rawValue} request to $url failed due to error: ${exception.localizedMessage}.") + // Override the actual error so that we can correctly catch failed requests in OnionRequestAPI + throw HTTPRequestFailedException(0, null) + } + when (val statusCode = response.code()) { + 200 -> { + val bodyAsString = response.body()?.string() ?: throw Exception("An error occurred.") + try { + return JsonUtil.fromJson(bodyAsString, Map::class.java) + } catch (exception: Exception) { + return mapOf( "result" to bodyAsString) + } + } + else -> { + Log.d("Loki", "${verb.rawValue} request to $url failed with status code: $statusCode.") + throw HTTPRequestFailedException(statusCode, null) + } + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/api/utilities/OKHTTPUtilities.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/api/utilities/OKHTTPUtilities.kt new file mode 100644 index 000000000..68c285b73 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/api/utilities/OKHTTPUtilities.kt @@ -0,0 +1,49 @@ +package org.session.libsignal.service.loki.api.utilities + +import okhttp3.MultipartBody +import okhttp3.Request +import okio.Buffer +import org.session.libsignal.service.internal.util.Base64 +import java.io.IOException +import java.util.* + +internal fun Request.getHeadersForOnionRequest(): Map { + val result = mutableMapOf() + val contentType = body()?.contentType() + if (contentType != null) { + result["content-type"] = contentType.toString() + } + val headers = headers() + for (name in headers.names()) { + val value = headers.get(name) + if (value != null) { + if (value.toLowerCase(Locale.US) == "true" || value.toLowerCase(Locale.US) == "false") { + result[name] = value.toBoolean() + } else if (value.toIntOrNull() != null) { + result[name] = value.toInt() + } else { + result[name] = value + } + } + } + return result +} + +internal fun Request.getBodyForOnionRequest(): Any? { + try { + val copyOfThis = newBuilder().build() + val buffer = Buffer() + val body = copyOfThis.body() ?: return null + body.writeTo(buffer) + val bodyAsData = buffer.readByteArray() + if (body is MultipartBody) { + val base64EncodedBody: String = Base64.encodeBytes(bodyAsData) + return mapOf( "fileUpload" to base64EncodedBody ) + } else { + val charset = body.contentType()?.charset() ?: Charsets.UTF_8 + return bodyAsData?.toString(charset) + } + } catch (e: IOException) { + return null + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/crypto/LokiServiceCipher.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/crypto/LokiServiceCipher.kt new file mode 100644 index 000000000..39cb89aba --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/crypto/LokiServiceCipher.kt @@ -0,0 +1,30 @@ +package org.session.libsignal.service.loki.crypto + +import org.session.libsignal.metadata.certificate.CertificateValidator +import org.session.libsignal.libsignal.InvalidMessageException +import org.session.libsignal.libsignal.loki.FallbackSessionCipher +import org.session.libsignal.libsignal.loki.SessionResetProtocol +import org.session.libsignal.libsignal.state.SignalProtocolStore +import org.session.libsignal.service.api.crypto.SignalServiceCipher +import org.session.libsignal.service.api.messages.SignalServiceEnvelope +import org.session.libsignal.service.api.push.SignalServiceAddress +import org.session.libsignal.service.internal.push.PushTransportDetails +import org.session.libsignal.service.loki.protocol.closedgroups.SharedSenderKeysDatabaseProtocol + +class LokiServiceCipher(localAddress: SignalServiceAddress, private val signalProtocolStore: SignalProtocolStore, private val sskDatabase: SharedSenderKeysDatabaseProtocol, sessionResetProtocol: SessionResetProtocol, certificateValidator: CertificateValidator?) : SignalServiceCipher(localAddress, signalProtocolStore, sskDatabase, sessionResetProtocol, certificateValidator) { + + private val userPrivateKey get() = signalProtocolStore.identityKeyPair.privateKey.serialize() + + override fun decrypt(envelope: SignalServiceEnvelope, ciphertext: ByteArray): Plaintext { + return if (envelope.isFallbackMessage) decryptFallbackMessage(envelope, ciphertext) else super.decrypt(envelope, ciphertext) + } + + private fun decryptFallbackMessage(envelope: SignalServiceEnvelope, ciphertext: ByteArray): Plaintext { + val cipher = FallbackSessionCipher(userPrivateKey, envelope.source) + val paddedMessageBody = cipher.decrypt(ciphertext) ?: throw InvalidMessageException("Failed to decrypt fallback message.") + val transportDetails = PushTransportDetails(FallbackSessionCipher.sessionVersion) + val unpaddedMessageBody = transportDetails.getStrippedPaddingMessageBody(paddedMessageBody) + val metadata = Metadata(envelope.source, envelope.sourceDevice, envelope.timestamp, false) + return Plaintext(metadata, unpaddedMessageBody) + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/crypto/MnemonicCodec.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/crypto/MnemonicCodec.kt new file mode 100644 index 000000000..192218d39 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/crypto/MnemonicCodec.kt @@ -0,0 +1,139 @@ +package org.session.libsignal.service.loki.crypto + +import java.io.File +import java.util.zip.CRC32 + +/** + * Based on [mnemonic.js](https://github.com/loki-project/loki-messenger/blob/development/libloki/modules/mnemonic.js) . + */ +class MnemonicCodec(private val loadFileContents: (String) -> String) { + + class Language(private val loadFileContents: (String) -> String, private val configuration: Configuration) { + + data class Configuration(val filename: String, val prefixLength: Int) { + + companion object { + val english = Configuration("english", 3) + val japanese = Configuration("japanese", 3) + val portuguese = Configuration("portuguese", 4) + val spanish = Configuration("spanish", 4) + } + } + + companion object { + internal val wordSetCache = mutableMapOf>() + internal val truncatedWordSetCache = mutableMapOf>() + } + + internal fun loadWordSet(): List { + val cachedResult = wordSetCache[this] + if (cachedResult != null) { + return cachedResult + } else { + val contents = loadFileContents(configuration.filename) + val result = contents.split(",") + wordSetCache[this] = result + return result + } + } + + internal fun loadTruncatedWordSet(): List { + val cachedResult = wordSetCache[this] + if (cachedResult != null) { + return cachedResult + } else { + val prefixLength = configuration.prefixLength + val result = loadWordSet().map { it.substring(0 until prefixLength) } + truncatedWordSetCache[this] = result + return result + } + } + } + + sealed class DecodingError(val description: String) : Exception() { + object Generic : DecodingError("Something went wrong. Please check your mnemonic and try again.") + object InputTooShort : DecodingError("Looks like you didn't enter enough words. Please check your mnemonic and try again.") + object MissingLastWord : DecodingError("You seem to be missing the last word of your mnemonic. Please check what you entered and try again.") + object InvalidWord : DecodingError("There appears to be an invalid word in your mnemonic. Please check what you entered and try again.") + object VerificationFailed : DecodingError("Your mnemonic couldn't be verified. Please check what you entered and try again.") + } + + fun encode(hexEncodedString: String, languageConfiguration: Language.Configuration = Language.Configuration.english): String { + var string = hexEncodedString + val language = Language(loadFileContents, languageConfiguration) + val wordSet = language.loadWordSet() + val prefixLength = languageConfiguration.prefixLength + val result = mutableListOf() + val n = wordSet.size.toLong() + val characterCount = string.length + for (chunkStartIndex in 0..(characterCount - 8) step 8) { + val chunkEndIndex = chunkStartIndex + 8 + val p1 = string.substring(0 until chunkStartIndex) + val p2 = swap(string.substring(chunkStartIndex until chunkEndIndex)) + val p3 = string.substring(chunkEndIndex until characterCount) + string = p1 + p2 + p3 + } + for (chunkStartIndex in 0..(characterCount - 8) step 8) { + val chunkEndIndex = chunkStartIndex + 8 + val x = string.substring(chunkStartIndex until chunkEndIndex).toLong(16) + val w1 = x % n + val w2 = ((x / n) + w1) % n + val w3 = (((x / n) / n) + w2) % n + result += listOf( wordSet[w1.toInt()], wordSet[w2.toInt()], wordSet[w3.toInt()] ) + } + val checksumIndex = determineChecksumIndex(result, prefixLength) + val checksumWord = result[checksumIndex] + result.add(checksumWord) + return result.joinToString(" ") + } + + fun decode(mnemonic: String, languageConfiguration: Language.Configuration = Language.Configuration.english): String { + val words = mnemonic.split(" ").toMutableList() + val language = Language(loadFileContents, languageConfiguration) + val truncatedWordSet = language.loadTruncatedWordSet() + val prefixLength = languageConfiguration.prefixLength + var result = "" + val n = truncatedWordSet.size.toLong() + // Check preconditions + if (words.size < 12) { throw DecodingError.InputTooShort } + if (words.size % 3 == 0) { throw DecodingError.MissingLastWord } + // Get checksum word + val checksumWord = words.removeAt(words.lastIndex) + // Decode + for (chunkStartIndex in 0..(words.size - 3) step 3) { + try { + val w1 = truncatedWordSet.indexOf(words[chunkStartIndex].substring(0 until prefixLength)) + val w2 = truncatedWordSet.indexOf(words[chunkStartIndex + 1].substring(0 until prefixLength)) + val w3 = truncatedWordSet.indexOf(words[chunkStartIndex + 2].substring(0 until prefixLength)) + val x = w1 + n * ((n - w1 + w2) % n) + n * n * ((n - w2 + w3) % n) + if (x % n != w1.toLong()) { throw DecodingError.Generic } + val string = "0000000" + x.toString(16) + result += swap(string.substring(string.length - 8 until string.length)) + } catch (e: Exception) { + throw DecodingError.InvalidWord + } + } + // Verify checksum + val checksumIndex = determineChecksumIndex(words, prefixLength) + val expectedChecksumWord = words[checksumIndex] + if (expectedChecksumWord.substring(0 until prefixLength) != checksumWord.substring(0 until prefixLength)) { throw DecodingError.VerificationFailed } + // Return + return result + } + + private fun swap(x: String): String { + val p1 = x.substring(6 until 8) + val p2 = x.substring(4 until 6) + val p3 = x.substring(2 until 4) + val p4 = x.substring(0 until 2) + return p1 + p2 + p3 + p4 + } + + private fun determineChecksumIndex(x: List, prefixLength: Int): Int { + val bytes = x.joinToString("") { it.substring(0 until prefixLength) }.toByteArray() + val crc32 = CRC32() + crc32.update(bytes) + val checksum = crc32.value + return (checksum % x.size.toLong()).toInt() + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/database/LokiAPIDatabaseProtocol.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/database/LokiAPIDatabaseProtocol.kt new file mode 100644 index 000000000..4fce63793 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/database/LokiAPIDatabaseProtocol.kt @@ -0,0 +1,41 @@ +package org.session.libsignal.service.loki.database + +import org.session.libsignal.service.loki.api.Snode +import org.session.libsignal.service.loki.protocol.shelved.multidevice.DeviceLink + +interface LokiAPIDatabaseProtocol { + + fun getSnodePool(): Set + fun setSnodePool(newValue: Set) + fun getOnionRequestPaths(): List> + fun clearOnionRequestPaths() + fun setOnionRequestPaths(newValue: List>) + fun getSwarm(publicKey: String): Set? + fun setSwarm(publicKey: String, newValue: Set) + fun getLastMessageHashValue(snode: Snode, publicKey: String): String? + fun setLastMessageHashValue(snode: Snode, publicKey: String, newValue: String) + fun getReceivedMessageHashValues(publicKey: String): Set? + fun setReceivedMessageHashValues(publicKey: String, newValue: Set) + fun getAuthToken(server: String): String? + fun setAuthToken(server: String, newValue: String?) + fun getLastMessageServerID(group: Long, server: String): Long? + fun setLastMessageServerID(group: Long, server: String, newValue: Long) + fun getLastDeletionServerID(group: Long, server: String): Long? + fun setLastDeletionServerID(group: Long, server: String, newValue: Long) + fun setUserCount(group: Long, server: String, newValue: Int) + fun getSessionRequestSentTimestamp(publicKey: String): Long? + fun setSessionRequestSentTimestamp(publicKey: String, newValue: Long) + fun getSessionRequestProcessedTimestamp(publicKey: String): Long? + fun setSessionRequestProcessedTimestamp(publicKey: String, newValue: Long) + fun getOpenGroupPublicKey(server: String): String? + fun setOpenGroupPublicKey(server: String, newValue: String) + fun setOpenGroupProfilePictureURL(group: Long, server: String, newValue: String) + fun getOpenGroupProfilePictureURL(group: Long, server: String): String? + + // region Deprecated + fun getDeviceLinks(publicKey: String): Set + fun clearDeviceLinks(publicKey: String) + fun addDeviceLink(deviceLink: DeviceLink) + fun removeDeviceLink(deviceLink: DeviceLink) + // endregion +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/database/LokiMessageDatabaseProtocol.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/database/LokiMessageDatabaseProtocol.kt new file mode 100644 index 000000000..45f162de6 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/database/LokiMessageDatabaseProtocol.kt @@ -0,0 +1,7 @@ +package org.session.libsignal.service.loki.database + +interface LokiMessageDatabaseProtocol { + + fun getQuoteServerID(quoteID: Long, quoteePublicKey: String): Long? + fun setServerID(messageID: Long, serverID: Long) +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/database/LokiOpenGroupDatabaseProtocol.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/database/LokiOpenGroupDatabaseProtocol.kt new file mode 100644 index 000000000..5380c1a8f --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/database/LokiOpenGroupDatabaseProtocol.kt @@ -0,0 +1,7 @@ +package org.session.libsignal.service.loki.database + +interface LokiOpenGroupDatabaseProtocol { + + fun updateTitle(groupID: String, newValue: String) + fun updateProfilePicture(groupID: String, newValue: ByteArray) +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/database/LokiPreKeyBundleDatabaseProtocol.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/database/LokiPreKeyBundleDatabaseProtocol.kt new file mode 100644 index 000000000..66668a42e --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/database/LokiPreKeyBundleDatabaseProtocol.kt @@ -0,0 +1,9 @@ +package org.session.libsignal.service.loki.database + +import org.session.libsignal.libsignal.state.PreKeyBundle + +interface LokiPreKeyBundleDatabaseProtocol { + + fun getPreKeyBundle(publicKey: String): PreKeyBundle? + fun removePreKeyBundle(publicKey: String) +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/database/LokiPreKeyRecordDatabaseProtocol.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/database/LokiPreKeyRecordDatabaseProtocol.kt new file mode 100644 index 000000000..c4e2e49ed --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/database/LokiPreKeyRecordDatabaseProtocol.kt @@ -0,0 +1,8 @@ +package org.session.libsignal.service.loki.database + +import org.session.libsignal.libsignal.state.PreKeyRecord + +interface LokiPreKeyRecordDatabaseProtocol { + + fun getPreKeyRecord(publicKey: String): PreKeyRecord? +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/database/LokiThreadDatabaseProtocol.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/database/LokiThreadDatabaseProtocol.kt new file mode 100644 index 000000000..5eb69da65 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/database/LokiThreadDatabaseProtocol.kt @@ -0,0 +1,11 @@ +package org.session.libsignal.service.loki.database + +import org.session.libsignal.service.loki.api.opengroups.PublicChat + +interface LokiThreadDatabaseProtocol { + + fun getThreadID(publicKey: String): Long + fun getPublicChat(threadID: Long): PublicChat? + fun setPublicChat(publicChat: PublicChat, threadID: Long) + fun removePublicChat(threadID: Long) +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/database/LokiUserDatabaseProtocol.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/database/LokiUserDatabaseProtocol.kt new file mode 100644 index 000000000..6879ee893 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/database/LokiUserDatabaseProtocol.kt @@ -0,0 +1,8 @@ +package org.session.libsignal.service.loki.database + +interface LokiUserDatabaseProtocol { + + fun getDisplayName(publicKey: String): String? + fun getServerDisplayName(serverID: String, publicKey: String): String? + fun getProfilePictureURL(publicKey: String): String? +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/closedgroups/ClosedGroupRatchet.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/closedgroups/ClosedGroupRatchet.kt new file mode 100644 index 000000000..a803152a2 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/closedgroups/ClosedGroupRatchet.kt @@ -0,0 +1,22 @@ +package org.session.libsignal.service.loki.protocol.closedgroups + +import org.session.libsignal.service.loki.utilities.prettifiedDescription + +public class ClosedGroupRatchet(public val chainKey: String, public val keyIndex: Int, public val messageKeys: List) { + + override fun equals(other: Any?): Boolean { + return if (other is ClosedGroupRatchet) { + chainKey == other.chainKey && keyIndex == other.keyIndex && messageKeys == other.messageKeys + } else { + false + } + } + + override fun hashCode(): Int { + return chainKey.hashCode() xor keyIndex.hashCode() xor messageKeys.hashCode() + } + + override fun toString(): String { + return "[ chainKey : $chainKey, keyIndex : $keyIndex, messageKeys : ${messageKeys.prettifiedDescription()} ]" + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/closedgroups/ClosedGroupSenderKey.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/closedgroups/ClosedGroupSenderKey.kt new file mode 100644 index 000000000..561f92775 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/closedgroups/ClosedGroupSenderKey.kt @@ -0,0 +1,57 @@ +package org.session.libsignal.service.loki.protocol.closedgroups + +import com.google.protobuf.ByteString +import org.session.libsignal.libsignal.logging.Log +import org.session.libsignal.libsignal.protocol.SignalProtos +import org.session.libsignal.libsignal.util.Hex +import org.session.libsignal.service.internal.push.SignalServiceProtos +import org.session.libsignal.service.internal.util.JsonUtil +import org.session.libsignal.service.loki.utilities.toHexString + +public class ClosedGroupSenderKey(public val chainKey: ByteArray, public val keyIndex: Int, public val publicKey: ByteArray) { + + companion object { + + public fun fromJSON(jsonAsString: String): ClosedGroupSenderKey? { + try { + val json = JsonUtil.fromJson(jsonAsString, Map::class.java) + val chainKey = Hex.fromStringCondensed(json["chainKey"] as String) + val keyIndex = json["keyIndex"] as Int + val publicKey = Hex.fromStringCondensed(json["publicKey"] as String) + return ClosedGroupSenderKey(chainKey, keyIndex, publicKey) + } catch (exception: Exception) { + Log.d("Loki", "Couldn't parse closed group sender key from: $jsonAsString.") + return null + } + } + } + + public fun toJSON(): String { + val json = mapOf( "chainKey" to chainKey.toHexString(), "keyIndex" to keyIndex, "publicKey" to publicKey.toHexString() ) + return JsonUtil.toJson(json) + } + + public fun toProto(): SignalServiceProtos.ClosedGroupUpdate.SenderKey { + val builder = SignalServiceProtos.ClosedGroupUpdate.SenderKey.newBuilder() + builder.chainKey = ByteString.copyFrom(chainKey) + builder.keyIndex = keyIndex + builder.publicKey = ByteString.copyFrom(publicKey) + return builder.build() + } + + override fun equals(other: Any?): Boolean { + return if (other is ClosedGroupSenderKey) { + chainKey.contentEquals(other.chainKey) && keyIndex == other.keyIndex && publicKey.contentEquals(other.publicKey) + } else { + false + } + } + + override fun hashCode(): Int { + return chainKey.hashCode() xor keyIndex.hashCode() xor publicKey.hashCode() + } + + override fun toString(): String { + return "[ chainKey : ${chainKey.toHexString()}, keyIndex : $keyIndex, messageKeys : ${publicKey.toHexString()} ]" + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/closedgroups/ClosedGroupUtilities.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/closedgroups/ClosedGroupUtilities.kt new file mode 100644 index 000000000..c743641c2 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/closedgroups/ClosedGroupUtilities.kt @@ -0,0 +1,78 @@ +package org.session.libsignal.service.loki.protocol.closedgroups + +import com.google.protobuf.ByteString +import org.whispersystems.curve25519.Curve25519 +import org.session.libsignal.libsignal.loki.ClosedGroupCiphertextMessage +import org.session.libsignal.libsignal.util.Hex +import org.session.libsignal.libsignal.util.Pair +import org.session.libsignal.service.api.messages.SignalServiceEnvelope +import org.session.libsignal.service.internal.push.SignalServiceProtos +import org.session.libsignal.service.loki.api.utilities.DecryptionUtilities +import org.session.libsignal.service.loki.api.utilities.EncryptionUtilities +import org.session.libsignal.service.loki.utilities.removing05PrefixIfNeeded +import org.session.libsignal.service.loki.utilities.toHexString +import javax.crypto.Mac +import javax.crypto.spec.SecretKeySpec + +public object ClosedGroupUtilities { + + sealed class Error(val description: String) : Exception() { + object InvalidGroupPublicKey : Error("Invalid group public key.") + object NoData : Error("Received an empty envelope.") + object NoGroupPrivateKey : Error("Missing group private key.") + object ParsingFailed : Error("Couldn't parse closed group ciphertext message.") + } + + @JvmStatic + public fun encrypt(data: ByteArray, groupPublicKey: String, userPublicKey: String): ByteArray { + // 1. ) Encrypt the data with the user's sender key + val ciphertextAndKeyIndex = SharedSenderKeysImplementation.shared.encrypt(data, groupPublicKey, userPublicKey) + val ivAndCiphertext = ciphertextAndKeyIndex.first + val keyIndex = ciphertextAndKeyIndex.second + val x0 = ClosedGroupCiphertextMessage(ivAndCiphertext, Hex.fromStringCondensed(userPublicKey), keyIndex); + // 2. ) Encrypt the result for the group's public key to hide the sender public key and key index + val x1 = EncryptionUtilities.encryptForX25519PublicKey(x0.serialize(), groupPublicKey.removing05PrefixIfNeeded()) + // 3. ) Wrap the result + return SignalServiceProtos.ClosedGroupCiphertextMessageWrapper.newBuilder() + .setCiphertext(ByteString.copyFrom(x1.ciphertext)) + .setEphemeralPublicKey(ByteString.copyFrom(x1.ephemeralPublicKey)) + .build().toByteArray() + } + + @JvmStatic + public fun decrypt(envelope: SignalServiceEnvelope): Pair { + // 1. ) Check preconditions + val groupPublicKey = envelope.source + if (groupPublicKey == null || !SharedSenderKeysImplementation.shared.isClosedGroup(groupPublicKey)) { + throw Error.InvalidGroupPublicKey + } + val data = envelope.content + if (data.count() == 0) { + throw Error.NoData + } + val groupPrivateKey = SharedSenderKeysImplementation.shared.getKeyPair(groupPublicKey)?.privateKey?.serialize() + if (groupPrivateKey == null) { + throw Error.NoGroupPrivateKey + } + // 2. ) Parse the wrapper + val x0 = SignalServiceProtos.ClosedGroupCiphertextMessageWrapper.parseFrom(data) + val ivAndCiphertext = x0.ciphertext.toByteArray() + val ephemeralPublicKey = x0.ephemeralPublicKey.toByteArray() + // 3. ) Decrypt the data inside + val ephemeralSharedSecret = Curve25519.getInstance(Curve25519.BEST).calculateAgreement(ephemeralPublicKey, groupPrivateKey) + val mac = Mac.getInstance("HmacSHA256") + mac.init(SecretKeySpec("LOKI".toByteArray(), "HmacSHA256")) + val symmetricKey = mac.doFinal(ephemeralSharedSecret) + val x1 = DecryptionUtilities.decryptUsingAESGCM(ivAndCiphertext, symmetricKey) + // 4. ) Parse the closed group ciphertext message + val x2 = ClosedGroupCiphertextMessage.from(x1) + if (x2 == null) { + throw Error.ParsingFailed + } + val senderPublicKey = x2.senderPublicKey.toHexString() + // 5. ) Use the info inside the closed group ciphertext message to decrypt the actual message content + val plaintext = SharedSenderKeysImplementation.shared.decrypt(x2.ivAndCiphertext, groupPublicKey, senderPublicKey, x2.keyIndex) + // 6. ) Return + return Pair(plaintext, senderPublicKey) + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/closedgroups/SharedSenderKeysDatabaseProtocol.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/closedgroups/SharedSenderKeysDatabaseProtocol.kt new file mode 100644 index 000000000..48f805be1 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/closedgroups/SharedSenderKeysDatabaseProtocol.kt @@ -0,0 +1,25 @@ +package org.session.libsignal.service.loki.protocol.closedgroups + +enum class ClosedGroupRatchetCollectionType { Old, Current } + +interface SharedSenderKeysDatabaseProtocol { + + // region Ratchets & Sender Keys + fun getClosedGroupRatchet(groupPublicKey: String, senderPublicKey: String, collection: ClosedGroupRatchetCollectionType): ClosedGroupRatchet? + fun setClosedGroupRatchet(groupPublicKey: String, senderPublicKey: String, ratchet: ClosedGroupRatchet, collection: ClosedGroupRatchetCollectionType) + fun removeAllClosedGroupRatchets(groupPublicKey: String, collection: ClosedGroupRatchetCollectionType) + fun getAllClosedGroupRatchets(groupPublicKey: String, collection: ClosedGroupRatchetCollectionType): Set> + fun getAllClosedGroupSenderKeys(groupPublicKey: String, collection: ClosedGroupRatchetCollectionType): Set + // endregion + + // region Private & Public Keys + fun getClosedGroupPrivateKey(groupPublicKey: String): String? + fun setClosedGroupPrivateKey(groupPublicKey: String, groupPrivateKey: String) + fun removeClosedGroupPrivateKey(groupPublicKey: String) + fun getAllClosedGroupPublicKeys(): Set + // endregion + + // region Convenience + fun isSSKBasedClosedGroup(groupPublicKey: String): Boolean + // endregion +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/closedgroups/SharedSenderKeysImplementation.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/closedgroups/SharedSenderKeysImplementation.kt new file mode 100644 index 000000000..053832e3d --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/closedgroups/SharedSenderKeysImplementation.kt @@ -0,0 +1,217 @@ +package org.session.libsignal.service.loki.protocol.closedgroups + +import org.session.libsignal.libsignal.ecc.DjbECPrivateKey +import org.session.libsignal.libsignal.ecc.DjbECPublicKey +import org.session.libsignal.libsignal.ecc.ECKeyPair +import org.session.libsignal.libsignal.logging.Log +import org.session.libsignal.libsignal.util.ByteUtil +import org.session.libsignal.libsignal.util.Hex +import org.session.libsignal.service.internal.util.Util +import org.session.libsignal.service.loki.api.utilities.EncryptionUtilities +import org.session.libsignal.service.loki.utilities.removing05PrefixIfNeeded +import org.session.libsignal.service.loki.utilities.toHexString +import javax.crypto.Cipher +import javax.crypto.Mac +import javax.crypto.spec.GCMParameterSpec +import javax.crypto.spec.SecretKeySpec + +public final class SharedSenderKeysImplementation(private val database: SharedSenderKeysDatabaseProtocol, private val delegate: SharedSenderKeysImplementationDelegate) { + private val gcmTagSize = 128 + private val ivSize = 12 + + // A quick overview of how shared sender key based closed groups work: + // + // • When a user creates a group, they generate a key pair for the group along with a ratchet for + // every member of the group. They bundle this together with some other group info such as the group + // name in a `ClosedGroupUpdateMessage` and send that using established channels to every member of + // the group. Note that because a user can only pick from their existing contacts when selecting + // the group members they shouldn't need to establish sessions before being able to send the + // `ClosedGroupUpdateMessage`. + // • After the group is created, every user polls for the public key associated with the group. + // • Upon receiving a `ClosedGroupUpdateMessage` of type `.new`, a user sends session requests to all + // other members of the group they don't yet have a session with for reasons outlined below. + // • When a user sends a message they step their ratchet and use the resulting message key to encrypt + // the message. + // • When another user receives that message, they step the ratchet associated with the sender and + // use the resulting message key to decrypt the message. + // • When a user leaves or is kicked from a group, all members must generate new ratchets to ensure that + // removed users can't decrypt messages going forward. To this end every user deletes all ratchets + // associated with the group in question upon receiving a group update message that indicates that + // a user left. They then generate a new ratchet for themselves and send it out to all members of + // the group. The user should already have established sessions with all other members at this point + // because of the behavior outlined a few points above. + // • When a user adds a new member to the group, they generate a ratchet for that new member and + // send that bundled in a `ClosedGroupUpdateMessage` to the group. They send a + // `ClosedGroupUpdateMessage` with the newly generated ratchet but also the existing ratchets of + // every other member of the group to the user that joined. + + // region Initialization + companion object { + + public lateinit var shared: SharedSenderKeysImplementation + + public fun configureIfNeeded(database: SharedSenderKeysDatabaseProtocol, delegate: SharedSenderKeysImplementationDelegate) { + if (::shared.isInitialized) { return; } + shared = SharedSenderKeysImplementation(database, delegate) + } + } + // endregion + + // region Error + public class LoadingFailed(val groupPublicKey: String, val senderPublicKey: String) + : Exception("Couldn't get ratchet for closed group with public key: $groupPublicKey, sender public key: $senderPublicKey.") + public class MessageKeyMissing(val targetKeyIndex: Int, val groupPublicKey: String, val senderPublicKey: String) + : Exception("Couldn't find message key for old key index: $targetKeyIndex, public key: $groupPublicKey, sender public key: $senderPublicKey.") + public class GenericRatchetingException : Exception("An error occurred.") + // endregion + + // region Private API + private fun hmac(key: ByteArray, input: ByteArray): ByteArray { + val mac = Mac.getInstance("HmacSHA256") + mac.init(SecretKeySpec(key, "HmacSHA256")) + return mac.doFinal(input) + } + + private fun step(ratchet: ClosedGroupRatchet): ClosedGroupRatchet { + val nextMessageKey = hmac(Hex.fromStringCondensed(ratchet.chainKey), ByteArray(1) { 1.toByte() }) + val nextChainKey = hmac(Hex.fromStringCondensed(ratchet.chainKey), ByteArray(1) { 2.toByte() }) + val nextKeyIndex = ratchet.keyIndex + 1 + val messageKeys = ratchet.messageKeys + listOf( nextMessageKey.toHexString() ) + return ClosedGroupRatchet(nextChainKey.toHexString(), nextKeyIndex, messageKeys) + } + + /** + * Sync. Don't call from the main thread. + */ + private fun stepRatchetOnce(groupPublicKey: String, senderPublicKey: String): ClosedGroupRatchet { + val ratchet = database.getClosedGroupRatchet(groupPublicKey, senderPublicKey, ClosedGroupRatchetCollectionType.Current) + if (ratchet == null) { + val exception = LoadingFailed(groupPublicKey, senderPublicKey) + Log.d("Loki", exception.message ?: "An error occurred.") + throw exception + } + try { + val result = step(ratchet) + database.setClosedGroupRatchet(groupPublicKey, senderPublicKey, result, ClosedGroupRatchetCollectionType.Current) + return result + } catch (exception: Exception) { + Log.d("Loki", "Couldn't step ratchet due to error: $exception.") + throw exception + } + } + + private fun stepRatchet(groupPublicKey: String, senderPublicKey: String, targetKeyIndex: Int, isRetry: Boolean = false): ClosedGroupRatchet { + val collection = if (isRetry) ClosedGroupRatchetCollectionType.Old else ClosedGroupRatchetCollectionType.Current + val ratchet = database.getClosedGroupRatchet(groupPublicKey, senderPublicKey, collection) + if (ratchet == null) { + val exception = LoadingFailed(groupPublicKey, senderPublicKey) + Log.d("Loki", exception.message ?: "An error occurred.") + throw exception + } + if (targetKeyIndex < ratchet.keyIndex) { + // There's no need to advance the ratchet if this is invoked for an old key index + if (ratchet.messageKeys.count() <= targetKeyIndex) { + val exception = MessageKeyMissing(targetKeyIndex, groupPublicKey, senderPublicKey) + Log.d("Loki", exception.message ?: "An error occurred.") + throw exception + } + return ratchet + } else { + var currentKeyIndex = ratchet.keyIndex + var result: ClosedGroupRatchet = ratchet // Explicitly typed because otherwise the compiler has trouble inferring that this can't be null + while (currentKeyIndex < targetKeyIndex) { + try { + result = step(result) + currentKeyIndex = result.keyIndex + } catch (exception: Exception) { + Log.d("Loki", "Couldn't step ratchet due to error: $exception.") + throw exception + } + } + val collection = if (isRetry) ClosedGroupRatchetCollectionType.Old else ClosedGroupRatchetCollectionType.Current + database.setClosedGroupRatchet(groupPublicKey, senderPublicKey, result, collection) + return result + } + } + // endregion + + // region Public API + public fun generateRatchet(groupPublicKey: String, senderPublicKey: String): ClosedGroupRatchet { + val rootChainKey = Util.getSecretBytes(32).toHexString() + val ratchet = ClosedGroupRatchet(rootChainKey, 0, listOf()) + database.setClosedGroupRatchet(groupPublicKey, senderPublicKey, ratchet, ClosedGroupRatchetCollectionType.Current) + return ratchet + } + + public fun encrypt(plaintext: ByteArray, groupPublicKey: String, senderPublicKey: String): Pair { + val ratchet: ClosedGroupRatchet + try { + ratchet = stepRatchetOnce(groupPublicKey, senderPublicKey) + } catch (exception: Exception) { + if (exception is LoadingFailed) { + delegate.requestSenderKey(groupPublicKey, senderPublicKey) + } + throw exception + } + val iv = Util.getSecretBytes(ivSize) + val cipher = Cipher.getInstance("AES/GCM/NoPadding") + val messageKey = ratchet.messageKeys.last() + cipher.init(Cipher.ENCRYPT_MODE, SecretKeySpec(Hex.fromStringCondensed(messageKey), "AES"), GCMParameterSpec(gcmTagSize, iv)) + return Pair(ByteUtil.combine(iv, cipher.doFinal(plaintext)), ratchet.keyIndex) + } + + public fun decrypt(ivAndCiphertext: ByteArray, groupPublicKey: String, senderPublicKey: String, keyIndex: Int, isRetry: Boolean = false): ByteArray { + val ratchet: ClosedGroupRatchet + try { + ratchet = stepRatchet(groupPublicKey, senderPublicKey, keyIndex, isRetry) + } catch (exception: Exception) { + if (!isRetry) { + return decrypt(ivAndCiphertext, groupPublicKey, senderPublicKey, keyIndex, true) + } else { + if (exception is LoadingFailed) { + delegate.requestSenderKey(groupPublicKey, senderPublicKey) + } + throw exception + } + } + val iv = ivAndCiphertext.sliceArray(0 until ivSize) + val ciphertext = ivAndCiphertext.sliceArray(ivSize until ivAndCiphertext.count()) + val messageKeys = ratchet.messageKeys + val lastNMessageKeys: List + if (messageKeys.count() > 16) { // Pick an arbitrary number of message keys to try; this helps resolve issues caused by messages arriving out of order + lastNMessageKeys = messageKeys.subList(messageKeys.lastIndex - 16, messageKeys.lastIndex) + } else { + lastNMessageKeys = messageKeys + } + if (lastNMessageKeys.isEmpty()) { + throw MessageKeyMissing(keyIndex, groupPublicKey, senderPublicKey) + } + var exception: Exception? = null + for (messageKey in lastNMessageKeys.reversed()) { // Reversed because most likely the last one is the one we need + val cipher = Cipher.getInstance("AES/GCM/NoPadding") + cipher.init(Cipher.DECRYPT_MODE, SecretKeySpec(Hex.fromStringCondensed(messageKey), "AES"), GCMParameterSpec(EncryptionUtilities.gcmTagSize, iv)) + try { + return cipher.doFinal(ciphertext) + } catch (e: Exception) { + exception = e + } + } + if (!isRetry) { + return decrypt(ivAndCiphertext, groupPublicKey, senderPublicKey, keyIndex, true) + } else { + delegate.requestSenderKey(groupPublicKey, senderPublicKey) + throw exception ?: GenericRatchetingException() + } + } + + public fun isClosedGroup(publicKey: String): Boolean { + return database.getAllClosedGroupPublicKeys().contains(publicKey) + } + + public fun getKeyPair(groupPublicKey: String): ECKeyPair? { + val privateKey = database.getClosedGroupPrivateKey(groupPublicKey) ?: return null + return ECKeyPair(DjbECPublicKey(Hex.fromStringCondensed(groupPublicKey.removing05PrefixIfNeeded())), + DjbECPrivateKey(Hex.fromStringCondensed(privateKey))) + } + // endregion +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/closedgroups/SharedSenderKeysImplementationDelegate.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/closedgroups/SharedSenderKeysImplementationDelegate.kt new file mode 100644 index 000000000..db90892ef --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/closedgroups/SharedSenderKeysImplementationDelegate.kt @@ -0,0 +1,6 @@ +package org.session.libsignal.service.loki.protocol.closedgroups + +public interface SharedSenderKeysImplementationDelegate { + + public fun requestSenderKey(groupPublicKey: String, senderPublicKey: String) +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/mentions/Mention.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/mentions/Mention.kt new file mode 100644 index 000000000..dc295fe92 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/mentions/Mention.kt @@ -0,0 +1,3 @@ +package org.session.libsignal.service.loki.protocol.mentions + +data class Mention(val publicKey: String, val displayName: String) diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/mentions/MentionsManager.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/mentions/MentionsManager.kt new file mode 100644 index 000000000..d4308cf6a --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/mentions/MentionsManager.kt @@ -0,0 +1,57 @@ +package org.session.libsignal.service.loki.protocol.mentions + +import org.session.libsignal.service.loki.database.LokiThreadDatabaseProtocol +import org.session.libsignal.service.loki.database.LokiUserDatabaseProtocol + +class MentionsManager(private val userPublicKey: String, private val threadDatabase: LokiThreadDatabaseProtocol, + private val userDatabase: LokiUserDatabaseProtocol) { + var userPublicKeyCache = mutableMapOf>() // Thread ID to set of user hex encoded public keys + + companion object { + + public lateinit var shared: MentionsManager + + public fun configureIfNeeded(userPublicKey: String, threadDatabase: LokiThreadDatabaseProtocol, userDatabase: LokiUserDatabaseProtocol) { + if (::shared.isInitialized) { return; } + shared = MentionsManager(userPublicKey, threadDatabase, userDatabase) + } + } + + fun cache(publicKey: String, threadID: Long) { + val cache = userPublicKeyCache[threadID] + if (cache != null) { + userPublicKeyCache[threadID] = cache.plus(publicKey) + } else { + userPublicKeyCache[threadID] = setOf( publicKey ) + } + } + + fun getMentionCandidates(query: String, threadID: Long): List { + // Prepare + val cache = userPublicKeyCache[threadID] ?: return listOf() + // Gather candidates + val publicChat = threadDatabase.getPublicChat(threadID) + var candidates: List = cache.mapNotNull { publicKey -> + val displayName: String? + if (publicChat != null) { + displayName = userDatabase.getServerDisplayName(publicChat.id, publicKey) + } else { + displayName = userDatabase.getDisplayName(publicKey) + } + if (displayName == null) { return@mapNotNull null } + if (displayName.startsWith("Anonymous")) { return@mapNotNull null } + Mention(publicKey, displayName) + } + candidates = candidates.filter { it.publicKey != userPublicKey } + // Sort alphabetically first + candidates.sortedBy { it.displayName } + if (query.length >= 2) { + // Filter out any non-matching candidates + candidates = candidates.filter { it.displayName.toLowerCase().contains(query.toLowerCase()) } + // Sort based on where in the candidate the query occurs + candidates.sortedBy { it.displayName.toLowerCase().indexOf(query.toLowerCase()) } + } + // Return + return candidates + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/meta/SessionMetaProtocol.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/meta/SessionMetaProtocol.kt new file mode 100644 index 000000000..ecda929f5 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/meta/SessionMetaProtocol.kt @@ -0,0 +1,25 @@ +package org.session.libsignal.service.loki.protocol.meta + +import org.session.libsignal.service.loki.database.LokiAPIDatabaseProtocol +import org.session.libsignal.service.loki.protocol.shelved.multidevice.MultiDeviceProtocol + +public class SessionMetaProtocol(private val apiDatabase: LokiAPIDatabaseProtocol, private val userPublicKey: String) { + + // region Initialization + companion object { + + public lateinit var shared: SessionMetaProtocol + + public fun configureIfNeeded(apiDatabase: LokiAPIDatabaseProtocol, userPublicKey: String) { + if (::shared.isInitialized) { return; } + shared = SessionMetaProtocol(apiDatabase, userPublicKey) + } + } + // endregion + + // region Utilities + public fun isNoteToSelf(publicKey: String): Boolean { + return userPublicKey == publicKey // return MultiDeviceProtocol.shared.getAllLinkedDevices(userPublicKey).contains(publicKey) + } + // endregion +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/meta/TTLUtilities.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/meta/TTLUtilities.kt new file mode 100644 index 000000000..b183d3ae3 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/meta/TTLUtilities.kt @@ -0,0 +1,38 @@ +package org.session.libsignal.service.loki.protocol.meta + +public object TTLUtilities { + + /** + * If a message type specifies an invalid TTL, this will be used. + */ + public val fallbackMessageTTL = 2 * 24 * 60 * 60 * 1000 + + public enum class MessageType { + // Unimportant control messages + Address, Call, TypingIndicator, Verified, + // Somewhat important control messages + DeviceLink, + // Important control messages + ClosedGroupUpdate, Ephemeral, SessionRequest, Receipt, Sync, DeviceUnlinkingRequest, + // Visible messages + Regular + } + + @JvmStatic + public fun getTTL(messageType: MessageType): Int { + val minuteInMs = 60 * 1000 + val hourInMs = 60 * minuteInMs + val dayInMs = 24 * hourInMs + return when (messageType) { + // Unimportant control messages + MessageType.Address, MessageType.Call, MessageType.TypingIndicator, MessageType.Verified -> 1 * minuteInMs + // Somewhat important control messages + MessageType.DeviceLink -> 1 * hourInMs + // Important control messages + MessageType.ClosedGroupUpdate, MessageType.Ephemeral, MessageType.SessionRequest, MessageType.Receipt, + MessageType.Sync, MessageType.DeviceUnlinkingRequest -> 2 * dayInMs - 1 * hourInMs + // Visible messages + MessageType.Regular -> 2 * dayInMs + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/sessionmanagement/PreKeyBundleMessage.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/sessionmanagement/PreKeyBundleMessage.kt new file mode 100644 index 000000000..e6ea780da --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/sessionmanagement/PreKeyBundleMessage.kt @@ -0,0 +1,23 @@ +package org.session.libsignal.service.loki.protocol.sessionmanagement + +import org.session.libsignal.libsignal.IdentityKey +import org.session.libsignal.libsignal.ecc.Curve +import org.session.libsignal.libsignal.state.PreKeyBundle + +data class PreKeyBundleMessage( + val identityKey: ByteArray, + val deviceID: Int, + val preKeyID: Int, + val signedPreKeyID: Int, + val preKey: ByteArray, + val signedPreKey: ByteArray, + val signedPreKeySignature: ByteArray +) { + + constructor(preKeyBundle: PreKeyBundle) : this(preKeyBundle.identityKey.serialize(), preKeyBundle.deviceId, preKeyBundle.preKeyId, + preKeyBundle.signedPreKeyId, preKeyBundle.preKey.serialize(), preKeyBundle.signedPreKey.serialize(), preKeyBundle.signedPreKeySignature) + + fun getPreKeyBundle(registrationID: Int): PreKeyBundle { + return PreKeyBundle(registrationID, deviceID, preKeyID, Curve.decodePoint(preKey, 0), signedPreKeyID, Curve.decodePoint(signedPreKey, 0), signedPreKeySignature, IdentityKey(identityKey, 0)) + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/sessionmanagement/SessionManagementProtocol.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/sessionmanagement/SessionManagementProtocol.kt new file mode 100644 index 000000000..bd27cf5c3 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/sessionmanagement/SessionManagementProtocol.kt @@ -0,0 +1,67 @@ +package org.session.libsignal.service.loki.protocol.sessionmanagement + +import org.session.libsignal.libsignal.SignalProtocolAddress +import org.session.libsignal.libsignal.logging.Log +import org.session.libsignal.libsignal.loki.SessionResetProtocol +import org.session.libsignal.libsignal.loki.SessionResetStatus +import org.session.libsignal.libsignal.state.SignalProtocolStore +import org.session.libsignal.libsignal.util.guava.Optional +import org.session.libsignal.service.api.SignalServiceMessageSender +import org.session.libsignal.service.api.messages.SignalServiceDataMessage +import org.session.libsignal.service.api.push.SignalServiceAddress +import org.session.libsignal.service.loki.api.SnodeAPI +import org.session.libsignal.service.loki.database.LokiThreadDatabaseProtocol +import org.session.libsignal.service.loki.protocol.closedgroups.SharedSenderKeysDatabaseProtocol + +public class SessionManagementProtocol(private val sessionResetImpl: SessionResetProtocol, private val sskDatabase: SharedSenderKeysDatabaseProtocol, + private val delegate: SessionManagementProtocolDelegate) { + + // region Initialization + companion object { + + public lateinit var shared: SessionManagementProtocol + + public fun configureIfNeeded(sessionResetImpl: SessionResetProtocol, sskDatabase: SharedSenderKeysDatabaseProtocol, delegate: SessionManagementProtocolDelegate) { + if (::shared.isInitialized) { return; } + shared = SessionManagementProtocol(sessionResetImpl, sskDatabase, delegate) + } + } + // endregion + + // region Sending + public fun shouldMessageUseFallbackEncryption(message: Any, publicKey: String, store: SignalProtocolStore): Boolean { + if (sskDatabase.isSSKBasedClosedGroup(publicKey)) { return true } // We don't actually use fallback encryption but this indicates that we don't need a session + if (message is SignalServiceDataMessage && message.preKeyBundle.isPresent) { return true; } // This covers session requests as well as end session messages + val recipient = SignalProtocolAddress(publicKey, SignalServiceAddress.DEFAULT_DEVICE_ID) + return !store.containsSession(recipient) + } + + /** + * Called after an end session message is sent. + */ + public fun setSessionResetStatusToInProgressIfNeeded(recipient: SignalServiceAddress, eventListener: Optional) { + val publicKey = recipient.number + val sessionResetStatus = sessionResetImpl.getSessionResetStatus(publicKey) + if (sessionResetStatus == SessionResetStatus.REQUEST_RECEIVED) { return } + Log.d("Loki", "Starting session reset") + sessionResetImpl.setSessionResetStatus(publicKey, SessionResetStatus.IN_PROGRESS) + if (!eventListener.isPresent) { return } + eventListener.get().onSecurityEvent(recipient) + } + + public fun repairSessionIfNeeded(recipient: SignalServiceAddress, isClosedGroup: Boolean) { + val publicKey = recipient.number + if (!isClosedGroup) { return } + delegate.sendSessionRequestIfNeeded(publicKey) + } + + public fun shouldIgnoreMissingPreKeyBundleException(isClosedGroup: Boolean): Boolean { + // When a closed group is created, members try to establish sessions with eachother in the background through + // session requests. Until ALL users those session requests were sent to have come online, stored the pre key + // bundles contained in the session requests and replied with background messages to finalize the session + // creation, a given user won't be able to successfully send a message to all members of a group. This check + // is so that until we can do better on this front the user at least won't see this as an error in the UI. + return isClosedGroup + } + // endregion +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/sessionmanagement/SessionManagementProtocolDelegate.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/sessionmanagement/SessionManagementProtocolDelegate.kt new file mode 100644 index 000000000..152f69982 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/sessionmanagement/SessionManagementProtocolDelegate.kt @@ -0,0 +1,6 @@ +package org.session.libsignal.service.loki.protocol.sessionmanagement + +interface SessionManagementProtocolDelegate { + + fun sendSessionRequestIfNeeded(publicKey: String) +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/shelved/multidevice/DeviceLink.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/shelved/multidevice/DeviceLink.kt new file mode 100644 index 000000000..e8c20d3e3 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/shelved/multidevice/DeviceLink.kt @@ -0,0 +1,72 @@ +package org.session.libsignal.service.loki.protocol.shelved.multidevice + +import org.whispersystems.curve25519.Curve25519 +import org.session.libsignal.libsignal.logging.Log +import org.session.libsignal.service.internal.util.Base64 +import org.session.libsignal.service.internal.util.Hex +import org.session.libsignal.service.loki.utilities.removing05PrefixIfNeeded +import java.util.* + +data class DeviceLink(val masterPublicKey: String, val slavePublicKey: String, val requestSignature: ByteArray?, val authorizationSignature: ByteArray?) { + private val curve = Curve25519.getInstance(Curve25519.BEST) + + val type: Type + get() = when (authorizationSignature) { + null -> Type.REQUEST + else -> Type.AUTHORIZATION + } + + enum class Type(val rawValue: Int) { REQUEST(1), AUTHORIZATION(2) } + + constructor(masterPublicKey: String, slavePublicKey: String) : this(masterPublicKey, slavePublicKey, null, null) + + fun sign(type: Type, privateKey: ByteArray): DeviceLink? { + val target = if (type == Type.REQUEST) masterPublicKey else slavePublicKey + val data = Hex.fromStringCondensed(target) + ByteArray(1) { type.rawValue.toByte() } + try { + val signature = curve.calculateSignature(privateKey, data) + return if (type == Type.REQUEST) copy(requestSignature = signature) else copy(authorizationSignature = signature) + } catch (e: Exception) { + return null + } + } + + fun verify(): Boolean { + if (requestSignature == null && authorizationSignature == null) { return false } + val signature = if (type == Type.REQUEST) requestSignature else authorizationSignature + val issuer = if (type == Type.REQUEST) slavePublicKey else masterPublicKey + val target = if (type == Type.REQUEST) masterPublicKey else slavePublicKey + return try { + val data = Hex.fromStringCondensed(target) + ByteArray(1) { type.rawValue.toByte() } + val issuerPublicKey = Hex.fromStringCondensed(issuer.removing05PrefixIfNeeded()) + curve.verifySignature(issuerPublicKey, data, signature) + } catch (e: Exception) { + Log.w("LOKI", e.message) + false + } + } + + fun toJSON(): Map { + val result = mutableMapOf( "primaryDevicePubKey" to masterPublicKey, "secondaryDevicePubKey" to slavePublicKey ) + if (requestSignature != null) { result["requestSignature"] = Base64.encodeBytes(requestSignature) } + if (authorizationSignature != null) { result["grantSignature"] = Base64.encodeBytes(authorizationSignature) } + return result + } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other is DeviceLink) { + return (masterPublicKey == other.masterPublicKey && slavePublicKey == other.slavePublicKey + && Arrays.equals(requestSignature, other.requestSignature) && Arrays.equals(authorizationSignature, other.authorizationSignature)) + } else { + return false + } + } + + override fun hashCode(): Int { + var hash = masterPublicKey.hashCode() xor slavePublicKey.hashCode() + if (requestSignature != null) { hash = hash xor Arrays.hashCode(requestSignature) } + if (authorizationSignature != null) { hash = hash xor Arrays.hashCode(authorizationSignature) } + return hash + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/shelved/multidevice/DeviceLinkingSession.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/shelved/multidevice/DeviceLinkingSession.kt new file mode 100644 index 000000000..9315c6df4 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/shelved/multidevice/DeviceLinkingSession.kt @@ -0,0 +1,37 @@ +package org.session.libsignal.service.loki.protocol.shelved.multidevice + +class DeviceLinkingSession { + private val listeners = mutableListOf() + var isListeningForLinkingRequests: Boolean = false + private set + + companion object { + val shared = DeviceLinkingSession() + } + + fun addListener(listener: DeviceLinkingSessionListener) { + listeners.add(listener) + } + + fun removeListener(listener: DeviceLinkingSessionListener) { + listeners.remove(listener) + } + + fun startListeningForLinkingRequests() { + isListeningForLinkingRequests = true + } + + fun stopListeningForLinkingRequests() { + isListeningForLinkingRequests = false + } + + fun processLinkingRequest(deviceLink: DeviceLink) { + if (!isListeningForLinkingRequests || !deviceLink.verify()) { return } + listeners.forEach { it.requestUserAuthorization(deviceLink) } + } + + fun processLinkingAuthorization(deviceLink: DeviceLink) { + if (!isListeningForLinkingRequests || !deviceLink.verify()) { return } + listeners.forEach { it.onDeviceLinkRequestAuthorized(deviceLink) } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/shelved/multidevice/DeviceLinkingSessionListener.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/shelved/multidevice/DeviceLinkingSessionListener.kt new file mode 100644 index 000000000..295af113e --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/shelved/multidevice/DeviceLinkingSessionListener.kt @@ -0,0 +1,7 @@ +package org.session.libsignal.service.loki.protocol.shelved.multidevice + +interface DeviceLinkingSessionListener { + + fun requestUserAuthorization(deviceLink: DeviceLink) { } + fun onDeviceLinkRequestAuthorized(deviceLink: DeviceLink) { } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/shelved/multidevice/MultiDeviceProtocol.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/shelved/multidevice/MultiDeviceProtocol.kt new file mode 100644 index 000000000..47be30d50 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/shelved/multidevice/MultiDeviceProtocol.kt @@ -0,0 +1,46 @@ +package org.session.libsignal.service.loki.protocol.shelved.multidevice + +import org.session.libsignal.service.loki.database.LokiAPIDatabaseProtocol + +public class MultiDeviceProtocol(private val apiDatabase: LokiAPIDatabaseProtocol) { + + // region Initialization + companion object { + + public lateinit var shared: MultiDeviceProtocol + + public fun configureIfNeeded(apiDatabase: LokiAPIDatabaseProtocol) { + if (Companion::shared.isInitialized) { return; } + shared = MultiDeviceProtocol(apiDatabase) + } + } + // endregion + + // region Utilities + public fun getMasterDevice(publicKey: String): String? { + return null + /* + val deviceLinks = apiDatabase.getDeviceLinks(publicKey) + return deviceLinks.firstOrNull { it.slavePublicKey == publicKey }?.masterPublicKey + */ + } + + public fun getSlaveDevices(publicKey: String): Set { + return setOf() + /* + val deviceLinks = apiDatabase.getDeviceLinks(publicKey) + if (deviceLinks.isEmpty()) { return setOf() } + return deviceLinks.map { it.slavePublicKey }.toSet() + */ + } + + public fun getAllLinkedDevices(publicKey: String): Set { + return setOf( publicKey ) + /* + val deviceLinks = apiDatabase.getDeviceLinks(publicKey) + if (deviceLinks.isEmpty()) { return setOf( publicKey ) } + return deviceLinks.flatMap { listOf( it.masterPublicKey, it.slavePublicKey ) }.toSet() + */ + } + // endregion +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/shelved/syncmessages/SyncMessagesProtocol.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/shelved/syncmessages/SyncMessagesProtocol.kt new file mode 100644 index 000000000..f0f0c5486 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/protocol/shelved/syncmessages/SyncMessagesProtocol.kt @@ -0,0 +1,36 @@ +package org.session.libsignal.service.loki.protocol.shelved.syncmessages + +import org.session.libsignal.service.api.messages.SignalServiceDataMessage +import org.session.libsignal.service.api.messages.SignalServiceGroup +import org.session.libsignal.service.loki.database.LokiAPIDatabaseProtocol + +public class SyncMessagesProtocol(private val apiDatabase: LokiAPIDatabaseProtocol, private val userPublicKey: String) { + + // region Initialization + companion object { + + public lateinit var shared: SyncMessagesProtocol + + public fun configureIfNeeded(apiDatabase: LokiAPIDatabaseProtocol, userPublicKey: String) { + if (Companion::shared.isInitialized) { return; } + shared = SyncMessagesProtocol(apiDatabase, userPublicKey) + } + } + // endregion + + // region Sending + /** + * Note: This is called only if based on Signal's logic we'd want to send a sync message. + */ + public fun shouldSyncMessage(message: SignalServiceDataMessage): Boolean { + return false + /* + if (message.deviceLink.isPresent) { return false } + val isOpenGroupMessage = message.group.isPresent && message.group.get().groupType == SignalServiceGroup.GroupType.PUBLIC_CHAT + if (isOpenGroupMessage) { return false } + val usesMultiDevice = apiDatabase.getDeviceLinks(userPublicKey).isNotEmpty() + return usesMultiDevice + */ + } + // endregion +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/Broadcaster.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/Broadcaster.kt new file mode 100644 index 000000000..17106c00b --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/Broadcaster.kt @@ -0,0 +1,7 @@ +package org.session.libsignal.service.loki.utilities + +interface Broadcaster { + + fun broadcast(event: String) + fun broadcast(event: String, long: Long) +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/DownloadUtilities.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/DownloadUtilities.kt new file mode 100644 index 000000000..fe7471f09 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/DownloadUtilities.kt @@ -0,0 +1,85 @@ +package org.session.libsignal.service.loki.utilities + +import okhttp3.HttpUrl +import okhttp3.Request +import org.session.libsignal.libsignal.logging.Log +import org.session.libsignal.service.api.messages.SignalServiceAttachment +import org.session.libsignal.service.api.push.exceptions.NonSuccessfulResponseCodeException +import org.session.libsignal.service.api.push.exceptions.PushNetworkException +import org.session.libsignal.service.internal.util.Base64 +import org.session.libsignal.service.loki.api.fileserver.FileServerAPI +import org.session.libsignal.service.loki.api.onionrequests.OnionRequestAPI +import java.io.* + +object DownloadUtilities { + + /** + * Blocks the calling thread. + */ + fun downloadFile(destination: File, url: String, maxSize: Int, listener: SignalServiceAttachment.ProgressListener?) { + val outputStream = FileOutputStream(destination) // Throws + var remainingAttempts = 4 + var exception: Exception? = null + while (remainingAttempts > 0) { + remainingAttempts -= 1 + try { + downloadFile(outputStream, url, maxSize, listener) + exception = null + break + } catch (e: Exception) { + exception = e + } + } + if (exception != null) { throw exception } + } + + /** + * Blocks the calling thread. + */ + fun downloadFile(outputStream: OutputStream, url: String, maxSize: Int, listener: SignalServiceAttachment.ProgressListener?) { + // We need to throw a PushNetworkException or NonSuccessfulResponseCodeException + // because the underlying Signal logic requires these to work correctly + val oldPrefixedHost = "https://" + HttpUrl.get(url).host() + var newPrefixedHost = oldPrefixedHost + if (oldPrefixedHost.contains(FileServerAPI.fileStorageBucketURL)) { + newPrefixedHost = FileServerAPI.shared.server + } + // Edge case that needs to work: https://file-static.lokinet.org/i1pNmpInq3w9gF3TP8TFCa1rSo38J6UM + // → https://file.getsession.org/loki/v1/f/XLxogNXVEIWHk14NVCDeppzTujPHxu35 + val fileID = url.substringAfter(oldPrefixedHost).substringAfter("/f/") + val sanitizedURL = "$newPrefixedHost/loki/v1/f/$fileID" + val request = Request.Builder().url(sanitizedURL).get() + try { + val serverPublicKey = if (newPrefixedHost.contains(FileServerAPI.shared.server)) FileServerAPI.fileServerPublicKey + else FileServerAPI.shared.getPublicKeyForOpenGroupServer(newPrefixedHost).get() + val json = OnionRequestAPI.sendOnionRequest(request.build(), newPrefixedHost, serverPublicKey, isJSONRequired = false).get() + val result = json["result"] as? String + if (result == null) { + Log.d("Loki", "Couldn't parse attachment from: $json.") + throw PushNetworkException("Missing response body.") + } + val body = Base64.decode(result) + if (body.size > maxSize) { + Log.d("Loki", "Attachment size limit exceeded.") + throw PushNetworkException("Max response size exceeded.") + } + val input = body.inputStream() + val buffer = ByteArray(32768) + var count = 0 + var bytes = input.read(buffer) + while (bytes >= 0) { + outputStream.write(buffer, 0, bytes) + count += bytes + if (count > maxSize) { + Log.d("Loki", "Attachment size limit exceeded.") + throw PushNetworkException("Max response size exceeded.") + } + listener?.onAttachmentProgress(body.size.toLong(), count.toLong()) + bytes = input.read(buffer) + } + } catch (e: Exception) { + Log.d("Loki", "Couldn't download attachment due to error: $e.") + throw if (e is NonSuccessfulResponseCodeException) e else PushNetworkException(e) + } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/HexEncoding.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/HexEncoding.kt new file mode 100644 index 000000000..40b094d76 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/HexEncoding.kt @@ -0,0 +1,20 @@ +package org.session.libsignal.service.loki.utilities + +import org.session.libsignal.libsignal.IdentityKeyPair +import org.session.libsignal.libsignal.ecc.ECKeyPair + +fun ByteArray.toHexString(): String { + return joinToString("") { String.format("%02x", it) } +} + +val IdentityKeyPair.hexEncodedPublicKey: String + get() = publicKey.serialize().toHexString() + +val IdentityKeyPair.hexEncodedPrivateKey: String + get() = privateKey.serialize().toHexString() + +val ECKeyPair.hexEncodedPublicKey: String + get() = publicKey.serialize().toHexString() + +val ECKeyPair.hexEncodedPrivateKey: String + get() = privateKey.serialize().toHexString() diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/PlaintextOutputStreamFactory.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/PlaintextOutputStreamFactory.kt new file mode 100644 index 000000000..b913289b0 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/PlaintextOutputStreamFactory.kt @@ -0,0 +1,18 @@ +package org.session.libsignal.service.loki.utilities + +import org.session.libsignal.service.api.crypto.DigestingOutputStream +import org.session.libsignal.service.internal.push.http.OutputStreamFactory +import java.io.OutputStream + +/** + * An `OutputStreamFactory` that copies the input directly to the output without modification. + * + * For encrypted attachments, see `AttachmentCipherOutputStreamFactory`. + * For encrypted profiles, see `ProfileCipherOutputStreamFactory`. + */ +class PlaintextOutputStreamFactory : OutputStreamFactory { + + override fun createFor(outputStream: OutputStream?): DigestingOutputStream { + return object : DigestingOutputStream(outputStream) { } + } +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/PrettifiedDescription.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/PrettifiedDescription.kt new file mode 100644 index 000000000..6f47f98f1 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/PrettifiedDescription.kt @@ -0,0 +1,27 @@ +package org.session.libsignal.service.loki.utilities + +fun Any.prettifiedDescription(): String { + if (this is List<*>) { return prettifiedDescription() } + if (this is Map<*, *>) { return prettifiedDescription() } + return toString() +} + +fun List<*>.prettifiedDescription(): String { + if (isEmpty()) { return "[]" } + return "[ " + joinToString(", ") { it?.prettifiedDescription() ?: "null" } + " ]" +} + +fun Map<*, *>.prettifiedDescription(): String { + return "[ " + map { entry -> + val keyDescription = entry.key?.prettifiedDescription() ?: "null" + var valueDescription = entry.value?.prettifiedDescription() ?: "null" + if (valueDescription.isEmpty()) { valueDescription = "\"\"" } + val maxLength = 20 + val truncatedValueDescription = if (valueDescription.length > maxLength) { + valueDescription.substring(0 until maxLength) + "..." + } else { + valueDescription + } + "$keyDescription : $truncatedValueDescription" + }.joinToString(", ") + " ]" +} \ No newline at end of file diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/PromiseUtilities.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/PromiseUtilities.kt new file mode 100644 index 000000000..8e8ddf698 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/PromiseUtilities.kt @@ -0,0 +1,51 @@ +@file:JvmName("PromiseUtilities") +package org.session.libsignal.service.loki.utilities + +import nl.komponents.kovenant.* +import org.session.libsignal.libsignal.logging.Log +import kotlin.math.max + +// Try to use all available threads minus one for the callback +private val recommendedThreadCount: Int + get() = Runtime.getRuntime().availableProcessors() - 1 + +fun Kovenant.createContext(contextName: String, threadCount: Int = max(recommendedThreadCount, 1)): Context { + return createContext { + callbackContext.dispatcher = buildDispatcher { + name = "${contextName}CallbackDispatcher" + // Ref: http://kovenant.komponents.nl/api/core_usage/#execution-order + // Having 1 concurrent task ensures we have in-order callback handling + concurrentTasks = 1 + } + workerContext.dispatcher = buildDispatcher { + name = "${contextName}WorkerDispatcher" + concurrentTasks = threadCount + } + multipleCompletion = { v1, v2 -> + Log.d("Loki", "Promise resolved more than once (first with $v1, then with $v2); ignoring $v2.") + } + } +} + +fun Promise.get(defaultValue: V): V { + return try { + get() + } catch (e: Exception) { + defaultValue + } +} + +fun Promise.recover(callback: (exception: E) -> V): Promise { + val deferred = deferred() + success { + deferred.resolve(it) + }.fail { + try { + val value = callback(it) + deferred.resolve(value) + } catch (e: Throwable) { + deferred.reject(it) + } + } + return deferred.promise +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/Random.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/Random.kt new file mode 100644 index 000000000..68bc4380c --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/Random.kt @@ -0,0 +1,18 @@ +package org.session.libsignal.service.loki.utilities + +import java.security.SecureRandom + +/** + * Uses `SecureRandom` to pick an element from this collection. + */ +fun Collection.getRandomElementOrNull(): T? { + val index = SecureRandom().nextInt(size) // SecureRandom() should be cryptographically secure + return elementAtOrNull(index) +} + +/** + * Uses `SecureRandom` to pick an element from this collection. + */ +fun Collection.getRandomElement(): T { + return getRandomElementOrNull()!! +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/Reflection.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/Reflection.kt new file mode 100644 index 000000000..8554596ba --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/Reflection.kt @@ -0,0 +1,10 @@ +package org.session.libsignal.service.loki.utilities + +import kotlin.reflect.KProperty1 +import kotlin.reflect.full.memberProperties + +@Suppress("UNCHECKED_CAST") +fun T.getProperty(name: String): U { + val p = this::class.memberProperties.first { it.name == name } as KProperty1 + return p.get(this) +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/Retrying.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/Retrying.kt new file mode 100644 index 000000000..b84f4c931 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/Retrying.kt @@ -0,0 +1,30 @@ +package org.session.libsignal.service.loki.utilities + +import nl.komponents.kovenant.Promise +import nl.komponents.kovenant.deferred +import java.util.* + +fun > retryIfNeeded(maxRetryCount: Int, retryInterval: Long = 1 * 1000, body: () -> T): Promise { + var retryCount = 0 + val deferred = deferred() + val thread = Thread.currentThread() + fun retryIfNeeded() { + body().success { + deferred.resolve(it) + }.fail { + if (retryCount == maxRetryCount) { + deferred.reject(it) + } else { + retryCount += 1 + Timer().schedule(object : TimerTask() { + + override fun run() { + thread.run { retryIfNeeded() } + } + }, retryInterval) + } + } + } + retryIfNeeded() + return deferred.promise +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/Trimming.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/Trimming.kt new file mode 100644 index 000000000..5bb7ccace --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/Trimming.kt @@ -0,0 +1,12 @@ +package org.session.libsignal.service.loki.utilities + +import org.session.libsignal.service.internal.util.Hex + +fun String.removing05PrefixIfNeeded(): String { + return if (length == 66) removePrefix("05") else this +} + +fun ByteArray.removing05PrefixIfNeeded(): ByteArray { + val string = Hex.toStringCondensed(this).removing05PrefixIfNeeded() + return Hex.fromStringCondensed(string) +} diff --git a/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/Validation.kt b/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/Validation.kt new file mode 100644 index 000000000..e8cd7e7b5 --- /dev/null +++ b/libsignal/src/main/java/org/session/libsignal/service/loki/utilities/Validation.kt @@ -0,0 +1,18 @@ +package org.session.libsignal.service.loki.utilities + +object PublicKeyValidation { + + @JvmStatic + fun isValid(candidate: String): Boolean { + return isValid(candidate, 66, true) + } + + @JvmStatic + fun isValid(candidate: String, expectedLength: Int, isPrefixRequired: Boolean): Boolean { + val hexCharacters = "0123456789ABCDEF".toSet() + val isValidHexEncoding = hexCharacters.containsAll(candidate.toUpperCase().toSet()) + val hasValidLength = candidate.length == expectedLength + val hasValidPrefix = if (isPrefixRequired) candidate.startsWith("05") else true + return isValidHexEncoding && hasValidLength && hasValidPrefix + } +} diff --git a/libsignal/src/test/java/org/session/libsignal/ExampleUnitTest.kt b/libsignal/src/test/java/org/session/libsignal/ExampleUnitTest.kt new file mode 100644 index 000000000..84c57de09 --- /dev/null +++ b/libsignal/src/test/java/org/session/libsignal/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package org.session.libsignal + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/sessionmessaging/build.gradle b/sessionmessaging/build.gradle deleted file mode 100644 index 0acd7b589..000000000 --- a/sessionmessaging/build.gradle +++ /dev/null @@ -1,13 +0,0 @@ -plugins { - id 'java-library' - id 'kotlin' -} - -java { - sourceCompatibility = JavaVersion.VERSION_1_7 - targetCompatibility = JavaVersion.VERSION_1_7 -} - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion" -} \ No newline at end of file diff --git a/sessionprotocol/build.gradle b/sessionprotocol/build.gradle deleted file mode 100644 index 0acd7b589..000000000 --- a/sessionprotocol/build.gradle +++ /dev/null @@ -1,13 +0,0 @@ -plugins { - id 'java-library' - id 'kotlin' -} - -java { - sourceCompatibility = JavaVersion.VERSION_1_7 - targetCompatibility = JavaVersion.VERSION_1_7 -} - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion" -} \ No newline at end of file diff --git a/sessionsnode/.gitignore b/sessionsnode/.gitignore deleted file mode 100644 index 42afabfd2..000000000 --- a/sessionsnode/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/sessionsnode/build.gradle b/sessionsnode/build.gradle deleted file mode 100644 index 0acd7b589..000000000 --- a/sessionsnode/build.gradle +++ /dev/null @@ -1,13 +0,0 @@ -plugins { - id 'java-library' - id 'kotlin' -} - -java { - sourceCompatibility = JavaVersion.VERSION_1_7 - targetCompatibility = JavaVersion.VERSION_1_7 -} - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion" -} \ No newline at end of file diff --git a/sessionutilities/.gitignore b/sessionutilities/.gitignore deleted file mode 100644 index 42afabfd2..000000000 --- a/sessionutilities/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/sessionutilities/build.gradle b/sessionutilities/build.gradle deleted file mode 100644 index 0acd7b589..000000000 --- a/sessionutilities/build.gradle +++ /dev/null @@ -1,13 +0,0 @@ -plugins { - id 'java-library' - id 'kotlin' -} - -java { - sourceCompatibility = JavaVersion.VERSION_1_7 - targetCompatibility = JavaVersion.VERSION_1_7 -} - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion" -} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 90ff4c92b..1bb9e5aca 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,12 +1,9 @@ -include ':signalutilities' -include ':sessionutilities' -include ':sessionsnode' -include ':sessionprotocol' -include ':sessionmessaging' +include ':libsignal' +include ':libsession' rootProject.name = "session-android" include ":service" include ":service:java" include ":service:android" -include ':session' \ No newline at end of file +include ':app' \ No newline at end of file diff --git a/signalutilities/.gitignore b/signalutilities/.gitignore deleted file mode 100644 index 42afabfd2..000000000 --- a/signalutilities/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/signalutilities/build.gradle b/signalutilities/build.gradle deleted file mode 100644 index 0acd7b589..000000000 --- a/signalutilities/build.gradle +++ /dev/null @@ -1,13 +0,0 @@ -plugins { - id 'java-library' - id 'kotlin' -} - -java { - sourceCompatibility = JavaVersion.VERSION_1_7 - targetCompatibility = JavaVersion.VERSION_1_7 -} - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion" -} \ No newline at end of file