net.gcompris.GComprisActivity.java Source code

Java tutorial

Introduction

Here is the source code for net.gcompris.GComprisActivity.java

Source

/****************************************************************************
**
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the QtAndroidExtras module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia.  For licensing terms and
** conditions see http://qt.digia.com/licensing.  For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file.  Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Digia gives you certain additional
** rights.  These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3.0 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.  Please review the following information to
** ensure the GNU General Public License version 3.0 requirements will be
** met: http://www.gnu.org/copyleft/gpl.html.
**
**
** $QT_END_LICENSE$
**
****************************************************************************/

package net.gcompris;

import org.qtproject.qt5.android.bindings.QtApplication;
import org.qtproject.qt5.android.bindings.QtActivity;
import com.android.vending.billing.*;
import android.media.AudioManager;
import android.util.Log;
import android.os.Bundle;
import android.os.IBinder;
import android.content.ServiceConnection;
import android.content.Intent;
import android.content.ComponentName;
import android.content.Context;
import android.app.PendingIntent;
import org.json.JSONObject;
import java.util.ArrayList;
import android.view.WindowManager;
import java.text.Collator;
import java.util.Locale;

public class GComprisActivity extends QtActivity {
    private static GComprisActivity m_instance;
    //    public static final String SKU_NAME = "android.test.purchased"; // for testing
    public static final String SKU_NAME = "full";

    private IInAppBillingService m_service;
    private ServiceConnection m_serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceDisconnected(ComponentName name) {
            m_service = null;
        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            if (service.isBinderAlive()) {
                m_service = IInAppBillingService.Stub.asInterface(service);
            }
        }
    };

    public GComprisActivity() {
        m_instance = this;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Intent intent = new Intent("com.android.vending.billing.InAppBillingService.BIND");
        intent.setPackage("com.android.vending");
        bindService(intent, m_serviceConnection, Context.BIND_AUTO_CREATE);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        unbindService(m_serviceConnection);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode == RESULT_OK && data != null && requestCode == 1001) {
            int responseCode = data.getIntExtra("RESPONSE_CODE", -1);
            String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA");

            try {
                JSONObject jo = new JSONObject(purchaseData);
                String sku = jo.getString("productId");
                int purchaseState = jo.getInt("purchaseState");
                String payload = jo.getString("developerPayload");
                String purchaseToken = jo.getString("purchaseToken");
                if (sku.equals(SKU_NAME) && purchaseState == 0) {
                    bought(true);
                    return;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

            Log.e(QtApplication.QtTAG, "Buying full version failed: Result code == " + resultCode);
        }
    }

    private static native void bought(boolean b);

    public static void buyGCompris() {
        if (m_instance.m_service == null) {
            Log.e(QtApplication.QtTAG, "Buying full version failed: No billing service");
            return;
        }

        try {
            Bundle buyIntentBundle = m_instance.m_service.getBuyIntent(3, m_instance.getPackageName(), SKU_NAME,
                    "inapp", "");
            int responseCode = buyIntentBundle.getInt("RESPONSE_CODE");
            if (responseCode == 0 /* BILLING_RESPONSE_RESULT_OK */) {
                PendingIntent pendingIntent = buyIntentBundle.getParcelable("BUY_INTENT");
                m_instance.startIntentSenderForResult(pendingIntent.getIntentSender(), 1001, new Intent(),
                        Integer.valueOf(0), Integer.valueOf(0), Integer.valueOf(0));
                return;
            } else if (responseCode == 7 /* BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED */) {
                bought(true);
            } else {
                Log.e(QtApplication.QtTAG, "Buying full version failed: Response code == " + responseCode);
            }
        } catch (Exception e) {
            Log.e(QtApplication.QtTAG, "Exception caught when buying full version!", e);
        }
    }

    public static void checkPayment() {
        if (m_instance.m_service == null) {
            Log.e(QtApplication.QtTAG, "Check full version is bought failed: No billing service");
            return;
        }

        try {
            Bundle ownedItems = m_instance.m_service.getPurchases(3, m_instance.getPackageName(), "inapp", null);
            int responseCode = ownedItems.getInt("RESPONSE_CODE");
            if (responseCode == 0) {
                ArrayList ownedSkus = ownedItems.getStringArrayList("INAPP_PURCHASE_ITEM_LIST");
                ArrayList purchaseDataList = ownedItems.getStringArrayList("INAPP_PURCHASE_DATA_LIST");
                for (int i = 0; i < purchaseDataList.size(); ++i) {
                    String purchaseData = (String) purchaseDataList.get(i);
                    String sku = (String) ownedSkus.get(i);

                    if (sku.equals(SKU_NAME)) {
                        bought(true);
                        return;
                    } else {
                        Log.e(QtApplication.QtTAG, "Unknown item bought " + sku);
                    }
                }
                bought(false);
                return;
            } else {
                bought(false);
                Log.e(QtApplication.QtTAG, "Item not owed " + responseCode);
            }
        } catch (Exception e) {
            Log.e(QtApplication.QtTAG, "Exception caught when checking if full version is bought!", e);
        }
    }

    public static boolean requestAudioFocus() {
        Context mContext = m_instance.getApplicationContext();
        AudioManager am = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);

        // Request audio focus for playback
        int result = am.requestAudioFocus(null,
                // Use the music stream.
                AudioManager.STREAM_MUSIC,
                // Request permanent focus.
                AudioManager.AUDIOFOCUS_GAIN);

        if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
            return true;
        }
        return false;
    }

    public static void abandonAudioFocus() {
        // Abandon audio focus
        Context mContext = m_instance.getApplicationContext();
        AudioManager am = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
        am.abandonAudioFocus(null);
    }

    /**
     * Toggle activation of screen-saver
     *
     * Note that the window flags *must* be modified from the UI thread
     * otherwise it has no effect.
     *
     * @param value  Whether screensaver should be enabled or disabled
     */
    public void setKeepScreenOn(boolean value) {
        if (value)
            GComprisActivity.this.runOnUiThread(new Runnable() {
                public void run() {
                    Log.d(QtApplication.QtTAG, "Disabling screensaver");
                    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
                }
            });
        else
            GComprisActivity.this.runOnUiThread(new Runnable() {
                public void run() {
                    Log.d(QtApplication.QtTAG, "Enabling screensaver");
                    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
                }
            });
    }

    public int localeCompare(String a, String b, String locale) {
        String[] parts = locale.split("[\\._]");
        Locale l;
        if (parts.length == 1)
            l = new Locale(parts[0]);
        else if (parts.length == 2)
            l = new Locale(parts[0], parts[1]);
        else
            l = Locale.getDefault();
        Collator collator = Collator.getInstance(l);
        // Note: This works only if the device supports the
        // passed locale. If it does not or if an invalid locale string has been
        // passed, the collator seems to sort according to Locale.getDefault()
        return collator.compare(a, b);
    }
}