de.qspool.clementineremote.backend.receivers.ClementinePhoneStateCheck.java Source code

Java tutorial

Introduction

Here is the source code for de.qspool.clementineremote.backend.receivers.ClementinePhoneStateCheck.java

Source

/* This file is part of the Android Clementine Remote.
 * Copyright (C) 2013, Andreas Muttscheller <asfa194@gmail.com>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

package de.qspool.clementineremote.backend.receivers;

import android.Manifest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Message;
import android.preference.PreferenceManager;
import android.support.v4.content.ContextCompat;
import android.telephony.TelephonyManager;

import de.qspool.clementineremote.App;
import de.qspool.clementineremote.SharedPreferencesKeys;
import de.qspool.clementineremote.backend.Clementine;
import de.qspool.clementineremote.backend.pb.ClementineMessage;
import de.qspool.clementineremote.backend.pb.ClementineMessageFactory;
import de.qspool.clementineremote.backend.pb.ClementineRemoteProtocolBuffer;

public class ClementinePhoneStateCheck extends BroadcastReceiver {

    private static String lastPhoneState = TelephonyManager.EXTRA_STATE_IDLE;

    @Override
    public void onReceive(Context context, Intent intent) {
        if (App.getApp() == null || App.ClementineConnection == null || App.Clementine == null
                || !App.ClementineConnection.isConnected()) {
            return;
        }

        if (!intent.getAction().equals("android.intent.action.PHONE_STATE")) {
            return;
        }

        if (ContextCompat.checkSelfPermission(context,
                Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
            return;
        }

        // Check if we need to change the volume
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(App.getApp());
        String volumeString = prefs.getString(SharedPreferencesKeys.SP_CALL_VOLUME, Clementine.DefaultCallVolume);
        int volume = Integer.parseInt(volumeString);

        // Get the pebble settings
        if (prefs.getBoolean(SharedPreferencesKeys.SP_LOWER_VOLUME, true)) {
            // Get the current state of the telephone
            String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);

            // On Lollipop, the state is broadcasted twice. Only process new states.
            if (lastPhoneState.equals(state))
                return;

            Message msg = Message.obtain();

            LastClementineState lastClementineState = new LastClementineState();
            lastClementineState.load();

            if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)
                    || state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {

                // Only lower the volume once. When receiving a call, the state is RINGING. On pickup
                // OFFHOOK is broadcasted. So we only need to take action when we previously had the
                // IDLE state.
                if (lastPhoneState.equals(TelephonyManager.EXTRA_STATE_IDLE)) {
                    lastClementineState.volume = App.Clementine.getVolume();
                    lastClementineState.state = App.Clementine.getState();
                    lastClementineState.save();

                    if (volume >= 0) {
                        msg.obj = ClementineMessageFactory.buildVolumeMessage(Integer.parseInt(volumeString));
                    } else {
                        msg.obj = ClementineMessage.getMessage(ClementineRemoteProtocolBuffer.MsgType.PAUSE);
                    }
                }
            } else if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) {
                if (volume >= 0) {
                    msg.obj = ClementineMessageFactory.buildVolumeMessage(lastClementineState.volume);
                } else {
                    if (lastClementineState.state.equals(Clementine.State.PLAY)) {
                        msg.obj = ClementineMessage.getMessage(ClementineRemoteProtocolBuffer.MsgType.PLAY);
                    }
                }
            }

            // Now send the message
            if (msg != null && msg.obj != null && App.ClementineConnection != null) {
                App.ClementineConnection.mHandler.sendMessage(msg);
            }

            lastPhoneState = state;
        }
    }

    private class LastClementineState {
        private final static String KEY_LAST_VOLUME = "phone_last_volume";
        private final static String KEY_LAST_STATE = "phone_last_state";

        public int volume;
        public Clementine.State state;

        public void load() {
            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(App.getApp());
            volume = prefs.getInt(KEY_LAST_VOLUME, App.Clementine.getVolume());
            state = Clementine.State.values()[prefs.getInt(KEY_LAST_STATE, App.Clementine.getState().ordinal())];
        }

        public void save() {
            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(App.getApp());
            SharedPreferences.Editor editor = prefs.edit();

            editor.putInt(KEY_LAST_VOLUME, App.Clementine.getVolume());
            editor.putInt(KEY_LAST_STATE, App.Clementine.getState().ordinal());

            editor.apply();
        }
    }

}