├── gradle └── wrapper │ ├── gradle-wrapper.jar │ ├── gradle-wrapper.jar.license │ └── gradle-wrapper.properties ├── fake-store ├── src │ └── main │ │ ├── res │ │ ├── mipmap-hdpi │ │ │ ├── ic_app.png │ │ │ └── ic_app_round.png │ │ ├── mipmap-mdpi │ │ │ ├── ic_app.png │ │ │ └── ic_app_round.png │ │ ├── mipmap-xhdpi │ │ │ ├── ic_app.png │ │ │ └── ic_app_round.png │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_app.png │ │ │ └── ic_app_round.png │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_app.png │ │ │ └── ic_app_round.png │ │ ├── values-v26 │ │ │ └── ic_app_background.xml │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_app_round.xml │ │ │ └── ic_app.xml │ │ ├── values │ │ │ ├── styles.xml │ │ │ └── strings.xml │ │ ├── values-v11 │ │ │ └── styles.xml │ │ └── drawable-v26 │ │ │ ├── ic_app_foreground.xml │ │ │ └── ic_app_foreground_mono.xml │ │ ├── aidl │ │ └── com │ │ │ ├── google │ │ │ └── android │ │ │ │ └── finsky │ │ │ │ └── externalreferrer │ │ │ │ └── IGetInstallReferrerService.aidl │ │ │ └── android │ │ │ └── vending │ │ │ ├── licensing │ │ │ ├── ILicenseV2ResultListener.aidl │ │ │ ├── ILicenseResultListener.aidl │ │ │ └── ILicensingService.aidl │ │ │ └── billing │ │ │ └── IInAppBillingService.aidl │ │ ├── java │ │ ├── com │ │ │ ├── android │ │ │ │ └── vending │ │ │ │ │ ├── GrantFakeSignaturePermissionActivity.java │ │ │ │ │ ├── licensing │ │ │ │ │ └── LicensingService.java │ │ │ │ │ └── billing │ │ │ │ │ └── InAppBillingService.java │ │ │ └── google │ │ │ │ └── android │ │ │ │ └── finsky │ │ │ │ └── externalreferrer │ │ │ │ └── GetInstallReferrerService.java │ │ └── org │ │ │ └── microg │ │ │ └── vending │ │ │ └── ui │ │ │ └── MainActivity.java │ │ └── AndroidManifest.xml └── build.gradle ├── settings.gradle ├── .gitignore ├── .reuse └── dep5 ├── .github └── workflows │ ├── reuse.yml │ └── build.yml ├── fake-signature ├── src │ └── main │ │ ├── aidl │ │ └── com │ │ │ └── huawei │ │ │ └── signature │ │ │ └── diff │ │ │ └── ISignatureService.aidl │ │ ├── res │ │ └── values │ │ │ ├── arrays.xml │ │ │ └── signature.xml │ │ ├── java │ │ └── com │ │ │ └── huawei │ │ │ └── signature │ │ │ └── diff │ │ │ ├── InitReceiver.java │ │ │ ├── InitProvider.java │ │ │ ├── AppListDatabaseOpenHelper.java │ │ │ └── SignatureService.java │ │ └── AndroidManifest.xml └── build.gradle ├── README.md ├── gradlew.bat ├── LICENSES ├── CC0-1.0.txt ├── Apache-2.0.txt └── CC-BY-SA-4.0.txt └── gradlew /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microg/FakeStore/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar.license: -------------------------------------------------------------------------------- 1 | Copyright 2015 the original author or authors. 2 | SPDX-License-Identifier: Apache-2.0 3 | -------------------------------------------------------------------------------- /fake-store/src/main/res/mipmap-hdpi/ic_app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microg/FakeStore/HEAD/fake-store/src/main/res/mipmap-hdpi/ic_app.png -------------------------------------------------------------------------------- /fake-store/src/main/res/mipmap-mdpi/ic_app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microg/FakeStore/HEAD/fake-store/src/main/res/mipmap-mdpi/ic_app.png -------------------------------------------------------------------------------- /fake-store/src/main/res/mipmap-xhdpi/ic_app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microg/FakeStore/HEAD/fake-store/src/main/res/mipmap-xhdpi/ic_app.png -------------------------------------------------------------------------------- /fake-store/src/main/res/mipmap-xxhdpi/ic_app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microg/FakeStore/HEAD/fake-store/src/main/res/mipmap-xxhdpi/ic_app.png -------------------------------------------------------------------------------- /fake-store/src/main/res/mipmap-xxxhdpi/ic_app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microg/FakeStore/HEAD/fake-store/src/main/res/mipmap-xxxhdpi/ic_app.png -------------------------------------------------------------------------------- /fake-store/src/main/res/mipmap-hdpi/ic_app_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microg/FakeStore/HEAD/fake-store/src/main/res/mipmap-hdpi/ic_app_round.png -------------------------------------------------------------------------------- /fake-store/src/main/res/mipmap-mdpi/ic_app_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microg/FakeStore/HEAD/fake-store/src/main/res/mipmap-mdpi/ic_app_round.png -------------------------------------------------------------------------------- /fake-store/src/main/res/mipmap-xhdpi/ic_app_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microg/FakeStore/HEAD/fake-store/src/main/res/mipmap-xhdpi/ic_app_round.png -------------------------------------------------------------------------------- /fake-store/src/main/res/mipmap-xxhdpi/ic_app_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microg/FakeStore/HEAD/fake-store/src/main/res/mipmap-xxhdpi/ic_app_round.png -------------------------------------------------------------------------------- /fake-store/src/main/res/mipmap-xxxhdpi/ic_app_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microg/FakeStore/HEAD/fake-store/src/main/res/mipmap-xxxhdpi/ic_app_round.png -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | /* 2 | * SPDX-FileCopyrightText: 2015 microG Project Team 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | include ':fake-store' 7 | include ':fake-signature' 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2014 microG Project Team 2 | # SPDX-License-Identifier: CC0-1.0 3 | 4 | build/ 5 | .idea/ 6 | .gradle/ 7 | user.gradle 8 | local.properties 9 | *.iml 10 | -------------------------------------------------------------------------------- /.reuse/dep5: -------------------------------------------------------------------------------- 1 | Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ 2 | 3 | Files: fake-store/src/main/res/mipmap-*/*.png 4 | Copyright: 2023 microG Project Team 5 | License: CC-BY-SA-4.0 6 | -------------------------------------------------------------------------------- /fake-store/src/main/res/values-v26/ic_app_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | #C0CA33 9 | -------------------------------------------------------------------------------- /.github/workflows/reuse.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 microG Team 2 | # SPDX-License-Identifier: CC0-1.0 3 | 4 | name: REUSE Compliance Check 5 | on: [pull_request, push] 6 | jobs: 7 | test: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@v2 11 | - uses: fsfe/reuse-action@v1 12 | -------------------------------------------------------------------------------- /fake-store/src/main/aidl/com/google/android/finsky/externalreferrer/IGetInstallReferrerService.aidl: -------------------------------------------------------------------------------- 1 | /* 2 | * SPDX-FileCopyrightText: 2023 microG Project Team 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.google.android.finsky.externalreferrer; 7 | 8 | interface IGetInstallReferrerService { 9 | Bundle getInstallReferrer(in Bundle request); 10 | } -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2015, microG Project Team 2 | # SPDX-License-Identifier: CC0-1.0 3 | 4 | distributionBase=GRADLE_USER_HOME 5 | distributionPath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip 7 | networkTimeout=10000 8 | zipStoreBase=GRADLE_USER_HOME 9 | zipStorePath=wrapper/dists 10 | -------------------------------------------------------------------------------- /fake-store/src/main/aidl/com/android/vending/licensing/ILicenseV2ResultListener.aidl: -------------------------------------------------------------------------------- 1 | /* 2 | * SPDX-FileCopyrightText: 2010 The Android Open Source Project 3 | * SPDX-FileCopyrightText: 2023 microG Project Team 4 | * SPDX-License-Identifier: Apache-2.0 5 | */ 6 | 7 | package com.android.vending.licensing; 8 | 9 | interface ILicenseV2ResultListener { 10 | oneway void verifyLicense(int responseCode, in Bundle responsePayload); 11 | } -------------------------------------------------------------------------------- /fake-store/src/main/aidl/com/android/vending/licensing/ILicenseResultListener.aidl: -------------------------------------------------------------------------------- 1 | /* 2 | * SPDX-FileCopyrightText: 2010 The Android Open Source Project 3 | * SPDX-FileCopyrightText: 2023 microG Project Team 4 | * SPDX-License-Identifier: Apache-2.0 5 | */ 6 | 7 | package com.android.vending.licensing; 8 | 9 | interface ILicenseResultListener { 10 | oneway void verifyLicense(int responseCode, String signedData, String signature); 11 | } -------------------------------------------------------------------------------- /fake-store/src/main/res/mipmap-anydpi-v26/ic_app_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /fake-store/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 12 | 13 | -------------------------------------------------------------------------------- /fake-signature/src/main/aidl/com/huawei/signature/diff/ISignatureService.aidl: -------------------------------------------------------------------------------- 1 | /* 2 | * SPDX-FileCopyrightText: 2023 microG Project Team 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.huawei.signature.diff; 7 | 8 | /** 9 | * Interface for Huawei Differentiated Signature Capability 10 | * See https://forums.developer.huawei.com/forumPortal/en/topic/0202128603315033024 11 | */ 12 | interface ISignatureService { 13 | String[] querySignature(String packageName, boolean suggested); 14 | } -------------------------------------------------------------------------------- /fake-signature/src/main/res/values/arrays.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | com.google.android.gms 9 | com.android.vending 10 | 11 | 12 | com.truecaller 13 | 14 | -------------------------------------------------------------------------------- /fake-store/src/main/res/mipmap-anydpi-v26/ic_app.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /fake-store/src/main/res/values-v11/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 13 | 14 | -------------------------------------------------------------------------------- /fake-store/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | microG Companion 9 | microG Companion cannot be used standalone. Opened microG Services settings instead. 10 | microG Companion cannot be used standalone. Please install microG Services to use microG. 11 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2020 microG Team 2 | # SPDX-License-Identifier: CC0-1.0 3 | 4 | name: Build 5 | on: [pull_request, push] 6 | jobs: 7 | build: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@v2 11 | with: 12 | fetch-depth: 0 13 | - uses: actions/setup-java@v3 14 | with: 15 | distribution: adopt 16 | java-version: 17 17 | cache: gradle 18 | - run: ./gradlew --no-daemon build 19 | env: 20 | TERM: dumb 21 | JAVA_OPTS: -Xmx2048m 22 | -------------------------------------------------------------------------------- /fake-signature/build.gradle: -------------------------------------------------------------------------------- 1 | /* 2 | * SPDX-FileCopyrightText: 2023 microG Project Team 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | apply plugin: 'com.android.library' 7 | 8 | android { 9 | namespace 'org.microg.signature.fake' 10 | compileSdk androidCompileSdk 11 | 12 | defaultConfig { 13 | minSdk androidMinSdk 14 | targetSdk androidTargetSdk 15 | } 16 | 17 | buildFeatures { 18 | aidl = true 19 | } 20 | 21 | compileOptions { 22 | sourceCompatibility JavaVersion.VERSION_1_8 23 | targetCompatibility JavaVersion.VERSION_1_8 24 | } 25 | } 26 | 27 | dependencies { 28 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 5 | 6 | FakeStore 7 | ========= 8 | An empty package that mocks the existence of the Google Play Store to the Play Services client. 9 | Requires the FAKE_PACKAGE_SIGNATURE patch to be functional. 10 | 11 | License 12 | ------- 13 | - Code is licensed under [Apache License 2.0](LICENSES/Apache-2.0) 14 | - Documentation and artwork are licensed under [Creative Commons Attribution-ShareAlike 4.0](LICENSES/CC-BY-SA-4.0) 15 | - Some files are placed unter the public domain using [Creative Commons CC0 1.0 Public Domain Dedication](LICENSES/CCO-1.0) 16 | -------------------------------------------------------------------------------- /fake-store/src/main/aidl/com/android/vending/licensing/ILicensingService.aidl: -------------------------------------------------------------------------------- 1 | /* 2 | * SPDX-FileCopyrightText: 2010 The Android Open Source Project 3 | * SPDX-FileCopyrightText: 2023 microG Project Team 4 | * SPDX-License-Identifier: Apache-2.0 5 | */ 6 | 7 | package com.android.vending.licensing; 8 | 9 | import com.android.vending.licensing.ILicenseResultListener; 10 | import com.android.vending.licensing.ILicenseV2ResultListener; 11 | 12 | interface ILicensingService { 13 | oneway void checkLicense(long nonce, String packageName, ILicenseResultListener listener); 14 | oneway void checkLicenseV2(String packageName, ILicenseV2ResultListener listener, in Bundle extraParams); 15 | 16 | } -------------------------------------------------------------------------------- /fake-signature/src/main/java/com/huawei/signature/diff/InitReceiver.java: -------------------------------------------------------------------------------- 1 | /* 2 | * SPDX-FileCopyrightText: 2023 microG Project Team 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.huawei.signature.diff; 7 | 8 | import android.annotation.SuppressLint; 9 | import android.content.BroadcastReceiver; 10 | import android.content.Context; 11 | import android.content.Intent; 12 | 13 | /** 14 | * This is to make sure the process is initialized at boot. 15 | */ 16 | public class InitReceiver extends BroadcastReceiver { 17 | @SuppressLint("UnsafeProtectedBroadcastReceiver") 18 | @Override 19 | public void onReceive(Context context, Intent intent) { 20 | // We don't need to do anything, the process is already started. 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /fake-store/build.gradle: -------------------------------------------------------------------------------- 1 | /* 2 | * SPDX-FileCopyrightText: 2015 microG Project Team 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | apply plugin: 'com.android.application' 7 | 8 | android { 9 | namespace "com.android.vending" 10 | compileSdkVersion androidCompileSdk 11 | buildToolsVersion "$androidBuildVersionTools" 12 | 13 | defaultConfig { 14 | versionName version 15 | versionCode appVersionCode 16 | minSdkVersion androidMinSdk 17 | targetSdkVersion androidTargetSdk 18 | } 19 | 20 | buildFeatures { 21 | aidl = true 22 | } 23 | 24 | compileOptions { 25 | sourceCompatibility JavaVersion.VERSION_1_8 26 | targetCompatibility JavaVersion.VERSION_1_8 27 | } 28 | } 29 | 30 | dependencies { 31 | implementation project(':fake-signature') 32 | } 33 | 34 | if (file('user.gradle').exists()) { 35 | apply from: 'user.gradle' 36 | } 37 | -------------------------------------------------------------------------------- /fake-store/src/main/java/com/android/vending/GrantFakeSignaturePermissionActivity.java: -------------------------------------------------------------------------------- 1 | /* 2 | * SPDX-FileCopyrightText: 2016 microG Project Team 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.android.vending; 7 | 8 | import android.annotation.TargetApi; 9 | import android.app.Activity; 10 | import android.content.pm.PackageManager; 11 | import android.os.Build; 12 | import android.os.Bundle; 13 | 14 | @TargetApi(Build.VERSION_CODES.M) 15 | public class GrantFakeSignaturePermissionActivity extends Activity { 16 | @Override 17 | protected void onCreate(Bundle savedInstanceState) { 18 | super.onCreate(savedInstanceState); 19 | if (checkSelfPermission("android.permission.FAKE_PACKAGE_SIGNATURE") != PackageManager.PERMISSION_GRANTED) { 20 | requestPermissions(new String[]{"android.permission.FAKE_PACKAGE_SIGNATURE"}, 1); 21 | } else { 22 | setResult(RESULT_OK); 23 | finish(); 24 | } 25 | } 26 | 27 | @Override 28 | public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 29 | if (requestCode == 1 && grantResults.length == 1) { 30 | setResult(grantResults[0] == PackageManager.PERMISSION_GRANTED ? RESULT_OK : RESULT_CANCELED); 31 | finish(); 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /fake-store/src/main/java/com/android/vending/licensing/LicensingService.java: -------------------------------------------------------------------------------- 1 | /* 2 | * SPDX-FileCopyrightText: 2023 microG Project Team 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.android.vending.licensing; 7 | 8 | import android.app.Service; 9 | import android.content.Intent; 10 | import android.os.Bundle; 11 | import android.os.IBinder; 12 | import android.os.RemoteException; 13 | import android.util.Log; 14 | 15 | public class LicensingService extends Service { 16 | private static final String TAG = "FakeLicenseService"; 17 | 18 | private final ILicensingService.Stub mLicenseService = new ILicensingService.Stub() { 19 | 20 | @Override 21 | public void checkLicense(long nonce, String packageName, ILicenseResultListener listener) throws RemoteException { 22 | Log.d(TAG, "checkLicense(" + nonce + ", " + packageName + ")"); 23 | // We don't return anything yet. Seems to work good for some checkers. 24 | } 25 | 26 | @Override 27 | public void checkLicenseV2(String packageName, ILicenseV2ResultListener listener, Bundle extraParams) throws RemoteException { 28 | Log.d(TAG, "checkLicenseV2(" + packageName + ", " + extraParams + ")"); 29 | // We don't return anything yet. Seems to work good for some checkers. 30 | } 31 | }; 32 | 33 | public IBinder onBind(Intent intent) { 34 | return mLicenseService; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /fake-store/src/main/java/org/microg/vending/ui/MainActivity.java: -------------------------------------------------------------------------------- 1 | /* 2 | * SPDX-FileCopyrightText: 2023 microG Project Team 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package org.microg.vending.ui; 7 | 8 | import android.app.Activity; 9 | import android.content.Intent; 10 | import android.os.Bundle; 11 | import android.util.Log; 12 | import android.widget.Toast; 13 | import com.android.vending.R; 14 | 15 | public class MainActivity extends Activity { 16 | private static final String TAG = "MainActivity"; 17 | private static final String GMS_PACKAGE_NAME = "com.google.android.gms"; 18 | 19 | @Override 20 | protected void onCreate(Bundle savedInstanceState) { 21 | super.onCreate(savedInstanceState); 22 | try { 23 | Intent intent = new Intent(Intent.ACTION_MAIN); 24 | intent.setPackage(GMS_PACKAGE_NAME); 25 | try { 26 | startActivity(intent); 27 | } catch (Exception e) { 28 | Log.w(TAG, "MAIN activity is not DEFAULT. Trying to resolve instead."); 29 | intent.setClassName(GMS_PACKAGE_NAME, getPackageManager().resolveActivity(intent, 0).activityInfo.name); 30 | startActivity(intent); 31 | } 32 | Toast.makeText(this, R.string.toast_installed, Toast.LENGTH_LONG).show(); 33 | } catch (Exception e) { 34 | Log.w(TAG, "Failed launching microG Settings", e); 35 | Toast.makeText(this, R.string.toast_not_installed, Toast.LENGTH_LONG).show(); 36 | } 37 | finish(); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /fake-store/src/main/java/com/google/android/finsky/externalreferrer/GetInstallReferrerService.java: -------------------------------------------------------------------------------- 1 | /* 2 | * SPDX-FileCopyrightText: 2023 microG Project Team 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.google.android.finsky.externalreferrer; 7 | 8 | import android.app.Service; 9 | import android.content.Intent; 10 | import android.os.Bundle; 11 | import android.os.IBinder; 12 | import android.os.RemoteException; 13 | 14 | public class GetInstallReferrerService extends Service { 15 | private static final String TAG = "FakeReferrerService"; 16 | 17 | private final IGetInstallReferrerService.Stub service = new IGetInstallReferrerService.Stub() { 18 | // https://developer.android.com/google/play/installreferrer/igetinstallreferrerservice 19 | @Override 20 | public Bundle getInstallReferrer(Bundle request) throws RemoteException { 21 | String packageName = request.getString("package_name"); 22 | Bundle result = new Bundle(); 23 | result.putString("install_referrer", "https://play.google.com/store/apps/details?utm_source=google-play&utm_medium=organic&id="+packageName); 24 | result.putLong("referrer_click_timestamp_seconds", 0); 25 | result.putLong("referrer_click_timestamp_server_seconds", 0); 26 | result.putLong("install_begin_timestamp_seconds", 0); 27 | result.putLong("install_begin_timestamp_server_seconds", 0); 28 | result.putString("install_version", null); 29 | result.putBoolean("google_play_instant", false); 30 | return result; 31 | } 32 | }; 33 | 34 | @Override 35 | public IBinder onBind(Intent intent) { 36 | return service.asBinder(); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /fake-store/src/main/res/drawable-v26/ic_app_foreground.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 17 | 23 | 29 | 35 | 41 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /fake-store/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 11 | 12 | 17 | 18 | 22 | 23 | 26 | 27 | 28 | 29 | 30 | 31 | 34 | 35 | 36 | 37 | 38 | 39 | 42 | 43 | 44 | 45 | 46 | 47 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /fake-store/src/main/res/drawable-v26/ic_app_foreground_mono.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 17 | 24 | 32 | 40 | 48 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /fake-signature/src/main/java/com/huawei/signature/diff/InitProvider.java: -------------------------------------------------------------------------------- 1 | /* 2 | * SPDX-FileCopyrightText: 2023 microG Project Team 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.huawei.signature.diff; 7 | 8 | import android.app.ActivityManager; 9 | import android.content.ContentProvider; 10 | import android.content.ContentValues; 11 | import android.content.Context; 12 | import android.content.Intent; 13 | import android.database.Cursor; 14 | import android.net.Uri; 15 | import android.util.Log; 16 | import java.util.List; 17 | 18 | public class InitProvider extends ContentProvider { 19 | private static final String TAG = InitProvider.class.getSimpleName(); 20 | 21 | @Override 22 | public boolean onCreate() { 23 | Log.d(TAG, "onCreate"); 24 | if (!isServiceRunning(getContext(), getContext().getPackageName(), SignatureService.class.getName())) { 25 | Intent intent = new Intent(getContext(), SignatureService.class); 26 | try { 27 | getContext().startService(intent); 28 | } catch (Exception ignored) { 29 | } 30 | } 31 | return false; 32 | } 33 | 34 | private boolean isServiceRunning(Context context, String packageName, String serviceName) { 35 | ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 36 | List serviceInfoList = manager.getRunningServices(Integer.MAX_VALUE); 37 | if (serviceInfoList == null) { 38 | return false; 39 | } 40 | for (ActivityManager.RunningServiceInfo info : serviceInfoList) { 41 | if (info.service.getPackageName().equals(packageName) && info.service.getClassName().equals(serviceName)) { 42 | return true; 43 | } 44 | } 45 | return false; 46 | } 47 | 48 | @Override 49 | public int delete(Uri uri, String selection, String[] selectionArgs) { 50 | return 0; 51 | } 52 | 53 | @Override 54 | public String getType(Uri uri) { 55 | return null; 56 | } 57 | 58 | @Override 59 | public Uri insert(Uri uri, ContentValues values) { 60 | return null; 61 | } 62 | 63 | @Override 64 | public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { 65 | return null; 66 | } 67 | 68 | @Override 69 | public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { 70 | return 0; 71 | } 72 | } -------------------------------------------------------------------------------- /fake-signature/src/main/java/com/huawei/signature/diff/AppListDatabaseOpenHelper.java: -------------------------------------------------------------------------------- 1 | /* 2 | * SPDX-FileCopyrightText: 2023 microG Project Team 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.huawei.signature.diff; 7 | 8 | import android.content.ContentValues; 9 | import android.content.Context; 10 | import android.database.sqlite.SQLiteDatabase; 11 | import android.database.sqlite.SQLiteOpenHelper; 12 | import android.util.Log; 13 | import org.microg.signature.fake.R; 14 | 15 | public class AppListDatabaseOpenHelper extends SQLiteOpenHelper { 16 | private static final String TAG = AppListDatabaseOpenHelper.class.getSimpleName(); 17 | private static final String DATABASE_NAME = "app_list.db"; 18 | public static final String TABLE_APPLIST = "applist"; 19 | public static final String COLUMN_NAME = "name"; 20 | public static final String COLUMN_FAKE = "fake"; 21 | private static final int DATABASE_VERSION = 2; 22 | private static final String DROP_APP_LIST_TABLE = "DROP TABLE IF EXISTS " + TABLE_APPLIST; 23 | private static final String CREATE_APP_LIST_TABLE = "CREATE TABLE IF NOT EXISTS " + TABLE_APPLIST + "(" + 24 | COLUMN_NAME + " VARCHAR(255) PRIMARY KEY, " + 25 | COLUMN_FAKE + " INTEGER CHECK(" + COLUMN_FAKE + " >= 0 and " + COLUMN_FAKE + " <= 1)" + 26 | ")"; 27 | private final Context context; 28 | 29 | public AppListDatabaseOpenHelper(Context context) { 30 | super(context, DATABASE_NAME, null, DATABASE_VERSION); 31 | this.context = context; 32 | } 33 | 34 | @Override 35 | public void onCreate(SQLiteDatabase db) { 36 | Log.d(TAG, "onCreate"); 37 | db.execSQL(DROP_APP_LIST_TABLE); 38 | db.execSQL(CREATE_APP_LIST_TABLE); 39 | initData(db); 40 | } 41 | 42 | @Override 43 | public void onOpen(SQLiteDatabase db) { 44 | super.onOpen(db); 45 | initData(db); 46 | } 47 | 48 | private void initData(SQLiteDatabase db) { 49 | String[] wantFakeApps = context.getResources().getStringArray(R.array.signature_want_fake); 50 | String[] neverFakeApps = context.getResources().getStringArray(R.array.signature_never_fake); 51 | if (wantFakeApps.length == 0 && neverFakeApps.length == 0) { 52 | return; 53 | } 54 | for (String app : wantFakeApps) { 55 | db.insertWithOnConflict(TABLE_APPLIST, null, generateValues(app, true), SQLiteDatabase.CONFLICT_IGNORE); 56 | } 57 | for (String app : neverFakeApps) { 58 | db.insertWithOnConflict(TABLE_APPLIST, null, generateValues(app, false), SQLiteDatabase.CONFLICT_IGNORE); 59 | } 60 | } 61 | 62 | private ContentValues generateValues(String packageName, boolean fake) { 63 | ContentValues contentValues = new ContentValues(); 64 | contentValues.put(COLUMN_NAME, packageName); 65 | contentValues.put(COLUMN_FAKE, fake ? 1 : 0); 66 | return contentValues; 67 | } 68 | 69 | @Override 70 | public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 71 | onCreate(db); 72 | } 73 | } -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem SPDX-License-Identifier: Apache-2.0 2 | @rem 3 | @rem Copyright 2015 the original author or authors. 4 | @rem 5 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 6 | @rem you may not use this file except in compliance with the License. 7 | @rem You may obtain a copy of the License at 8 | @rem 9 | @rem https://www.apache.org/licenses/LICENSE-2.0 10 | @rem 11 | @rem Unless required by applicable law or agreed to in writing, software 12 | @rem distributed under the License is distributed on an "AS IS" BASIS, 13 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | @rem See the License for the specific language governing permissions and 15 | @rem limitations under the License. 16 | @rem 17 | 18 | @if "%DEBUG%"=="" @echo off 19 | @rem ########################################################################## 20 | @rem 21 | @rem Gradle startup script for Windows 22 | @rem 23 | @rem ########################################################################## 24 | 25 | @rem Set local scope for the variables with windows NT shell 26 | if "%OS%"=="Windows_NT" setlocal 27 | 28 | set DIRNAME=%~dp0 29 | if "%DIRNAME%"=="" set DIRNAME=. 30 | @rem This is normally unused 31 | set APP_BASE_NAME=%~n0 32 | set APP_HOME=%DIRNAME% 33 | 34 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 35 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 36 | 37 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 38 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 39 | 40 | @rem Find java.exe 41 | if defined JAVA_HOME goto findJavaFromJavaHome 42 | 43 | set JAVA_EXE=java.exe 44 | %JAVA_EXE% -version >NUL 2>&1 45 | if %ERRORLEVEL% equ 0 goto execute 46 | 47 | echo. 48 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 49 | echo. 50 | echo Please set the JAVA_HOME variable in your environment to match the 51 | echo location of your Java installation. 52 | 53 | goto fail 54 | 55 | :findJavaFromJavaHome 56 | set JAVA_HOME=%JAVA_HOME:"=% 57 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 58 | 59 | if exist "%JAVA_EXE%" goto execute 60 | 61 | echo. 62 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 63 | echo. 64 | echo Please set the JAVA_HOME variable in your environment to match the 65 | echo location of your Java installation. 66 | 67 | goto fail 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | 75 | @rem Execute Gradle 76 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 77 | 78 | :end 79 | @rem End local scope for the variables with windows NT shell 80 | if %ERRORLEVEL% equ 0 goto mainEnd 81 | 82 | :fail 83 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 84 | rem the _cmd.exe /c_ return code! 85 | set EXIT_CODE=%ERRORLEVEL% 86 | if %EXIT_CODE% equ 0 set EXIT_CODE=1 87 | if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% 88 | exit /b %EXIT_CODE% 89 | 90 | :mainEnd 91 | if "%OS%"=="Windows_NT" endlocal 92 | 93 | :omega 94 | -------------------------------------------------------------------------------- /fake-signature/src/main/res/values/signature.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 308204433082032ba003020102020900c2e08746644a308d300d06092a864886f70d01010405003074310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d4d6f756e7461696e205669657731143012060355040a130b476f6f676c6520496e632e3110300e060355040b1307416e64726f69643110300e06035504031307416e64726f6964301e170d3038303832313233313333345a170d3336303130373233313333345a3074310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d4d6f756e7461696e205669657731143012060355040a130b476f6f676c6520496e632e3110300e060355040b1307416e64726f69643110300e06035504031307416e64726f696430820120300d06092a864886f70d01010105000382010d00308201080282010100ab562e00d83ba208ae0a966f124e29da11f2ab56d08f58e2cca91303e9b754d372f640a71b1dcb130967624e4656a7776a92193db2e5bfb724a91e77188b0e6a47a43b33d9609b77183145ccdf7b2e586674c9e1565b1f4c6a5955bff251a63dabf9c55c27222252e875e4f8154a645f897168c0b1bfc612eabf785769bb34aa7984dc7e2ea2764cae8307d8c17154d7ee5f64a51a44a602c249054157dc02cd5f5c0e55fbef8519fbe327f0b1511692c5a06f19d18385f5c4dbc2d6b93f68cc2979c70e18ab93866b3bd5db8999552a0e3b4c99df58fb918bedc182ba35e003c1b4b10dd244a8ee24fffd333872ab5221985edab0fc0d0b145b6aa192858e79020103a381d93081d6301d0603551d0e04160414c77d8cc2211756259a7fd382df6be398e4d786a53081a60603551d2304819e30819b8014c77d8cc2211756259a7fd382df6be398e4d786a5a178a4763074310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d4d6f756e7461696e205669657731143012060355040a130b476f6f676c6520496e632e3110300e060355040b1307416e64726f69643110300e06035504031307416e64726f6964820900c2e08746644a308d300c0603551d13040530030101ff300d06092a864886f70d010104050003820101006dd252ceef85302c360aaace939bcff2cca904bb5d7a1661f8ae46b2994204d0ff4a68c7ed1a531ec4595a623ce60763b167297a7ae35712c407f208f0cb109429124d7b106219c084ca3eb3f9ad5fb871ef92269a8be28bf16d44c8d9a08e6cb2f005bb3fe2cb96447e868e731076ad45b33f6009ea19c161e62641aa99271dfd5228c5c587875ddb7f452758d661f6cc0cccb7352e424cc4365c523532f7325137593c4ae341f4db41edda0d0b1071a7c440f0fe9ea01cb627ca674369d084bd2fd911ff06cdbf2cfa10dc0f893ae35762919048c7efc64c7144178342f70581c9de573af55b390dd7fdb9418631895d5f759f30112687ff621410c069308a 10 | 11 | 12 | 308202ed308201d5a003020102020426ffa009300d06092a864886f70d01010b05003027310b300906035504061302444531183016060355040a130f4e4f47415050532050726f6a656374301e170d3132313030363132303533325a170d3337303933303132303533325a3027310b300906035504061302444531183016060355040a130f4e4f47415050532050726f6a65637430820122300d06092a864886f70d01010105000382010f003082010a02820101009a8d2a5336b0eaaad89ce447828c7753b157459b79e3215dc962ca48f58c2cd7650df67d2dd7bda0880c682791f32b35c504e43e77b43c3e4e541f86e35a8293a54fb46e6b16af54d3a4eda458f1a7c8bc1b7479861ca7043337180e40079d9cdccb7e051ada9b6c88c9ec635541e2ebf0842521c3024c826f6fd6db6fd117c74e859d5af4db04448965ab5469b71ce719939a06ef30580f50febf96c474a7d265bb63f86a822ff7b643de6b76e966a18553c2858416cf3309dd24278374bdd82b4404ef6f7f122cec93859351fc6e5ea947e3ceb9d67374fe970e593e5cd05c905e1d24f5a5484f4aadef766e498adf64f7cf04bddd602ae8137b6eea40722d0203010001a321301f301d0603551d0e04160414110b7aa9ebc840b20399f69a431f4dba6ac42a64300d06092a864886f70d01010b0500038201010007c32ad893349cf86952fb5a49cfdc9b13f5e3c800aece77b2e7e0e9c83e34052f140f357ec7e6f4b432dc1ed542218a14835acd2df2deea7efd3fd5e8f1c34e1fb39ec6a427c6e6f4178b609b369040ac1f8844b789f3694dc640de06e44b247afed11637173f36f5886170fafd74954049858c6096308fc93c1bc4dd5685fa7a1f982a422f2a3b36baa8c9500474cf2af91c39cbec1bc898d10194d368aa5e91f1137ec115087c31962d8f76cd120d28c249cf76f4c70f5baa08c70a7234ce4123be080cee789477401965cfe537b924ef36747e8caca62dfefdd1a6288dcb1c4fd2aaa6131a7ad254e9742022cfd597d2ca5c660ce9e41ff537e5a4041e37 13 | 14 | -------------------------------------------------------------------------------- /fake-signature/src/main/java/com/huawei/signature/diff/SignatureService.java: -------------------------------------------------------------------------------- 1 | /* 2 | * SPDX-FileCopyrightText: 2023 microG Project Team 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.huawei.signature.diff; 7 | 8 | import static com.huawei.signature.diff.AppListDatabaseOpenHelper.COLUMN_NAME; 9 | import static com.huawei.signature.diff.AppListDatabaseOpenHelper.TABLE_APPLIST; 10 | 11 | import android.app.Service; 12 | import android.content.Intent; 13 | import android.database.Cursor; 14 | import android.database.sqlite.SQLiteDatabase; 15 | import android.os.Binder; 16 | import android.os.IBinder; 17 | import android.os.Parcel; 18 | import android.os.RemoteException; 19 | import android.util.Log; 20 | import org.microg.signature.fake.R; 21 | 22 | import java.io.FileDescriptor; 23 | import java.io.PrintWriter; 24 | import java.util.Date; 25 | 26 | public class SignatureService extends Service { 27 | private static final String TAG = "SignatureService"; 28 | private SQLiteDatabase database; 29 | private AppListDatabaseOpenHelper openHelper; 30 | private long start; 31 | 32 | @Override 33 | public void onCreate() { 34 | super.onCreate(); 35 | this.openHelper = new AppListDatabaseOpenHelper(this); 36 | this.database = openHelper.getReadableDatabase(); 37 | this.start = System.currentTimeMillis(); 38 | } 39 | 40 | @Override 41 | public int onStartCommand(Intent intent, int flags, int startId) { 42 | Log.i(TAG, "onStartCommand"); 43 | return START_STICKY; 44 | } 45 | 46 | 47 | @Override 48 | public IBinder onBind(Intent intent) { 49 | return binder; 50 | } 51 | 52 | @Override 53 | public void onDestroy() { 54 | this.openHelper.close(); 55 | super.onDestroy(); 56 | } 57 | 58 | @Override 59 | protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) { 60 | writer.println("Started: " + new Date(start)); 61 | } 62 | 63 | private final ISignatureService.Stub binder = new ISignatureService.Stub() { 64 | 65 | @Override 66 | public boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { 67 | if (Binder.getCallingPid() > 10000) { 68 | Log.w(TAG, "Illegal access from app"); 69 | reply.writeException(new UnsupportedOperationException("Illegal")); 70 | return true; 71 | } 72 | return super.onTransact(code, data, reply, flags); 73 | } 74 | 75 | @Override 76 | public String[] querySignature(String packageName, boolean suggested) throws RemoteException { 77 | try (Cursor cursor = database.query(TABLE_APPLIST, null, COLUMN_NAME + "=?", 78 | new String[]{packageName}, null, null, null)) { 79 | switch (cursor.getCount()) { 80 | case 0: 81 | return getResult(suggested); 82 | case 1: 83 | if (cursor.moveToFirst()) { 84 | int shouldFake = cursor.getInt(1); 85 | return getResult(shouldFake == 1); 86 | } 87 | break; 88 | default: 89 | throw new IllegalArgumentException("result size: " + cursor.getCount()); 90 | } 91 | 92 | } catch (Exception e) { 93 | Log.w(TAG, e); 94 | } 95 | return getResult(false); 96 | } 97 | 98 | private String[] getResult(boolean useFakeSignature) { 99 | if (useFakeSignature) { 100 | return new String[]{getString(R.string.fake_signature),}; 101 | } else { 102 | return new String[]{getString(R.string.real_signature),}; 103 | } 104 | } 105 | }; 106 | } -------------------------------------------------------------------------------- /fake-store/src/main/java/com/android/vending/billing/InAppBillingService.java: -------------------------------------------------------------------------------- 1 | /* 2 | * SPDX-FileCopyrightText: 2016 microG Project Team 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.android.vending.billing; 7 | 8 | import android.app.Service; 9 | import android.content.Intent; 10 | import android.os.Bundle; 11 | import android.os.IBinder; 12 | import android.os.Parcel; 13 | import android.os.RemoteException; 14 | import android.util.Log; 15 | 16 | import java.util.ArrayList; 17 | import java.util.List; 18 | 19 | public class InAppBillingService extends Service { 20 | private static final String TAG = "FakeInAppStore"; 21 | 22 | private final IInAppBillingService.Stub mInAppBillingService = new IInAppBillingService.Stub() { 23 | @Override 24 | public int isBillingSupported(int apiVersion, String packageName, String type) throws RemoteException { 25 | return isBillingSupportedV7(apiVersion, packageName, type, new Bundle()); 26 | } 27 | 28 | @Override 29 | public Bundle getSkuDetails(int apiVersion, String packageName, String type, Bundle skusBundle) throws RemoteException { 30 | return getSkuDetailsV10(apiVersion, packageName, type, skusBundle, new Bundle()); 31 | } 32 | 33 | @Override 34 | public Bundle getBuyIntent(int apiVersion, String packageName, String sku, String type, String developerPayload) throws RemoteException { 35 | return getBuyIntentV6(apiVersion, packageName, sku, type, developerPayload, new Bundle()); 36 | } 37 | 38 | @Override 39 | public Bundle getPurchases(int apiVersion, String packageName, String type, String continuationToken) throws RemoteException { 40 | return getPurchasesV6(apiVersion, packageName, type, continuationToken, new Bundle()); 41 | } 42 | 43 | @Override 44 | public int consumePurchase(int apiVersion, String packageName, String purchaseToken) throws RemoteException { 45 | return consumePurchaseV9(apiVersion, packageName, purchaseToken, new Bundle()).getInt("RESPONSE_CODE", 8); 46 | } 47 | 48 | @Override 49 | public Bundle getBuyIntentToReplaceSkus(int apiVersion, String packageName, List oldSkus, String newSku, String type, String developerPayload) throws RemoteException { 50 | Log.d(TAG, "getBuyIntentToReplaceSkus(" + apiVersion + ", " + packageName + ", " + newSku + ", " + type + ", " + developerPayload + ")"); 51 | Bundle data = new Bundle(); 52 | data.putInt("RESPONSE_CODE", 4); 53 | return data; 54 | } 55 | 56 | @Override 57 | public Bundle getBuyIntentV6(int apiVersion, String packageName, String sku, String type, String developerPayload, Bundle extras) throws RemoteException { 58 | Log.d(TAG, "getBuyIntent(" + apiVersion + ", " + packageName + ", " + sku + ", " + type + ", " + developerPayload + ")"); 59 | Bundle data = new Bundle(); 60 | data.putInt("RESPONSE_CODE", 4); 61 | return data; 62 | } 63 | 64 | @Override 65 | public Bundle getPurchasesV6(int apiVersion, String packageName, String type, String continuationToken, Bundle extras) throws RemoteException { 66 | return getPurchasesV9(apiVersion, packageName, type, continuationToken, extras); 67 | } 68 | 69 | @Override 70 | public int isBillingSupportedV7(int apiVersion, String packageName, String type, Bundle extras) throws RemoteException { 71 | Log.d(TAG, "isBillingSupported(" + apiVersion + ", " + packageName + ", " + type + ")"); 72 | return 0; 73 | } 74 | 75 | @Override 76 | public Bundle getPurchasesV9(int apiVersion, String packageName, String type, String continuationToken, Bundle extras) throws RemoteException { 77 | Log.d(TAG, "getPurchases(" + apiVersion + ", " + packageName + ", " + type + ", " + continuationToken + ")"); 78 | Bundle data = new Bundle(); 79 | data.putInt("RESPONSE_CODE", 0); 80 | data.putStringArrayList("INAPP_PURCHASE_ITEM_LIST", new ArrayList()); 81 | data.putStringArrayList("INAPP_PURCHASE_DATA_LIST", new ArrayList()); 82 | data.putStringArrayList("INAPP_DATA_SIGNATURE_LIST", new ArrayList()); 83 | return data; 84 | } 85 | 86 | @Override 87 | public Bundle consumePurchaseV9(int apiVersion, String packageName, String purchaseToken, Bundle extras) throws RemoteException { 88 | Log.d(TAG, "consumePurchase(" + apiVersion + ", " + packageName + ", " + purchaseToken + ")"); 89 | Bundle data = new Bundle(); 90 | data.putInt("RESPONSE_CODE", 8); 91 | return data; 92 | } 93 | 94 | @Override 95 | public Bundle getPriceChangeConfirmationIntent(int apiVersion, String packageName, String sku, String type, Bundle extras) throws RemoteException { 96 | Log.d(TAG, "getPriceChangeConfirmationIntent(" + apiVersion + ", " + packageName + ", " + sku + ", " + type + ")"); 97 | Bundle data = new Bundle(); 98 | data.putInt("RESPONSE_CODE", 4); 99 | return data; 100 | } 101 | 102 | @Override 103 | public Bundle getSkuDetailsV10(int apiVersion, String packageName, String type, Bundle skuBundle, Bundle extras) throws RemoteException { 104 | Log.d(TAG, "getSkuDetails(" + apiVersion + ", " + packageName + ", " + type + ")"); 105 | Bundle data = new Bundle(); 106 | data.putInt("RESPONSE_CODE", 0); 107 | data.putStringArrayList("DETAILS_LIST", new ArrayList()); 108 | return data; 109 | } 110 | 111 | @Override 112 | public Bundle acknowledgePurchase(int apiVersion, String packageName, String purchaseToken, Bundle extras) throws RemoteException { 113 | Log.d(TAG, "acknowledgePurchase(" + apiVersion + ", " + packageName + ", " + purchaseToken + ")"); 114 | Bundle data = new Bundle(); 115 | data.putInt("RESPONSE_CODE", 8); 116 | return data; 117 | } 118 | 119 | @Override 120 | public boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { 121 | if (super.onTransact(code, data, reply, flags)) return true; 122 | Log.d(TAG, "onTransact [unknown]: " + code + ", " + data + ", " + flags); 123 | return false; 124 | } 125 | }; 126 | 127 | public IBinder onBind(Intent intent) { 128 | return mInAppBillingService; 129 | } 130 | } 131 | -------------------------------------------------------------------------------- /LICENSES/CC0-1.0.txt: -------------------------------------------------------------------------------- 1 | Creative Commons Legal Code 2 | 3 | CC0 1.0 Universal CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES 4 | NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE 5 | AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION 6 | ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE USE 7 | OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS 8 | LIABILITY FOR DAMAGES RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION 9 | OR WORKS PROVIDED HEREUNDER. 10 | 11 | Statement of Purpose 12 | 13 | The laws of most jurisdictions throughout the world automatically confer exclusive 14 | Copyright and Related Rights (defined below) upon the creator and subsequent 15 | owner(s) (each and all, an "owner") of an original work of authorship and/or 16 | a database (each, a "Work"). 17 | 18 | Certain owners wish to permanently relinquish those rights to a Work for the 19 | purpose of contributing to a commons of creative, cultural and scientific 20 | works ("Commons") that the public can reliably and without fear of later claims 21 | of infringement build upon, modify, incorporate in other works, reuse and 22 | redistribute as freely as possible in any form whatsoever and for any purposes, 23 | including without limitation commercial purposes. These owners may contribute 24 | to the Commons to promote the ideal of a free culture and the further production 25 | of creative, cultural and scientific works, or to gain reputation or greater 26 | distribution for their Work in part through the use and efforts of others. 27 | 28 | For these and/or other purposes and motivations, and without any expectation 29 | of additional consideration or compensation, the person associating CC0 with 30 | a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright 31 | and Related Rights in the Work, voluntarily elects to apply CC0 to the Work 32 | and publicly distribute the Work under its terms, with knowledge of his or 33 | her Copyright and Related Rights in the Work and the meaning and intended 34 | legal effect of CC0 on those rights. 35 | 36 | 1. Copyright and Related Rights. A Work made available under CC0 may be protected 37 | by copyright and related or neighboring rights ("Copyright and Related Rights"). 38 | Copyright and Related Rights include, but are not limited to, the following: 39 | 40 | i. the right to reproduce, adapt, distribute, perform, display, communicate, 41 | and translate a Work; 42 | 43 | ii. moral rights retained by the original author(s) and/or performer(s); 44 | 45 | iii. publicity and privacy rights pertaining to a person's image or likeness 46 | depicted in a Work; 47 | 48 | iv. rights protecting against unfair competition in regards to a Work, subject 49 | to the limitations in paragraph 4(a), below; 50 | 51 | v. rights protecting the extraction, dissemination, use and reuse of data 52 | in a Work; 53 | 54 | vi. database rights (such as those arising under Directive 96/9/EC of the 55 | European Parliament and of the Council of 11 March 1996 on the legal protection 56 | of databases, and under any national implementation thereof, including any 57 | amended or successor version of such directive); and 58 | 59 | vii. other similar, equivalent or corresponding rights throughout the world 60 | based on applicable law or treaty, and any national implementations thereof. 61 | 62 | 2. Waiver. To the greatest extent permitted by, but not in contravention of, 63 | applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and 64 | unconditionally waives, abandons, and surrenders all of Affirmer's Copyright 65 | and Related Rights and associated claims and causes of action, whether now 66 | known or unknown (including existing as well as future claims and causes of 67 | action), in the Work (i) in all territories worldwide, (ii) for the maximum 68 | duration provided by applicable law or treaty (including future time extensions), 69 | (iii) in any current or future medium and for any number of copies, and (iv) 70 | for any purpose whatsoever, including without limitation commercial, advertising 71 | or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the 72 | benefit of each member of the public at large and to the detriment of Affirmer's 73 | heirs and successors, fully intending that such Waiver shall not be subject 74 | to revocation, rescission, cancellation, termination, or any other legal or 75 | equitable action to disrupt the quiet enjoyment of the Work by the public 76 | as contemplated by Affirmer's express Statement of Purpose. 77 | 78 | 3. Public License Fallback. Should any part of the Waiver for any reason be 79 | judged legally invalid or ineffective under applicable law, then the Waiver 80 | shall be preserved to the maximum extent permitted taking into account Affirmer's 81 | express Statement of Purpose. In addition, to the extent the Waiver is so 82 | judged Affirmer hereby grants to each affected person a royalty-free, non 83 | transferable, non sublicensable, non exclusive, irrevocable and unconditional 84 | license to exercise Affirmer's Copyright and Related Rights in the Work (i) 85 | in all territories worldwide, (ii) for the maximum duration provided by applicable 86 | law or treaty (including future time extensions), (iii) in any current or 87 | future medium and for any number of copies, and (iv) for any purpose whatsoever, 88 | including without limitation commercial, advertising or promotional purposes 89 | (the "License"). The License shall be deemed effective as of the date CC0 90 | was applied by Affirmer to the Work. Should any part of the License for any 91 | reason be judged legally invalid or ineffective under applicable law, such 92 | partial invalidity or ineffectiveness shall not invalidate the remainder of 93 | the License, and in such case Affirmer hereby affirms that he or she will 94 | not (i) exercise any of his or her remaining Copyright and Related Rights 95 | in the Work or (ii) assert any associated claims and causes of action with 96 | respect to the Work, in either case contrary to Affirmer's express Statement 97 | of Purpose. 98 | 99 | 4. Limitations and Disclaimers. 100 | 101 | a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, 102 | licensed or otherwise affected by this document. 103 | 104 | b. Affirmer offers the Work as-is and makes no representations or warranties 105 | of any kind concerning the Work, express, implied, statutory or otherwise, 106 | including without limitation warranties of title, merchantability, fitness 107 | for a particular purpose, non infringement, or the absence of latent or other 108 | defects, accuracy, or the present or absence of errors, whether or not discoverable, 109 | all to the greatest extent permissible under applicable law. 110 | 111 | c. Affirmer disclaims responsibility for clearing rights of other persons 112 | that may apply to the Work or any use thereof, including without limitation 113 | any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims 114 | responsibility for obtaining any necessary consents, permissions or other 115 | rights required for any use of the Work. 116 | 117 | d. Affirmer understands and acknowledges that Creative Commons is not a party 118 | to this document and has no duty or obligation with respect to this CC0 or 119 | use of the Work. 120 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # SPDX-License-Identifier: Apache-2.0 4 | # 5 | # Copyright © 2015-2021 the original authors. 6 | # 7 | # Licensed under the Apache License, Version 2.0 (the "License"); 8 | # you may not use this file except in compliance with the License. 9 | # You may obtain a copy of the License at 10 | # 11 | # https://www.apache.org/licenses/LICENSE-2.0 12 | # 13 | # Unless required by applicable law or agreed to in writing, software 14 | # distributed under the License is distributed on an "AS IS" BASIS, 15 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 | # See the License for the specific language governing permissions and 17 | # limitations under the License. 18 | # 19 | 20 | ############################################################################## 21 | # 22 | # Gradle start up script for POSIX generated by Gradle. 23 | # 24 | # Important for running: 25 | # 26 | # (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is 27 | # noncompliant, but you have some other compliant shell such as ksh or 28 | # bash, then to run this script, type that shell name before the whole 29 | # command line, like: 30 | # 31 | # ksh Gradle 32 | # 33 | # Busybox and similar reduced shells will NOT work, because this script 34 | # requires all of these POSIX shell features: 35 | # * functions; 36 | # * expansions «$var», «${var}», «${var:-default}», «${var+SET}», 37 | # «${var#prefix}», «${var%suffix}», and «$( cmd )»; 38 | # * compound commands having a testable exit status, especially «case»; 39 | # * various built-in commands including «command», «set», and «ulimit». 40 | # 41 | # Important for patching: 42 | # 43 | # (2) This script targets any POSIX shell, so it avoids extensions provided 44 | # by Bash, Ksh, etc; in particular arrays are avoided. 45 | # 46 | # The "traditional" practice of packing multiple parameters into a 47 | # space-separated string is a well documented source of bugs and security 48 | # problems, so this is (mostly) avoided, by progressively accumulating 49 | # options in "$@", and eventually passing that to Java. 50 | # 51 | # Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, 52 | # and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; 53 | # see the in-line comments for details. 54 | # 55 | # There are tweaks for specific operating systems such as AIX, CygWin, 56 | # Darwin, MinGW, and NonStop. 57 | # 58 | # (3) This script is generated from the Groovy template 59 | # https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt 60 | # within the Gradle project. 61 | # 62 | # You can find Gradle at https://github.com/gradle/gradle/. 63 | # 64 | ############################################################################## 65 | 66 | # Attempt to set APP_HOME 67 | 68 | # Resolve links: $0 may be a link 69 | app_path=$0 70 | 71 | # Need this for daisy-chained symlinks. 72 | while 73 | APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path 74 | [ -h "$app_path" ] 75 | do 76 | ls=$( ls -ld "$app_path" ) 77 | link=${ls#*' -> '} 78 | case $link in #( 79 | /*) app_path=$link ;; #( 80 | *) app_path=$APP_HOME$link ;; 81 | esac 82 | done 83 | 84 | # This is normally unused 85 | # shellcheck disable=SC2034 86 | APP_BASE_NAME=${0##*/} 87 | APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit 88 | 89 | # Use the maximum available, or set MAX_FD != -1 to use that value. 90 | MAX_FD=maximum 91 | 92 | warn () { 93 | echo "$*" 94 | } >&2 95 | 96 | die () { 97 | echo 98 | echo "$*" 99 | echo 100 | exit 1 101 | } >&2 102 | 103 | # OS specific support (must be 'true' or 'false'). 104 | cygwin=false 105 | msys=false 106 | darwin=false 107 | nonstop=false 108 | case "$( uname )" in #( 109 | CYGWIN* ) cygwin=true ;; #( 110 | Darwin* ) darwin=true ;; #( 111 | MSYS* | MINGW* ) msys=true ;; #( 112 | NONSTOP* ) nonstop=true ;; 113 | esac 114 | 115 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 116 | 117 | 118 | # Determine the Java command to use to start the JVM. 119 | if [ -n "$JAVA_HOME" ] ; then 120 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 121 | # IBM's JDK on AIX uses strange locations for the executables 122 | JAVACMD=$JAVA_HOME/jre/sh/java 123 | else 124 | JAVACMD=$JAVA_HOME/bin/java 125 | fi 126 | if [ ! -x "$JAVACMD" ] ; then 127 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 128 | 129 | Please set the JAVA_HOME variable in your environment to match the 130 | location of your Java installation." 131 | fi 132 | else 133 | JAVACMD=java 134 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 135 | 136 | Please set the JAVA_HOME variable in your environment to match the 137 | location of your Java installation." 138 | fi 139 | 140 | # Increase the maximum file descriptors if we can. 141 | if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then 142 | case $MAX_FD in #( 143 | max*) 144 | # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. 145 | # shellcheck disable=SC3045 146 | MAX_FD=$( ulimit -H -n ) || 147 | warn "Could not query maximum file descriptor limit" 148 | esac 149 | case $MAX_FD in #( 150 | '' | soft) :;; #( 151 | *) 152 | # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. 153 | # shellcheck disable=SC3045 154 | ulimit -n "$MAX_FD" || 155 | warn "Could not set maximum file descriptor limit to $MAX_FD" 156 | esac 157 | fi 158 | 159 | # Collect all arguments for the java command, stacking in reverse order: 160 | # * args from the command line 161 | # * the main class name 162 | # * -classpath 163 | # * -D...appname settings 164 | # * --module-path (only if needed) 165 | # * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. 166 | 167 | # For Cygwin or MSYS, switch paths to Windows format before running java 168 | if "$cygwin" || "$msys" ; then 169 | APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) 170 | CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) 171 | 172 | JAVACMD=$( cygpath --unix "$JAVACMD" ) 173 | 174 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 175 | for arg do 176 | if 177 | case $arg in #( 178 | -*) false ;; # don't mess with options #( 179 | /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath 180 | [ -e "$t" ] ;; #( 181 | *) false ;; 182 | esac 183 | then 184 | arg=$( cygpath --path --ignore --mixed "$arg" ) 185 | fi 186 | # Roll the args list around exactly as many times as the number of 187 | # args, so each arg winds up back in the position where it started, but 188 | # possibly modified. 189 | # 190 | # NB: a `for` loop captures its iteration list before it begins, so 191 | # changing the positional parameters here affects neither the number of 192 | # iterations, nor the values presented in `arg`. 193 | shift # remove old arg 194 | set -- "$@" "$arg" # push replacement arg 195 | done 196 | fi 197 | 198 | 199 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 200 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 201 | 202 | # Collect all arguments for the java command; 203 | # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of 204 | # shell script including quotes and variable substitutions, so put them in 205 | # double quotes to make sure that they get re-expanded; and 206 | # * put everything else in single quotes, so that it's not re-expanded. 207 | 208 | set -- \ 209 | "-Dorg.gradle.appname=$APP_BASE_NAME" \ 210 | -classpath "$CLASSPATH" \ 211 | org.gradle.wrapper.GradleWrapperMain \ 212 | "$@" 213 | 214 | # Stop when "xargs" is not available. 215 | if ! command -v xargs >/dev/null 2>&1 216 | then 217 | die "xargs is not available" 218 | fi 219 | 220 | # Use "xargs" to parse quoted args. 221 | # 222 | # With -n1 it outputs one arg per line, with the quotes and backslashes removed. 223 | # 224 | # In Bash we could simply go: 225 | # 226 | # readarray ARGS < <( xargs -n1 <<<"$var" ) && 227 | # set -- "${ARGS[@]}" "$@" 228 | # 229 | # but POSIX shell has neither arrays nor command substitution, so instead we 230 | # post-process each arg (as a line of input to sed) to backslash-escape any 231 | # character that might be a shell metacharacter, then use eval to reverse 232 | # that process (while maintaining the separation between arguments), and wrap 233 | # the whole thing up as a single "set" statement. 234 | # 235 | # This will of course break if any of these variables contains a newline or 236 | # an unmatched quote. 237 | # 238 | 239 | eval "set -- $( 240 | printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | 241 | xargs -n1 | 242 | sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | 243 | tr '\n' ' ' 244 | )" '"$@"' 245 | 246 | exec "$JAVACMD" "$@" 247 | -------------------------------------------------------------------------------- /LICENSES/Apache-2.0.txt: -------------------------------------------------------------------------------- 1 | Apache License 2 | 3 | Version 2.0, January 2004 4 | 5 | http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, 6 | AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | 11 | 12 | "License" shall mean the terms and conditions for use, reproduction, and distribution 13 | as defined by Sections 1 through 9 of this document. 14 | 15 | 16 | 17 | "Licensor" shall mean the copyright owner or entity authorized by the copyright 18 | owner that is granting the License. 19 | 20 | 21 | 22 | "Legal Entity" shall mean the union of the acting entity and all other entities 23 | that control, are controlled by, or are under common control with that entity. 24 | For the purposes of this definition, "control" means (i) the power, direct 25 | or indirect, to cause the direction or management of such entity, whether 26 | by contract or otherwise, or (ii) ownership of fifty percent (50%) or more 27 | of the outstanding shares, or (iii) beneficial ownership of such entity. 28 | 29 | 30 | 31 | "You" (or "Your") shall mean an individual or Legal Entity exercising permissions 32 | granted by this License. 33 | 34 | 35 | 36 | "Source" form shall mean the preferred form for making modifications, including 37 | but not limited to software source code, documentation source, and configuration 38 | files. 39 | 40 | 41 | 42 | "Object" form shall mean any form resulting from mechanical transformation 43 | or translation of a Source form, including but not limited to compiled object 44 | code, generated documentation, and conversions to other media types. 45 | 46 | 47 | 48 | "Work" shall mean the work of authorship, whether in Source or Object form, 49 | made available under the License, as indicated by a copyright notice that 50 | is included in or attached to the work (an example is provided in the Appendix 51 | below). 52 | 53 | 54 | 55 | "Derivative Works" shall mean any work, whether in Source or Object form, 56 | that is based on (or derived from) the Work and for which the editorial revisions, 57 | annotations, elaborations, or other modifications represent, as a whole, an 58 | original work of authorship. For the purposes of this License, Derivative 59 | Works shall not include works that remain separable from, or merely link (or 60 | bind by name) to the interfaces of, the Work and Derivative Works thereof. 61 | 62 | 63 | 64 | "Contribution" shall mean any work of authorship, including the original version 65 | of the Work and any modifications or additions to that Work or Derivative 66 | Works thereof, that is intentionally submitted to Licensor for inclusion in 67 | the Work by the copyright owner or by an individual or Legal Entity authorized 68 | to submit on behalf of the copyright owner. For the purposes of this definition, 69 | "submitted" means any form of electronic, verbal, or written communication 70 | sent to the Licensor or its representatives, including but not limited to 71 | communication on electronic mailing lists, source code control systems, and 72 | issue tracking systems that are managed by, or on behalf of, the Licensor 73 | for the purpose of discussing and improving the Work, but excluding communication 74 | that is conspicuously marked or otherwise designated in writing by the copyright 75 | owner as "Not a Contribution." 76 | 77 | 78 | 79 | "Contributor" shall mean Licensor and any individual or Legal Entity on behalf 80 | of whom a Contribution has been received by Licensor and subsequently incorporated 81 | within the Work. 82 | 83 | 2. Grant of Copyright License. Subject to the terms and conditions of this 84 | License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, 85 | no-charge, royalty-free, irrevocable copyright license to reproduce, prepare 86 | Derivative Works of, publicly display, publicly perform, sublicense, and distribute 87 | the Work and such Derivative Works in Source or Object form. 88 | 89 | 3. Grant of Patent License. Subject to the terms and conditions of this License, 90 | each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, 91 | no-charge, royalty-free, irrevocable (except as stated in this section) patent 92 | license to make, have made, use, offer to sell, sell, import, and otherwise 93 | transfer the Work, where such license applies only to those patent claims 94 | licensable by such Contributor that are necessarily infringed by their Contribution(s) 95 | alone or by combination of their Contribution(s) with the Work to which such 96 | Contribution(s) was submitted. If You institute patent litigation against 97 | any entity (including a cross-claim or counterclaim in a lawsuit) alleging 98 | that the Work or a Contribution incorporated within the Work constitutes direct 99 | or contributory patent infringement, then any patent licenses granted to You 100 | under this License for that Work shall terminate as of the date such litigation 101 | is filed. 102 | 103 | 4. Redistribution. You may reproduce and distribute copies of the Work or 104 | Derivative Works thereof in any medium, with or without modifications, and 105 | in Source or Object form, provided that You meet the following conditions: 106 | 107 | (a) You must give any other recipients of the Work or Derivative Works a copy 108 | of this License; and 109 | 110 | (b) You must cause any modified files to carry prominent notices stating that 111 | You changed the files; and 112 | 113 | (c) You must retain, in the Source form of any Derivative Works that You distribute, 114 | all copyright, patent, trademark, and attribution notices from the Source 115 | form of the Work, excluding those notices that do not pertain to any part 116 | of the Derivative Works; and 117 | 118 | (d) If the Work includes a "NOTICE" text file as part of its distribution, 119 | then any Derivative Works that You distribute must include a readable copy 120 | of the attribution notices contained within such NOTICE file, excluding those 121 | notices that do not pertain to any part of the Derivative Works, in at least 122 | one of the following places: within a NOTICE text file distributed as part 123 | of the Derivative Works; within the Source form or documentation, if provided 124 | along with the Derivative Works; or, within a display generated by the Derivative 125 | Works, if and wherever such third-party notices normally appear. The contents 126 | of the NOTICE file are for informational purposes only and do not modify the 127 | License. You may add Your own attribution notices within Derivative Works 128 | that You distribute, alongside or as an addendum to the NOTICE text from the 129 | Work, provided that such additional attribution notices cannot be construed 130 | as modifying the License. 131 | 132 | You may add Your own copyright statement to Your modifications and may provide 133 | additional or different license terms and conditions for use, reproduction, 134 | or distribution of Your modifications, or for any such Derivative Works as 135 | a whole, provided Your use, reproduction, and distribution of the Work otherwise 136 | complies with the conditions stated in this License. 137 | 138 | 5. Submission of Contributions. Unless You explicitly state otherwise, any 139 | Contribution intentionally submitted for inclusion in the Work by You to the 140 | Licensor shall be under the terms and conditions of this License, without 141 | any additional terms or conditions. Notwithstanding the above, nothing herein 142 | shall supersede or modify the terms of any separate license agreement you 143 | may have executed with Licensor regarding such Contributions. 144 | 145 | 6. Trademarks. This License does not grant permission to use the trade names, 146 | trademarks, service marks, or product names of the Licensor, except as required 147 | for reasonable and customary use in describing the origin of the Work and 148 | reproducing the content of the NOTICE file. 149 | 150 | 7. Disclaimer of Warranty. Unless required by applicable law or agreed to 151 | in writing, Licensor provides the Work (and each Contributor provides its 152 | Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 153 | KIND, either express or implied, including, without limitation, any warranties 154 | or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR 155 | A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness 156 | of using or redistributing the Work and assume any risks associated with Your 157 | exercise of permissions under this License. 158 | 159 | 8. Limitation of Liability. In no event and under no legal theory, whether 160 | in tort (including negligence), contract, or otherwise, unless required by 161 | applicable law (such as deliberate and grossly negligent acts) or agreed to 162 | in writing, shall any Contributor be liable to You for damages, including 163 | any direct, indirect, special, incidental, or consequential damages of any 164 | character arising as a result of this License or out of the use or inability 165 | to use the Work (including but not limited to damages for loss of goodwill, 166 | work stoppage, computer failure or malfunction, or any and all other commercial 167 | damages or losses), even if such Contributor has been advised of the possibility 168 | of such damages. 169 | 170 | 9. Accepting Warranty or Additional Liability. While redistributing the Work 171 | or Derivative Works thereof, You may choose to offer, and charge a fee for, 172 | acceptance of support, warranty, indemnity, or other liability obligations 173 | and/or rights consistent with this License. However, in accepting such obligations, 174 | You may act only on Your own behalf and on Your sole responsibility, not on 175 | behalf of any other Contributor, and only if You agree to indemnify, defend, 176 | and hold each Contributor harmless for any liability incurred by, or claims 177 | asserted against, such Contributor by reason of your accepting any such warranty 178 | or additional liability. END OF TERMS AND CONDITIONS 179 | 180 | APPENDIX: How to apply the Apache License to your work. 181 | 182 | To apply the Apache License to your work, attach the following boilerplate 183 | notice, with the fields enclosed by brackets "[]" replaced with your own identifying 184 | information. (Don't include the brackets!) The text should be enclosed in 185 | the appropriate comment syntax for the file format. We also recommend that 186 | a file or class name and description of purpose be included on the same "printed 187 | page" as the copyright notice for easier identification within third-party 188 | archives. 189 | 190 | Copyright [yyyy] [name of copyright owner] 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | 194 | you may not use this file except in compliance with the License. 195 | 196 | You may obtain a copy of the License at 197 | 198 | http://www.apache.org/licenses/LICENSE-2.0 199 | 200 | Unless required by applicable law or agreed to in writing, software 201 | 202 | distributed under the License is distributed on an "AS IS" BASIS, 203 | 204 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 205 | 206 | See the License for the specific language governing permissions and 207 | 208 | limitations under the License. 209 | -------------------------------------------------------------------------------- /fake-store/src/main/aidl/com/android/vending/billing/IInAppBillingService.aidl: -------------------------------------------------------------------------------- 1 | /* 2 | * SPDX-FileCopyrightText: 2012 Google Inc. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | /* 7 | * Copyright (c) 2012 Google Inc. 8 | * 9 | * Licensed under the Apache License, Version 2.0 (the "License"); 10 | * you may not use this file except in compliance with the License. 11 | * You may obtain a copy of the License at 12 | * 13 | * http://www.apache.org/licenses/LICENSE-2.0 14 | * 15 | * Unless required by applicable law or agreed to in writing, software 16 | * distributed under the License is distributed on an "AS IS" BASIS, 17 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 | * See the License for the specific language governing permissions and 19 | * limitations under the License. 20 | */ 21 | 22 | package com.android.vending.billing; 23 | 24 | import android.os.Bundle; 25 | 26 | /** 27 | * InAppBillingService is the service that provides in-app billing version 3 and beyond. 28 | * This service provides the following features: 29 | * 1. Provides a new API to get details of in-app items published for the app including 30 | * price, type, title and description. 31 | * 2. The purchase flow is synchronous and purchase information is available immediately 32 | * after it completes. 33 | * 3. Purchase information of in-app purchases is maintained within the Google Play system 34 | * till the purchase is consumed. 35 | * 4. An API to consume a purchase of an inapp item. All purchases of one-time 36 | * in-app items are consumable and thereafter can be purchased again. 37 | * 5. An API to get current purchases of the user immediately. This will not contain any 38 | * consumed purchases. 39 | * 40 | * All calls will give a response code with the following possible values 41 | * RESULT_OK = 0 - success 42 | * RESULT_USER_CANCELED = 1 - User pressed back or canceled a dialog 43 | * RESULT_SERVICE_UNAVAILABLE = 2 - The network connection is down 44 | * RESULT_BILLING_UNAVAILABLE = 3 - This billing API version is not supported for the type requested 45 | * RESULT_ITEM_UNAVAILABLE = 4 - Requested SKU is not available for purchase 46 | * RESULT_DEVELOPER_ERROR = 5 - Invalid arguments provided to the API 47 | * RESULT_ERROR = 6 - Fatal error during the API action 48 | * RESULT_ITEM_ALREADY_OWNED = 7 - Failure to purchase since item is already owned 49 | * RESULT_ITEM_NOT_OWNED = 8 - Failure to consume since item is not owned 50 | */ 51 | interface IInAppBillingService { 52 | /** 53 | * Checks support for the requested billing API version, package and in-app type. 54 | * Minimum API version supported by this interface is 3. 55 | * @param apiVersion billing API version that the app is using 56 | * @param packageName the package name of the calling app 57 | * @param type type of the in-app item being purchased ("inapp" for one-time purchases 58 | * and "subs" for subscriptions) 59 | * @return RESULT_OK(0) on success and appropriate response code on failures. 60 | */ 61 | int isBillingSupported(int apiVersion, String packageName, String type) = 0; 62 | 63 | /** 64 | * Provides details of a list of SKUs 65 | * Given a list of SKUs of a valid type in the skusBundle, this returns a bundle 66 | * with a list JSON strings containing the productId, price, title and description. 67 | * This API can be called with a maximum of 20 SKUs. 68 | * @param apiVersion billing API version that the app is using 69 | * @param packageName the package name of the calling app 70 | * @param type of the in-app items ("inapp" for one-time purchases 71 | * and "subs" for subscriptions) 72 | * @param skusBundle bundle containing a StringArrayList of SKUs with key "ITEM_ID_LIST" 73 | * @return Bundle containing the following key-value pairs 74 | * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes 75 | * on failures. 76 | * "DETAILS_LIST" with a StringArrayList containing purchase information 77 | * in JSON format similar to: 78 | * '{ "productId" : "exampleSku", 79 | * "type" : "inapp", 80 | * "price" : "$5.00", 81 | * "price_currency": "USD", 82 | * "price_amount_micros": 5000000, 83 | * "title : "Example Title", 84 | * "description" : "This is an example description" }' 85 | */ 86 | Bundle getSkuDetails(int apiVersion, String packageName, String type, in Bundle skusBundle) = 1; 87 | 88 | /** 89 | * Returns a pending intent to launch the purchase flow for an in-app item by providing a SKU, 90 | * the type, a unique purchase token and an optional developer payload. 91 | * @param apiVersion billing API version that the app is using 92 | * @param packageName package name of the calling app 93 | * @param sku the SKU of the in-app item as published in the developer console 94 | * @param type of the in-app item being purchased ("inapp" for one-time purchases 95 | * and "subs" for subscriptions) 96 | * @param developerPayload optional argument to be sent back with the purchase information 97 | * @return Bundle containing the following key-value pairs 98 | * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes 99 | * on failures. 100 | * "BUY_INTENT" - PendingIntent to start the purchase flow 101 | * 102 | * The Pending intent should be launched with startIntentSenderForResult. When purchase flow 103 | * has completed, the onActivityResult() will give a resultCode of OK or CANCELED. 104 | * If the purchase is successful, the result data will contain the following key-value pairs 105 | * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response 106 | * codes on failures. 107 | * "INAPP_PURCHASE_DATA" - String in JSON format similar to 108 | * '{"orderId":"12999763169054705758.1371079406387615", 109 | * "packageName":"com.example.app", 110 | * "productId":"exampleSku", 111 | * "purchaseTime":1345678900000, 112 | * "purchaseToken" : "122333444455555", 113 | * "developerPayload":"example developer payload" }' 114 | * "INAPP_DATA_SIGNATURE" - String containing the signature of the purchase data that 115 | * was signed with the private key of the developer 116 | * TODO: change this to app-specific keys. 117 | */ 118 | Bundle getBuyIntent(int apiVersion, String packageName, String sku, String type, 119 | String developerPayload) = 2; 120 | 121 | /** 122 | * Returns the current SKUs owned by the user of the type and package name specified along with 123 | * purchase information and a signature of the data to be validated. 124 | * This will return all SKUs that have been purchased in V3 and managed items purchased using 125 | * V1 and V2 that have not been consumed. 126 | * @param apiVersion billing API version that the app is using 127 | * @param packageName package name of the calling app 128 | * @param type of the in-app items being requested ("inapp" for one-time purchases 129 | * and "subs" for subscriptions) 130 | * @param continuationToken to be set as null for the first call, if the number of owned 131 | * skus are too many, a continuationToken is returned in the response bundle. 132 | * This method can be called again with the continuation token to get the next set of 133 | * owned skus. 134 | * @return Bundle containing the following key-value pairs 135 | * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes 136 | on failures. 137 | * "INAPP_PURCHASE_ITEM_LIST" - StringArrayList containing the list of SKUs 138 | * "INAPP_PURCHASE_DATA_LIST" - StringArrayList containing the purchase information 139 | * "INAPP_DATA_SIGNATURE_LIST"- StringArrayList containing the signatures 140 | * of the purchase information 141 | * "INAPP_CONTINUATION_TOKEN" - String containing a continuation token for the 142 | * next set of in-app purchases. Only set if the 143 | * user has more owned skus than the current list. 144 | */ 145 | Bundle getPurchases(int apiVersion, String packageName, String type, String continuationToken) = 3; 146 | 147 | /** 148 | * Consume the last purchase of the given SKU. This will result in this item being removed 149 | * from all subsequent responses to getPurchases() and allow re-purchase of this item. 150 | * @param apiVersion billing API version that the app is using 151 | * @param packageName package name of the calling app 152 | * @param purchaseToken token in the purchase information JSON that identifies the purchase 153 | * to be consumed 154 | * @return RESULT_OK(0) if consumption succeeded, appropriate response codes on failures. 155 | */ 156 | int consumePurchase(int apiVersion, String packageName, String purchaseToken) = 4; 157 | 158 | /** 159 | * Returns a pending intent to launch the purchase flow for upgrading or downgrading a 160 | * subscription. The existing owned SKU(s) should be provided along with the new SKU that 161 | * the user is upgrading or downgrading to. 162 | * @param apiVersion billing API version that the app is using, must be 5 or later 163 | * @param packageName package name of the calling app 164 | * @param oldSkus the SKU(s) that the user is upgrading or downgrading from, 165 | * if null or empty this method will behave like {@link #getBuyIntent} 166 | * @param newSku the SKU that the user is upgrading or downgrading to 167 | * @param type of the item being purchased, currently must be "subs" 168 | * @param developerPayload optional argument to be sent back with the purchase information 169 | * @return Bundle containing the following key-value pairs 170 | * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response codes 171 | * on failures. 172 | * "BUY_INTENT" - PendingIntent to start the purchase flow 173 | * 174 | * The Pending intent should be launched with startIntentSenderForResult. When purchase flow 175 | * has completed, the onActivityResult() will give a resultCode of OK or CANCELED. 176 | * If the purchase is successful, the result data will contain the following key-value pairs 177 | * "RESPONSE_CODE" with int value, RESULT_OK(0) if success, appropriate response 178 | * codes on failures. 179 | * "INAPP_PURCHASE_DATA" - String in JSON format similar to 180 | * '{"orderId":"12999763169054705758.1371079406387615", 181 | * "packageName":"com.example.app", 182 | * "productId":"exampleSku", 183 | * "purchaseTime":1345678900000, 184 | * "purchaseToken" : "122333444455555", 185 | * "developerPayload":"example developer payload" }' 186 | * "INAPP_DATA_SIGNATURE" - String containing the signature of the purchase data that 187 | * was signed with the private key of the developer 188 | * TODO: change this to app-specific keys. 189 | */ 190 | Bundle getBuyIntentToReplaceSkus(int apiVersion, String packageName, 191 | in List oldSkus, String newSku, String type, String developerPayload) = 6; 192 | 193 | Bundle getBuyIntentV6(int apiVersion, String packageName, String sku, String type, String developerPayload, in Bundle extras) = 7; 194 | 195 | Bundle getPurchasesV6(int apiVersion, String packageName, String type, String continuationToken, in Bundle extras) = 8; 196 | 197 | int isBillingSupportedV7(int apiVersion, String packageName, String type, in Bundle extras) = 9; 198 | 199 | Bundle getPurchasesV9(int apiVersion, String packageName, String type, String continuationToken, in Bundle extras) = 10; 200 | 201 | Bundle consumePurchaseV9(int apiVersion, String packageName, String purchaseToken, in Bundle extras) = 11; 202 | 203 | Bundle getPriceChangeConfirmationIntent(int apiVersion, String packageName, String sku, String type, in Bundle extras) = 800; 204 | 205 | Bundle getSkuDetailsV10(int apiVersion, String packageName, String type, in Bundle skuBundle, in Bundle extras) = 900; 206 | 207 | Bundle acknowledgePurchase(int apiVersion, String packageName, String purchaseToken, in Bundle extras) = 901; 208 | } 209 | -------------------------------------------------------------------------------- /LICENSES/CC-BY-SA-4.0.txt: -------------------------------------------------------------------------------- 1 | Creative Commons Attribution-ShareAlike 4.0 International Creative Commons 2 | Corporation ("Creative Commons") is not a law firm and does not provide legal 3 | services or legal advice. Distribution of Creative Commons public licenses 4 | does not create a lawyer-client or other relationship. Creative Commons makes 5 | its licenses and related information available on an "as-is" basis. Creative 6 | Commons gives no warranties regarding its licenses, any material licensed 7 | under their terms and conditions, or any related information. Creative Commons 8 | disclaims all liability for damages resulting from their use to the fullest 9 | extent possible. 10 | 11 | Using Creative Commons Public Licenses 12 | 13 | Creative Commons public licenses provide a standard set of terms and conditions 14 | that creators and other rights holders may use to share original works of 15 | authorship and other material subject to copyright and certain other rights 16 | specified in the public license below. The following considerations are for 17 | informational purposes only, are not exhaustive, and do not form part of our 18 | licenses. 19 | 20 | Considerations for licensors: Our public licenses are intended for use by 21 | those authorized to give the public permission to use material in ways otherwise 22 | restricted by copyright and certain other rights. Our licenses are irrevocable. 23 | Licensors should read and understand the terms and conditions of the license 24 | they choose before applying it. Licensors should also secure all rights necessary 25 | before applying our licenses so that the public can reuse the material as 26 | expected. Licensors should clearly mark any material not subject to the license. 27 | This includes other CC-licensed material, or material used under an exception 28 | or limitation to copyright. More considerations for licensors : wiki.creativecommons.org/Considerations_for_licensors 29 | 30 | Considerations for the public: By using one of our public licenses, a licensor 31 | grants the public permission to use the licensed material under specified 32 | terms and conditions. If the licensor's permission is not necessary for any 33 | reason–for example, because of any applicable exception or limitation to copyright–then 34 | that use is not regulated by the license. Our licenses grant only permissions 35 | under copyright and certain other rights that a licensor has authority to 36 | grant. Use of the licensed material may still be restricted for other reasons, 37 | including because others have copyright or other rights in the material. A 38 | licensor may make special requests, such as asking that all changes be marked 39 | or described. 40 | 41 | Although not required by our licenses, you are encouraged to respect those 42 | requests where reasonable. More considerations for the public : wiki.creativecommons.org/Considerations_for_licensees 43 | 44 | Creative Commons Attribution-ShareAlike 4.0 International Public License 45 | 46 | By exercising the Licensed Rights (defined below), You accept and agree to 47 | be bound by the terms and conditions of this Creative Commons Attribution-ShareAlike 48 | 4.0 International Public License ("Public License"). To the extent this Public 49 | License may be interpreted as a contract, You are granted the Licensed Rights 50 | in consideration of Your acceptance of these terms and conditions, and the 51 | Licensor grants You such rights in consideration of benefits the Licensor 52 | receives from making the Licensed Material available under these terms and 53 | conditions. 54 | 55 | Section 1 – Definitions. 56 | 57 | a. Adapted Material means material subject to Copyright and Similar Rights 58 | that is derived from or based upon the Licensed Material and in which the 59 | Licensed Material is translated, altered, arranged, transformed, or otherwise 60 | modified in a manner requiring permission under the Copyright and Similar 61 | Rights held by the Licensor. For purposes of this Public License, where the 62 | Licensed Material is a musical work, performance, or sound recording, Adapted 63 | Material is always produced where the Licensed Material is synched in timed 64 | relation with a moving image. 65 | 66 | b. Adapter's License means the license You apply to Your Copyright and Similar 67 | Rights in Your contributions to Adapted Material in accordance with the terms 68 | and conditions of this Public License. 69 | 70 | c. BY-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses, 71 | approved by Creative Commons as essentially the equivalent of this Public 72 | License. 73 | 74 | d. Copyright and Similar Rights means copyright and/or similar rights closely 75 | related to copyright including, without limitation, performance, broadcast, 76 | sound recording, and Sui Generis Database Rights, without regard to how the 77 | rights are labeled or categorized. For purposes of this Public License, the 78 | rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. 79 | 80 | e. Effective Technological Measures means those measures that, in the absence 81 | of proper authority, may not be circumvented under laws fulfilling obligations 82 | under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, 83 | and/or similar international agreements. 84 | 85 | f. Exceptions and Limitations means fair use, fair dealing, and/or any other 86 | exception or limitation to Copyright and Similar Rights that applies to Your 87 | use of the Licensed Material. 88 | 89 | g. License Elements means the license attributes listed in the name of a Creative 90 | Commons Public License. The License Elements of this Public License are Attribution 91 | and ShareAlike. 92 | 93 | h. Licensed Material means the artistic or literary work, database, or other 94 | material to which the Licensor applied this Public License. 95 | 96 | i. Licensed Rights means the rights granted to You subject to the terms and 97 | conditions of this Public License, which are limited to all Copyright and 98 | Similar Rights that apply to Your use of the Licensed Material and that the 99 | Licensor has authority to license. 100 | 101 | j. Licensor means the individual(s) or entity(ies) granting rights under this 102 | Public License. 103 | 104 | k. Share means to provide material to the public by any means or process that 105 | requires permission under the Licensed Rights, such as reproduction, public 106 | display, public performance, distribution, dissemination, communication, or 107 | importation, and to make material available to the public including in ways 108 | that members of the public may access the material from a place and at a time 109 | individually chosen by them. 110 | 111 | l. Sui Generis Database Rights means rights other than copyright resulting 112 | from Directive 96/9/EC of the European Parliament and of the Council of 11 113 | March 1996 on the legal protection of databases, as amended and/or succeeded, 114 | as well as other essentially equivalent rights anywhere in the world. 115 | 116 | m. You means the individual or entity exercising the Licensed Rights under 117 | this Public License. Your has a corresponding meaning. 118 | 119 | Section 2 – Scope. 120 | 121 | a. License grant. 122 | 123 | 1. Subject to the terms and conditions of this Public License, the Licensor 124 | hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, 125 | irrevocable license to exercise the Licensed Rights in the Licensed Material 126 | to: 127 | 128 | A. reproduce and Share the Licensed Material, in whole or in part; and 129 | 130 | B. produce, reproduce, and Share Adapted Material. 131 | 132 | 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions 133 | and Limitations apply to Your use, this Public License does not apply, and 134 | You do not need to comply with its terms and conditions. 135 | 136 | 3. Term. The term of this Public License is specified in Section 6(a). 137 | 138 | 4. Media and formats; technical modifications allowed. The Licensor authorizes 139 | You to exercise the Licensed Rights in all media and formats whether now known 140 | or hereafter created, and to make technical modifications necessary to do 141 | so. The Licensor waives and/or agrees not to assert any right or authority 142 | to forbid You from making technical modifications necessary to exercise the 143 | Licensed Rights, including technical modifications necessary to circumvent 144 | Effective Technological Measures. For purposes of this Public License, simply 145 | making modifications authorized by this Section 2(a)(4) never produces Adapted 146 | Material. 147 | 148 | 5. Downstream recipients. 149 | 150 | A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed 151 | Material automatically receives an offer from the Licensor to exercise the 152 | Licensed Rights under the terms and conditions of this Public License. 153 | 154 | B. Additional offer from the Licensor – Adapted Material. Every recipient 155 | of Adapted Material from You automatically receives an offer from the Licensor 156 | to exercise the Licensed Rights in the Adapted Material under the conditions 157 | of the Adapter's License You apply. 158 | 159 | C. No downstream restrictions. You may not offer or impose any additional 160 | or different terms or conditions on, or apply any Effective Technological 161 | Measures to, the Licensed Material if doing so restricts exercise of the Licensed 162 | Rights by any recipient of the Licensed Material. 163 | 164 | 6. No endorsement. Nothing in this Public License constitutes or may be construed 165 | as permission to assert or imply that You are, or that Your use of the Licensed 166 | Material is, connected with, or sponsored, endorsed, or granted official status 167 | by, the Licensor or others designated to receive attribution as provided in 168 | Section 3(a)(1)(A)(i). 169 | 170 | b. Other rights. 171 | 172 | 1. Moral rights, such as the right of integrity, are not licensed under this 173 | Public License, nor are publicity, privacy, and/or other similar personality 174 | rights; however, to the extent possible, the Licensor waives and/or agrees 175 | not to assert any such rights held by the Licensor to the limited extent necessary 176 | to allow You to exercise the Licensed Rights, but not otherwise. 177 | 178 | 2. Patent and trademark rights are not licensed under this Public License. 179 | 180 | 3. To the extent possible, the Licensor waives any right to collect royalties 181 | from You for the exercise of the Licensed Rights, whether directly or through 182 | a collecting society under any voluntary or waivable statutory or compulsory 183 | licensing scheme. In all other cases the Licensor expressly reserves any right 184 | to collect such royalties. 185 | 186 | Section 3 – License Conditions. 187 | 188 | Your exercise of the Licensed Rights is expressly made subject to the following 189 | conditions. 190 | 191 | a. Attribution. 192 | 193 | 1. If You Share the Licensed Material (including in modified form), You must: 194 | 195 | A. retain the following if it is supplied by the Licensor with the Licensed 196 | Material: 197 | 198 | i. identification of the creator(s) of the Licensed Material and any others 199 | designated to receive attribution, in any reasonable manner requested by the 200 | Licensor (including by pseudonym if designated); 201 | 202 | ii. a copyright notice; 203 | 204 | iii. a notice that refers to this Public License; 205 | 206 | iv. a notice that refers to the disclaimer of warranties; 207 | 208 | v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; 209 | 210 | B. indicate if You modified the Licensed Material and retain an indication 211 | of any previous modifications; and 212 | 213 | C. indicate the Licensed Material is licensed under this Public License, and 214 | include the text of, or the URI or hyperlink to, this Public License. 215 | 216 | 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner 217 | based on the medium, means, and context in which You Share the Licensed Material. 218 | For example, it may be reasonable to satisfy the conditions by providing a 219 | URI or hyperlink to a resource that includes the required information. 220 | 221 | 3. If requested by the Licensor, You must remove any of the information required 222 | by Section 3(a)(1)(A) to the extent reasonably practicable. 223 | 224 | b. ShareAlike.In addition to the conditions in Section 3(a), if You Share 225 | Adapted Material You produce, the following conditions also apply. 226 | 227 | 1. The Adapter's License You apply must be a Creative Commons license with 228 | the same License Elements, this version or later, or a BY-SA Compatible License. 229 | 230 | 2. You must include the text of, or the URI or hyperlink to, the Adapter's 231 | License You apply. You may satisfy this condition in any reasonable manner 232 | based on the medium, means, and context in which You Share Adapted Material. 233 | 234 | 3. You may not offer or impose any additional or different terms or conditions 235 | on, or apply any Effective Technological Measures to, Adapted Material that 236 | restrict exercise of the rights granted under the Adapter's License You apply. 237 | 238 | Section 4 – Sui Generis Database Rights. 239 | 240 | Where the Licensed Rights include Sui Generis Database Rights that apply to 241 | Your use of the Licensed Material: 242 | 243 | a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, 244 | reuse, reproduce, and Share all or a substantial portion of the contents of 245 | the database; 246 | 247 | b. if You include all or a substantial portion of the database contents in 248 | a database in which You have Sui Generis Database Rights, then the database 249 | in which You have Sui Generis Database Rights (but not its individual contents) 250 | is Adapted Material, including for purposes of Section 3(b); and 251 | 252 | c. You must comply with the conditions in Section 3(a) if You Share all or 253 | a substantial portion of the contents of the database. 254 | 255 | For the avoidance of doubt, this Section 4 supplements and does not replace 256 | Your obligations under this Public License where the Licensed Rights include 257 | other Copyright and Similar Rights. 258 | 259 | Section 5 – Disclaimer of Warranties and Limitation of Liability. 260 | 261 | a. Unless otherwise separately undertaken by the Licensor, to the extent possible, 262 | the Licensor offers the Licensed Material as-is and as-available, and makes 263 | no representations or warranties of any kind concerning the Licensed Material, 264 | whether express, implied, statutory, or other. This includes, without limitation, 265 | warranties of title, merchantability, fitness for a particular purpose, non-infringement, 266 | absence of latent or other defects, accuracy, or the presence or absence of 267 | errors, whether or not known or discoverable. Where disclaimers of warranties 268 | are not allowed in full or in part, this disclaimer may not apply to You. 269 | 270 | b. To the extent possible, in no event will the Licensor be liable to You 271 | on any legal theory (including, without limitation, negligence) or otherwise 272 | for any direct, special, indirect, incidental, consequential, punitive, exemplary, 273 | or other losses, costs, expenses, or damages arising out of this Public License 274 | or use of the Licensed Material, even if the Licensor has been advised of 275 | the possibility of such losses, costs, expenses, or damages. Where a limitation 276 | of liability is not allowed in full or in part, this limitation may not apply 277 | to You. 278 | 279 | c. The disclaimer of warranties and limitation of liability provided above 280 | shall be interpreted in a manner that, to the extent possible, most closely 281 | approximates an absolute disclaimer and waiver of all liability. 282 | 283 | Section 6 – Term and Termination. 284 | 285 | a. This Public License applies for the term of the Copyright and Similar Rights 286 | licensed here. However, if You fail to comply with this Public License, then 287 | Your rights under this Public License terminate automatically. 288 | 289 | b. Where Your right to use the Licensed Material has terminated under Section 290 | 6(a), it reinstates: 291 | 292 | 1. automatically as of the date the violation is cured, provided it is cured 293 | within 30 days of Your discovery of the violation; or 294 | 295 | 2. upon express reinstatement by the Licensor. 296 | 297 | c. For the avoidance of doubt, this Section 6(b) does not affect any right 298 | the Licensor may have to seek remedies for Your violations of this Public 299 | License. 300 | 301 | d. For the avoidance of doubt, the Licensor may also offer the Licensed Material 302 | under separate terms or conditions or stop distributing the Licensed Material 303 | at any time; however, doing so will not terminate this Public License. 304 | 305 | e. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. 306 | 307 | Section 7 – Other Terms and Conditions. 308 | 309 | a. The Licensor shall not be bound by any additional or different terms or 310 | conditions communicated by You unless expressly agreed. 311 | 312 | b. Any arrangements, understandings, or agreements regarding the Licensed 313 | Material not stated herein are separate from and independent of the terms 314 | and conditions of this Public License. 315 | 316 | Section 8 – Interpretation. 317 | 318 | a. For the avoidance of doubt, this Public License does not, and shall not 319 | be interpreted to, reduce, limit, restrict, or impose conditions on any use 320 | of the Licensed Material that could lawfully be made without permission under 321 | this Public License. 322 | 323 | b. To the extent possible, if any provision of this Public License is deemed 324 | unenforceable, it shall be automatically reformed to the minimum extent necessary 325 | to make it enforceable. If the provision cannot be reformed, it shall be severed 326 | from this Public License without affecting the enforceability of the remaining 327 | terms and conditions. 328 | 329 | c. No term or condition of this Public License will be waived and no failure 330 | to comply consented to unless expressly agreed to by the Licensor. 331 | 332 | d. Nothing in this Public License constitutes or may be interpreted as a limitation 333 | upon, or waiver of, any privileges and immunities that apply to the Licensor 334 | or You, including from the legal processes of any jurisdiction or authority. 335 | 336 | Creative Commons is not a party to its public licenses. Notwithstanding, Creative 337 | Commons may elect to apply one of its public licenses to material it publishes 338 | and in those instances will be considered the "Licensor." The text of the 339 | Creative Commons public licenses is dedicated to the public domain under the 340 | CC0 Public Domain Dedication. Except for the limited purpose of indicating 341 | that material is shared under a Creative Commons public license or as otherwise 342 | permitted by the Creative Commons policies published at creativecommons.org/policies, 343 | Creative Commons does not authorize the use of the trademark "Creative Commons" 344 | or any other trademark or logo of Creative Commons without its prior written 345 | consent including, without limitation, in connection with any unauthorized 346 | modifications to any of its public licenses or any other arrangements, understandings, 347 | or agreements concerning use of licensed material. For the avoidance of doubt, 348 | this paragraph does not form part of the public licenses. 349 | 350 | Creative Commons may be contacted at creativecommons.org. 351 | -------------------------------------------------------------------------------- /fake-signature/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 21 | 22 | 25 | 28 | 31 | 34 | 37 | 40 | 43 | 46 | 49 | 52 | 55 | 58 | 61 | 64 | 67 | 70 | 73 | 76 | 79 | 82 | 85 | 88 | 91 | 94 | 97 | 100 | 103 | 106 | 109 | 112 | 115 | 118 | 121 | 124 | 127 | 130 | 133 | 136 | 139 | 142 | 145 | 148 | 151 | 154 | 157 | 160 | 163 | 166 | 169 | 172 | 175 | 178 | 181 | 184 | 187 | 190 | 193 | 196 | 199 | 202 | 205 | 208 | 211 | 214 | 217 | 220 | 223 | 226 | 229 | 232 | 235 | 238 | 241 | 244 | 247 | 250 | 253 | 256 | 259 | 262 | 265 | 268 | 271 | 274 | 277 | 280 | 283 | 286 | 289 | 292 | 295 | 298 | 301 | 304 | 307 | 310 | 313 | 316 | 319 | 322 | 325 | 328 | 331 | 334 | 337 | 340 | 343 | 346 | 349 | 352 | 355 | 358 | 361 | 364 | 367 | 370 | 373 | 376 | 379 | 382 | 385 | 388 | 391 | 394 | 397 | 400 | 403 | 406 | 409 | 412 | 415 | 418 | 421 | 424 | 427 | 430 | 433 | 436 | 439 | 442 | 445 | 448 | 451 | 454 | 457 | 460 | 463 | 466 | 469 | 472 | 475 | 478 | 481 | 484 | 487 | 490 | 493 | 496 | 499 | 502 | 505 | 508 | 511 | 514 | 517 | 520 | 523 | 526 | 529 | 532 | 535 | 538 | 541 | 544 | 547 | 550 | 553 | 556 | 559 | 562 | 565 | 568 | 571 | 574 | 577 | 580 | 583 | 586 | 589 | 592 | 595 | 598 | 601 | 604 | 607 | 610 | 613 | 616 | 619 | 622 | 625 | 628 | 631 | 634 | 637 | 640 | 643 | 646 | 649 | 652 | 655 | 658 | 661 | 664 | 667 | 670 | 673 | 676 | 679 | 682 | 685 | 688 | 691 | 694 | 697 | 700 | 703 | 706 | 709 | 712 | 715 | 718 | 721 | 724 | 727 | 730 | 733 | 736 | 739 | 742 | 745 | 748 | 751 | 754 | 757 | 760 | 763 | 766 | 769 | 772 | 775 | 778 | 781 | 784 | 787 | 790 | 793 | 796 | 799 | 802 | 805 | 808 | 811 | 814 | 817 | 820 | 823 | 826 | 829 | 832 | 835 | 838 | 841 | 844 | 847 | 850 | 853 | 856 | 859 | 862 | 865 | 868 | 871 | 874 | 877 | 880 | 883 | 886 | 889 | 892 | 895 | 898 | 901 | 904 | 907 | 910 | 913 | 916 | 919 | 922 | 925 | 928 | 931 | 934 | 937 | 940 | 943 | 946 | 949 | 952 | 955 | 958 | 961 | 964 | 967 | 970 | 973 | 976 | 979 | 982 | 985 | 988 | 991 | 994 | 997 | 1000 | 1003 | 1006 | 1009 | 1012 | 1015 | 1018 | 1021 | 1024 | 1027 | 1030 | 1033 | 1036 | 1039 | 1042 | 1045 | 1048 | 1051 | 1054 | 1057 | 1060 | 1063 | 1066 | 1069 | 1072 | 1075 | 1078 | 1081 | 1084 | 1087 | 1090 | 1093 | 1096 | 1099 | 1102 | 1105 | 1108 | 1111 | 1114 | 1117 | 1120 | 1123 | 1126 | 1129 | 1132 | 1135 | 1138 | 1141 | 1144 | 1147 | 1150 | 1153 | 1154 | 1157 | 1158 | 1162 | 1163 | 1164 | 1165 | 1166 | 1167 | 1168 | 1169 | 1170 | 1171 | 1177 | 1178 | 1182 | 1183 | 1184 | 1185 | 1186 | 1187 | 1188 | 1189 | 1190 | --------------------------------------------------------------------------------