/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.google.gce.gceservice;

import android.content.ContentResolver;
import android.content.Context;
import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;
import android.util.Log;

/**
 * Forces pacakge verification to be off on N and N-MR1 by adjusting package_verifier_user_consent.
 *
 * This is needed because CVDs don't have a touch screen, and the consent
 * dialog will block apk installs.
 *
 * Possible values for consent seem to be:
 *   -1 The user refused
 *    0 Ask the user
 *    1 The user accepted
 *
 * This code polls because Android may overwrite a non-zero value with a 0
 * at some point after boot completes. However, this happens only on some
 * boots, so it can't be a blocker for boot complete.
 */
class PackageVerificationConsentEnforcer extends JobBase {
    private static final String LOG_TAG = "GcePVCR";
    private static final String PACKAGE_VERIFIER_USER_CONSENT = "package_verifier_user_consent";
    private final Context mContext;

    // Chosen to avoid the possible values (see top comment).
    private int mLastObservedValue = -2;


    public PackageVerificationConsentEnforcer(Context context) {
        super(LOG_TAG);
        mContext = context;
    }


    public int execute() {
        if (android.os.Build.VERSION.SDK_INT < 24) {
            // Skip older android versions.
            return 0;
        }

        try {
            ContentResolver contentResolver = mContext.getContentResolver();
            int value = Settings.Secure.getInt(contentResolver, PACKAGE_VERIFIER_USER_CONSENT);
            if (value != mLastObservedValue) {
                mLastObservedValue = value;
            }

            if (value == 0) {
                Settings.Secure.putInt(mContext.getContentResolver(), PACKAGE_VERIFIER_USER_CONSENT, -1);
            }
        } catch (SettingNotFoundException e) {
        }

        return 1;
    }


    public void onDependencyFailed(Exception e) {
        Log.e(LOG_TAG, "Could not start Consent Enforcer.", e);
    }
}


