Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Copyright (c) WhatsApp Inc. and its affiliates.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree.
- */
- package com.plugin.unityapp;
- //import android.support.v4.content.FileProvider;
- import android.content.ContentProvider;
- import android.content.ContentResolver;
- import android.content.ContentValues;
- import android.content.Context;
- import android.content.SharedPreferences;
- import android.content.UriMatcher;
- import android.content.res.AssetFileDescriptor;
- import android.content.res.AssetManager;
- import android.database.Cursor;
- import android.database.MatrixCursor;
- import android.net.Uri;
- import android.os.Environment;
- import android.os.ParcelFileDescriptor;
- import android.preference.PreferenceManager;
- import android.text.TextUtils;
- import android.util.Log;
- import androidx.annotation.NonNull;
- import androidx.annotation.Nullable;
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.io.OutputStream;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.List;
- import java.util.Objects;
- public class StickerContentProvider extends ContentProvider {
- /**
- * Do not change the strings listed below, as these are used by WhatsApp. And changing these will break the interface between sticker app and WhatsApp.
- */
- public static final String STICKER_PACK_IDENTIFIER_IN_QUERY = "sticker_pack_identifier";
- public static final String STICKER_PACK_NAME_IN_QUERY = "sticker_pack_name";
- public static final String STICKER_PACK_PUBLISHER_IN_QUERY = "sticker_pack_publisher";
- public static final String STICKER_PACK_ICON_IN_QUERY = "sticker_pack_icon";
- public static final String ANDROID_APP_DOWNLOAD_LINK_IN_QUERY = "android_play_store_link";
- public static final String IOS_APP_DOWNLOAD_LINK_IN_QUERY = "ios_app_download_link";
- public static final String PUBLISHER_EMAIL = "sticker_pack_publisher_email";
- public static final String PUBLISHER_WEBSITE = "sticker_pack_publisher_website";
- public static final String PRIVACY_POLICY_WEBSITE = "sticker_pack_privacy_policy_website";
- public static final String LICENSE_AGREENMENT_WEBSITE = "sticker_pack_license_agreement_website";
- public static final String IMAGE_DATA_VERSION = "image_data_version";
- public static final String AVOID_CACHE = "whatsapp_will_not_cache_stickers";
- public static final String STICKER_FILE_NAME_IN_QUERY = "sticker_file_name";
- public static final String STICKER_FILE_EMOJI_IN_QUERY = "sticker_emoji";
- private static final String CONTENT_FILE_NAME = "contents.json";
- // public static final Uri AUTHORITY_URI = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT).authority(BuildConfig.CONTENT_PROVIDER_AUTHORITY).appendPath(StickerContentProvider.METADATA).build();
- public static final Uri AUTHORITY_URI = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT).authority(BuildConfig.CONTENT_PROVIDER_AUTHORITY).appendPath(StickerContentProvider.METADATA).build();
- /**
- * Do not change the values in the UriMatcher because otherwise, WhatsApp will not be able to fetch the stickers from the ContentProvider.
- */
- private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
- private static final String METADATA = "metadata";
- private static final int METADATA_CODE = 1;
- private static final int METADATA_CODE_FOR_SINGLE_PACK = 2;
- static final String STICKERS = "stickers";
- private static final int STICKERS_CODE = 3;
- static final String STICKERS_ASSET = "stickers_asset";
- private static final int STICKERS_ASSET_CODE = 4;
- private static final int STICKER_PACK_TRAY_ICON_CODE = 5;
- private List<StickerPack> stickerPackList;
- public static final String PREFS_NAME = "MyPrefsFile";
- @Override
- public boolean onCreate() {
- final String authority = BuildConfig.CONTENT_PROVIDER_AUTHORITY;
- if (!authority.startsWith(Objects.requireNonNull(getContext()).getPackageName())) {
- throw new IllegalStateException("your authority (" + authority + ") for the content provider should start with your package name: " + getContext().getPackageName());
- }
- //Write json from plugin assets to internal storage android/data/packagename/files/
- // String fileNAME = "contents.json";
- // File file = new File(String.valueOf(getContext().getExternalFilesDir("contents.json")));
- // if(file.exists()){
- // //Do something
- // Log.i("UnityAndroid","file already exists");
- //
- // }
- // else{
- // Log.i("UnityAndroid","file does not exists ,adding new one");
- //Nothing
- copyAssets();
- // }
- // SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
- // if (!prefs.getBoolean("firstTime", false)) {
- // // <---- run your one time code here
- //copyAssets();
- // mark first time has ran.
- // SharedPreferences.Editor editor = prefs.edit();
- // editor.putBoolean("firstTime", true);
- // editor.commit();
- // }
- //SharedPreferences playerPrefs = getContext().getSharedPreferences("com.idzgame.CatPun1" + ".v2.playerprefs", Context.MODE_PRIVATE); //getActivity().getPreferences(Context.MODE_PRIVATE);
- // SharedPreferences playerPrefs = getContext().getSharedPreferences(getContext().getPackageName() + ".playerprefs", Context.MODE_PRIVATE);
- //playerPrefs.getStringSet("ABC","Hello from Android playerPrefs");
- //playerPrefs.editor().putString(“Key”,”value”).apply();
- // playerPrefs.edit().putString("ABC","Hello from Android playerPrefs").apply();
- //setPreferenceString("ABC","Hello from Android playerPrefs");
- //String name = prefs.getString("userName", "");
- //the call to get the metadata for the sticker packs.
- MATCHER.addURI(authority, METADATA, METADATA_CODE);
- //the call to get the metadata for single sticker pack. * represent the identifier
- MATCHER.addURI(authority, METADATA + "/*", METADATA_CODE_FOR_SINGLE_PACK);
- //gets the list of stickers for a sticker pack, * respresent the identifier.
- MATCHER.addURI(authority, STICKERS + "/*", STICKERS_CODE);
- //if(AddStickersClass.StickerClicked) {
- for (StickerPack stickerPack : getStickerPackList()) {
- MATCHER.addURI(authority, STICKERS_ASSET + "/" + stickerPack.identifier + "/" + stickerPack.trayImageFile, STICKER_PACK_TRAY_ICON_CODE);
- for (Sticker sticker : stickerPack.getStickers()) {
- MATCHER.addURI(authority, STICKERS_ASSET + "/" + stickerPack.identifier + "/" + sticker.imageFileName, STICKERS_ASSET_CODE);
- }
- }
- //}
- return true;
- }
- //Not working
- public void setPreferenceString (String prefKey, String prefValue) {
- SharedPreferences settings = getContext().getSharedPreferences("com.idzgame.CatPun1" + ".v2.playerprefs", Context.MODE_PRIVATE);//.getSharedPreferences(PREFS_NAME, 0);
- SharedPreferences.Editor editor = settings.edit();
- editor.putString(prefKey, prefValue);
- editor.commit();
- }
- public String getPreferenceString (String prefKey) {
- SharedPreferences settings = getContext().getSharedPreferences("com.idzgame.CatPun1" + ".v2.playerprefs", Context.MODE_PRIVATE);//.getSharedPreferences(PREFS_NAME, 0);
- String playerName = settings.getString(prefKey, "");
- return playerName;
- }
- //
- private void copyAssets() {
- Log.i("UnityAndroid","Copyassets function called");
- // String fileNAME = "contents.json";
- // File file = new File(getContext().getExternalFilesDir(null),"contents.json");
- // if(file.exists()){
- // //Do something
- // Log.i("UnityAndroid","file already exists");
- //
- // }
- // else{
- // Log.i("UnityAndroid","file does not exists ,adding new one");
- // //Nothing
- // // copyAssets();
- // }
- AssetManager assetManager = getContext().getAssets();
- String[] files = null;
- try {
- files = assetManager.list("");
- } catch (IOException e) {
- Log.e("tag", "Failed to get asset file list.", e);
- }
- if (files != null) for (String filename : files) {
- // if(filename==fileNAME){
- InputStream in = null;
- OutputStream out = null;
- try {
- in = assetManager.open(filename);
- File outFile = new File(getContext().getExternalFilesDir(null), filename);
- out = new FileOutputStream(outFile);
- copyFile(in, out);
- } catch (IOException e) {
- Log.e("tag", "Failed to copy asset file: " + filename, e);
- } finally {
- if (in != null) {
- try {
- in.close();
- } catch (IOException e) {
- // NOOP
- }
- }
- if (out != null) {
- try {
- out.close();
- } catch (IOException e) {
- // NOOP
- }
- }
- }
- // }
- }
- }
- private void copyFile(InputStream in, OutputStream out) throws IOException {
- byte[] buffer = new byte[1024];
- int read;
- while((read = in.read(buffer)) != -1){
- out.write(buffer, 0, read);
- Log.i("UnityAndroid","Writing file");
- }
- }
- //
- @Override
- public Cursor query(@NonNull Uri uri, @Nullable String[] projection, String selection,
- String[] selectionArgs, String sortOrder) {
- final int code = MATCHER.match(uri);
- if (code == METADATA_CODE) {
- return getPackForAllStickerPacks(uri);
- } else if (code == METADATA_CODE_FOR_SINGLE_PACK) {
- return getCursorForSingleStickerPack(uri);
- } else if (code == STICKERS_CODE) {
- return getStickersForAStickerPack(uri);
- } else {
- throw new IllegalArgumentException("Unknown URI: " + uri);
- }
- }
- @Nullable
- @Override
- public AssetFileDescriptor openAssetFile(@NonNull Uri uri, @NonNull String mode) {
- final int matchCode = MATCHER.match(uri);
- if (matchCode == STICKERS_ASSET_CODE || matchCode == STICKER_PACK_TRAY_ICON_CODE) {
- try {
- return getImageAsset(uri);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return null;
- }
- @Override
- public String getType(@NonNull Uri uri) {
- final int matchCode = MATCHER.match(uri);
- switch (matchCode) {
- case METADATA_CODE:
- return "vnd.android.cursor.dir/vnd." + BuildConfig.CONTENT_PROVIDER_AUTHORITY + "." + METADATA;
- case METADATA_CODE_FOR_SINGLE_PACK:
- return "vnd.android.cursor.item/vnd." + BuildConfig.CONTENT_PROVIDER_AUTHORITY + "." + METADATA;
- case STICKERS_CODE:
- return "vnd.android.cursor.dir/vnd." + BuildConfig.CONTENT_PROVIDER_AUTHORITY + "." + STICKERS;
- case STICKERS_ASSET_CODE:
- return "image/webp";
- case STICKER_PACK_TRAY_ICON_CODE:
- return "image/png";
- default:
- throw new IllegalArgumentException("Unknown URI: " + uri);
- }
- }
- // private synchronized void readContentFile(@NonNull Context context) {
- //
- // File file_name=context.getExternalFilesDir("contents.json") ;
- // if(file_name.exists()){
- // //Do something
- // Log.i("UnityAndroid","file already exists");
- // try {
- //
- // InputStream inputStream = new FileInputStream((file_name));
- // try (InputStream contentsInputStream = inputStream ) {
- // stickerPackList = ContentFileParser.parseStickerPacks(contentsInputStream);
- // } catch (IOException | IllegalStateException e) {
- // throw new RuntimeException(CONTENT_FILE_NAME + " file has some issues: " + e.getMessage(), e);
- // }
- // }
- // catch(IOException | IllegalStateException e) {
- // throw new RuntimeException(CONTENT_FILE_NAME + " file has some issues: " + e.getMessage(), e);
- // }
- // }
- // else{
- // Log.i("UnityAndroid","file does not exists ,adding new one");
- // try (InputStream contentsInputStream = context.getAssets().open(CONTENT_FILE_NAME)) {
- // stickerPackList = ContentFileParser.parseStickerPacks(contentsInputStream);
- // } catch (IOException | IllegalStateException e) {
- // throw new RuntimeException(CONTENT_FILE_NAME + " file has some issues: " + e.getMessage(), e);
- // }
- // }
- // }
- public synchronized void readContentFile(@NonNull Context context) { //Previosuly working
- File file_name=context.getExternalFilesDir("contents.json") ;
- try {
- InputStream inputStream = new FileInputStream((file_name));
- try (InputStream contentsInputStream = inputStream ) {
- stickerPackList = ContentFileParser.parseStickerPacks(contentsInputStream);
- Log.i("StickerList ", "Read from the list" );
- Log.i("StickerList ", "Image Data Version "+stickerPackList.get(0).imageDataVersion);
- for(int i=0;i<stickerPackList.get(0).getStickers().size();i++){
- Log.i("StickerList " ,"Sticker num "+i+" "+stickerPackList.get(0).getStickers().get(i).imageFileName);
- }
- } catch (IOException | IllegalStateException e) {
- throw new RuntimeException(CONTENT_FILE_NAME + " file has some issues: " + e.getMessage(), e);
- }
- }
- catch(IOException | IllegalStateException e) {
- throw new RuntimeException(CONTENT_FILE_NAME + " file has some issues: " + e.getMessage(), e);
- }
- }
- // private synchronized void readContentImageFile(@NonNull Context context) {
- // try (InputStream contentsInputStream = context.getAssets().open(CONTENT_FILE_NAME)) {
- // stickerPackList = ContentFileParser.parseStickerPacks(contentsInputStream);
- // } catch (IOException | IllegalStateException e) {
- // throw new RuntimeException(CONTENT_FILE_NAME + " file has some issues: " + e.getMessage(), e);
- // }
- // }
- private List<StickerPack> getStickerPackList() {
- // if (stickerPackList == null) {
- readContentFile(Objects.requireNonNull(getContext()));
- // }
- return stickerPackList;
- }
- // private List<StickerPack> getStickerImagePackList() {
- // // if (stickerPackList == null) {
- // readContentImageFile(Objects.requireNonNull(getContext()));
- // // }
- // return stickerPackList;
- // }
- private Cursor getPackForAllStickerPacks(@NonNull Uri uri) {
- return getStickerPackInfo(uri, getStickerPackList());
- }
- private Cursor getCursorForSingleStickerPack(@NonNull Uri uri) {
- final String identifier = uri.getLastPathSegment();
- for (StickerPack stickerPack : getStickerPackList()) {
- if (identifier.equals(stickerPack.identifier)) {
- return getStickerPackInfo(uri, Collections.singletonList(stickerPack));
- }
- }
- return getStickerPackInfo(uri, new ArrayList<StickerPack>()); // Adi
- }
- @NonNull
- private Cursor getStickerPackInfo(@NonNull Uri uri, @NonNull List<StickerPack> stickerPackList) {
- MatrixCursor cursor = new MatrixCursor(
- new String[]{
- STICKER_PACK_IDENTIFIER_IN_QUERY,
- STICKER_PACK_NAME_IN_QUERY,
- STICKER_PACK_PUBLISHER_IN_QUERY,
- STICKER_PACK_ICON_IN_QUERY,
- ANDROID_APP_DOWNLOAD_LINK_IN_QUERY,
- IOS_APP_DOWNLOAD_LINK_IN_QUERY,
- PUBLISHER_EMAIL,
- PUBLISHER_WEBSITE,
- PRIVACY_POLICY_WEBSITE,
- LICENSE_AGREENMENT_WEBSITE,
- IMAGE_DATA_VERSION,
- AVOID_CACHE,
- });
- for (StickerPack stickerPack : stickerPackList) {
- MatrixCursor.RowBuilder builder = cursor.newRow();
- builder.add(stickerPack.identifier);
- builder.add(stickerPack.name);
- builder.add(stickerPack.publisher);
- builder.add(stickerPack.trayImageFile);
- builder.add(stickerPack.androidPlayStoreLink);
- builder.add(stickerPack.iosAppStoreLink);
- builder.add(stickerPack.publisherEmail);
- builder.add(stickerPack.publisherWebsite);
- builder.add(stickerPack.privacyPolicyWebsite);
- builder.add(stickerPack.licenseAgreementWebsite);
- builder.add(stickerPack.imageDataVersion);
- builder.add(stickerPack.avoidCache ? 1 : 0);
- }
- cursor.setNotificationUri(Objects.requireNonNull(getContext()).getContentResolver(), uri);
- return cursor;
- }
- @NonNull
- private Cursor getStickersForAStickerPack(@NonNull Uri uri) {
- final String identifier = uri.getLastPathSegment();
- MatrixCursor cursor = new MatrixCursor(new String[]{STICKER_FILE_NAME_IN_QUERY, STICKER_FILE_EMOJI_IN_QUERY});
- for (StickerPack stickerPack : getStickerPackList()) {
- if (identifier.equals(stickerPack.identifier)) {
- for (Sticker sticker : stickerPack.getStickers()) {
- cursor.addRow(new Object[]{sticker.imageFileName, TextUtils.join(",", sticker.emojis)});
- }
- }
- }
- cursor.setNotificationUri(Objects.requireNonNull(getContext()).getContentResolver(), uri);
- return cursor;
- }
- private AssetFileDescriptor getImageAsset(Uri uri) throws IllegalArgumentException, IOException {
- AssetManager am = Objects.requireNonNull(getContext()).getAssets();
- final List<String> pathSegments = uri.getPathSegments();
- if (pathSegments.size() != 3) {
- throw new IllegalArgumentException("path segments should be 3, uri is: " + uri);
- }
- String fileName = pathSegments.get(pathSegments.size() - 1);
- final String identifier = pathSegments.get(pathSegments.size() - 2);
- if (TextUtils.isEmpty(identifier)) {
- throw new IllegalArgumentException("identifier is empty, uri: " + uri);
- }
- if (TextUtils.isEmpty(fileName)) {
- throw new IllegalArgumentException("file name is empty, uri: " + uri);
- }
- //making sure the file that is trying to be fetched is in the list of stickers.
- for (StickerPack stickerPack : getStickerPackList()) { //Changed
- if (identifier.equals(stickerPack.identifier)) {
- if (fileName.equals(stickerPack.trayImageFile)) {
- return fetchFile(uri, am, fileName, identifier);
- } else {
- for (Sticker sticker : stickerPack.getStickers()) {
- if (fileName.equals(sticker.imageFileName)) {
- return fetchFile(uri, am, fileName, identifier);
- }
- }
- }
- }
- }
- return null;
- }
- // private AssetFileDescriptor fetchFile(@NonNull Uri uri, @NonNull AssetManager am, @NonNull String fileName, @NonNull String identifier) throws IOException {
- // File cacheFile=getContext().getExternalFilesDir("contents.json") ; //
- // //final File cacheFile = getContext().getExternalCacheDir();
- // final File file = new File(cacheFile, "contents.json");
- // try (final InputStream open = am.open(identifier + "/" + fileName);
- // final FileOutputStream fileOutputStream = new FileOutputStream(file)) {
- // byte[] buffer = new byte[1024];
- // int read;
- // while ((read = open.read(buffer)) != -1) {
- // fileOutputStream.write(buffer, 0, read);
- // }
- // }
- //
- // //The code above is basically copying the assets to storage, and servering the file off of the storage.
- // //If you have the files already downloaded/fetched, you could simply replace above part, and initialize the file parameter with your own file which points to the desired file.
- // //The key here is you can use ParcelFileDescriptor to create an AssetFileDescriptor.
- // return new AssetFileDescriptor(ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY), 0, AssetFileDescriptor.UNKNOWN_LENGTH);
- // }
- private AssetFileDescriptor fetchFile(@NonNull Uri uri, @NonNull AssetManager am, @NonNull String fileName, @NonNull String identifier) {
- try {
- return am.openFd(identifier + "/" + fileName);
- } catch (IOException e) {
- Log.e(Objects.requireNonNull(getContext()).getPackageName(), "IOException when getting asset file, uri:" + uri, e);
- return null;
- }
- }
- @Override
- public int delete(@NonNull Uri uri, @Nullable String selection, String[] selectionArgs) {
- throw new UnsupportedOperationException("Not supported");
- }
- @Override
- public Uri insert(@NonNull Uri uri, ContentValues values) {
- throw new UnsupportedOperationException("Not supported");
- }
- @Override
- public int update(@NonNull Uri uri, ContentValues values, String selection,
- String[] selectionArgs) {
- throw new UnsupportedOperationException("Not supported");
- }
- }
Add Comment
Please, Sign In to add comment