io.v.android.apps.reader.BaseReaderActivity.java Source code

Java tutorial

Introduction

Here is the source code for io.v.android.apps.reader.BaseReaderActivity.java

Source

// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package io.v.android.apps.reader;

import android.Manifest;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.view.GestureDetectorCompat;
import android.view.MotionEvent;

import com.google.android.gms.analytics.HitBuilders;
import com.google.android.gms.analytics.Tracker;

import io.v.android.apps.reader.db.DB;
import io.v.android.apps.reader.model.DeviceInfoFactory;
import io.v.baku.toolkit.VAppCompatActivity;

import static io.v.android.apps.reader.debug.DebugUtils.startSavingLogs;
import static io.v.baku.toolkit.debug.DebugUtils.isApkDebug;

/**
 * Base activity class for all the Reader app activities. Its responsibilities include DB
 * initialization, touch gesture detection, and google analytics tracking
 */
public abstract class BaseReaderActivity extends VAppCompatActivity {

    private String mDeviceId;
    private DB mDB;
    private Tracker mTracker;
    private UserActionLogger mLogger;
    private GestureDetectorCompat mGestureDetector;
    private GestureListener mGestureListener;

    protected DB getDB() {
        return mDB;
    }

    protected Tracker getTracker() {
        return mTracker;
    }

    protected UserActionLogger getLogger() {
        return mLogger;
    }

    protected String getDeviceId() {
        if (mDeviceId == null) {
            mDeviceId = DeviceInfoFactory.getDeviceId(this);
        }

        return mDeviceId;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        initTracker();

        // TODO(youngseokyoon): allow screen rotation and properly handle orientation changes
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        // Initialize the DB
        mDB = DB.Singleton.get(this);
        mDB.init(this);
    }

    @Override
    protected void onResume() {
        super.onResume();

        if (mTracker != null) {
            String deviceId = DeviceInfoFactory.getDeviceId(this);
            mTracker.setScreenName(String.format("%s.%s", deviceId, getClass().getSimpleName()));
            mTracker.send(new HitBuilders.ScreenViewBuilder()
                    .setCustomDimension(1, Long.toString(System.currentTimeMillis())).build());
        }
    }

    private void initTracker() {
        if (!Utils.hasExternalStoragePermission(this)) {
            ActivityCompat.requestPermissions(this,
                    new String[] { Manifest.permission.READ_EXTERNAL_STORAGE,
                            Manifest.permission.WRITE_EXTERNAL_STORAGE },
                    Constants.REQUEST_CODE_PERMISSION_EXTERNAL_STORAGE);
        }

        // TODO(youngseokyoon): consolidate the Tracker into UserActionLogger
        mLogger = UserActionLogger.getInstance(this);
        mGestureListener = new GestureListener(this);
        mGestureDetector = new GestureDetectorCompat(this, mGestureListener);
        mGestureDetector.setOnDoubleTapListener(mGestureListener);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        // Forward all the touch event to the gesture detector.
        // Implementing this in onTouchEvent is not enough, because it can only capture touch events
        // that are not consumed by any child views.
        if (mGestureDetector != null) {
            mGestureDetector.onTouchEvent(ev);
        }

        return super.dispatchTouchEvent(ev);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        switch (requestCode) {
        case Constants.REQUEST_CODE_PERMISSION_EXTERNAL_STORAGE:
            // If the permission is granted, reinitialize the loggers.
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                mLogger.initPrinters();

                if (isApkDebug(this)) {
                    startSavingLogs(this, Constants.APP_NAME);
                }
            }
            break;

        default:
            break;
        }
    }
}