/*
HostSettingProfile.java
Copyright (c) 2014 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.deviceplugin.host.profile;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import org.deviceconnect.android.activity.IntentHandlerActivity;
import org.deviceconnect.android.message.MessageUtils;
import org.deviceconnect.android.profile.SettingProfile;
import org.deviceconnect.android.profile.api.DConnectApi;
import org.deviceconnect.android.profile.api.GetApi;
import org.deviceconnect.android.profile.api.PutApi;
import org.deviceconnect.message.DConnectMessage;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.ResultReceiver;
import android.provider.Settings;
/**
* Settingsプロファイル.
*
* @author NTT DOCOMO, INC.
*/
public class HostSettingProfile extends SettingProfile {
/** Light Levelの最大値. */
private static final int MAX_LIGHT_LEVEL = 255;
/**
* 日付フォーマット.
*/
private SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy'-'MM'-'dd' 'kk':'mm':'ss'+0900'",
Locale.getDefault());
private final DConnectApi mGetSoundVolumeApi = new GetApi() {
@Override
public String getInterface() {
return INTERFACE_SOUND;
}
@Override
public String getAttribute() {
return ATTRIBUTE_VOLUME;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
VolumeKind kind = getVolumeKind(request);
AudioManager manager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
double volume = 0.0;
double maxVolume = 1.0;
if (kind == VolumeKind.ALARM) {
volume = manager.getStreamVolume(AudioManager.STREAM_ALARM);
maxVolume = manager.getStreamMaxVolume(AudioManager.STREAM_ALARM);
setResult(response, DConnectMessage.RESULT_OK);
setVolumeLevel(response, volume / maxVolume);
} else if (kind == VolumeKind.CALL) {
volume = manager.getStreamVolume(AudioManager.STREAM_VOICE_CALL);
maxVolume = manager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL);
setResult(response, DConnectMessage.RESULT_OK);
setVolumeLevel(response, volume / maxVolume);
} else if (kind == VolumeKind.RINGTONE) {
volume = manager.getStreamVolume(AudioManager.STREAM_RING);
maxVolume = manager.getStreamMaxVolume(AudioManager.STREAM_RING);
setResult(response, DConnectMessage.RESULT_OK);
setVolumeLevel(response, volume / maxVolume);
} else if (kind == VolumeKind.MAIL) {
volume = manager.getStreamVolume(AudioManager.STREAM_RING);
maxVolume = manager.getStreamMaxVolume(AudioManager.STREAM_RING);
setResult(response, DConnectMessage.RESULT_OK);
setVolumeLevel(response, volume / maxVolume);
} else if (kind == VolumeKind.MEDIA_PLAYER) {
volume = manager.getStreamVolume(AudioManager.STREAM_MUSIC);
maxVolume = manager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
setResult(response, DConnectMessage.RESULT_OK);
setVolumeLevel(response, volume / maxVolume);
} else if (kind == VolumeKind.OTHER) {
MessageUtils.setNotSupportAttributeError(response, "volume type is not support.");
} else {
MessageUtils.setInvalidRequestParameterError(response, "type is invalid.");
}
return true;
}
};
private final DConnectApi mGetDateApi = new GetApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_DATE;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
setDate(response, mDateFormat.format(new Date()));
setResult(response, DConnectMessage.RESULT_OK);
return true;
}
};
private final DConnectApi mGetDisplayBrightnessApi = new GetApi() {
@Override
public String getInterface() {
return INTERFACE_DISPLAY;
}
@Override
public String getAttribute() {
return ATTRIBUTE_BRIGHTNESS;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
// 自動調整ボタンが有効な場合 0が変える
// 端末画面の明るさを取得(0~255)
double level = Settings.System.getInt(getContext().getContentResolver(), Settings.System.SCREEN_BRIGHTNESS,
0);
double maxLevel = MAX_LIGHT_LEVEL;
setLightLevel(response, level / maxLevel);
setResult(response, DConnectMessage.RESULT_OK);
return true;
}
};
private final DConnectApi mGetDisplaySleepApi = new GetApi() {
@Override
public String getInterface() {
return INTERFACE_DISPLAY;
}
@Override
public String getAttribute() {
return ATTRIBUTE_SLEEP;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
int timeout = Settings.System.getInt(getContext().getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT,
0);
setTime(response, timeout);
setResult(response, DConnectMessage.RESULT_OK);
return true;
}
};
private final DConnectApi mPutSoundVolumeApi = new PutApi() {
@Override
public String getInterface() {
return INTERFACE_SOUND;
}
@Override
public String getAttribute() {
return ATTRIBUTE_VOLUME;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
VolumeKind kind = getVolumeKind(request);
Double level = getVolumeLevel(request);
AudioManager manager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
double maxVolume = 1;
if (kind == VolumeKind.ALARM) {
maxVolume = manager.getStreamMaxVolume(AudioManager.STREAM_ALARM);
manager.setStreamVolume(AudioManager.STREAM_ALARM, (int) (maxVolume * level), 1);
setResult(response, DConnectMessage.RESULT_OK);
} else if (kind == VolumeKind.CALL) {
maxVolume = manager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL);
manager.setStreamVolume(AudioManager.STREAM_VOICE_CALL, (int) (maxVolume * level), 1);
setResult(response, DConnectMessage.RESULT_OK);
} else if (kind == VolumeKind.RINGTONE) {
maxVolume = manager.getStreamMaxVolume(AudioManager.STREAM_RING);
manager.setStreamVolume(AudioManager.STREAM_RING, (int) (maxVolume * level), 1);
setResult(response, DConnectMessage.RESULT_OK);
} else if (kind == VolumeKind.MAIL) {
maxVolume = manager.getStreamMaxVolume(AudioManager.STREAM_RING);
manager.setStreamVolume(AudioManager.STREAM_RING, (int) (maxVolume * level), 1);
setResult(response, DConnectMessage.RESULT_OK);
} else if (kind == VolumeKind.MEDIA_PLAYER) {
maxVolume = manager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
manager.setStreamVolume(AudioManager.STREAM_MUSIC, (int) (maxVolume * level), 1);
setResult(response, DConnectMessage.RESULT_OK);
} else if (kind == VolumeKind.OTHER) {
MessageUtils.setNotSupportAttributeError(response, "volume type is not support.");
} else {
MessageUtils.setInvalidRequestParameterError(response, "type is invalid.");
}
return true;
}
};
private final DConnectApi mPutDisplayBrightnessApi = new PutApi() {
@Override
public String getInterface() {
return INTERFACE_DISPLAY;
}
@Override
public String getAttribute() {
return ATTRIBUTE_BRIGHTNESS;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
final String serviceId = getServiceID(request);
final Double level = getLightLevel(request);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (Settings.System.canWrite(getContext())) {
onPutDisplayLightInternal(request, response, serviceId, level);
} else {
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS,
Uri.parse("package:" + getContext().getPackageName()));
IntentHandlerActivity.startActivityForResult(getContext(), intent,
new ResultReceiver(new Handler(Looper.getMainLooper())) {
@Override
protected void onReceiveResult(final int resultCode, final Bundle resultData) {
if (Settings.System.canWrite(getContext())) {
onPutDisplayLightInternal(request, response, serviceId, level);
} else {
MessageUtils.setIllegalServerStateError(response,
"WRITE_SETTINGS permisson not granted");
}
sendResponse(response);
}
});
return false;
}
} else {
onPutDisplayLightInternal(request, response, serviceId, level);
}
return true;
}
};
private final DConnectApi mPutDisplaySleepApi = new PutApi() {
@Override
public boolean onRequest(final Intent request, final Intent response) {
final String serviceId = getServiceID(request);
final Integer time = getTime(request);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (Settings.System.canWrite(getContext())) {
onPutDisplaySleepInternal(request, response, serviceId, time);
} else {
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS,
Uri.parse("package:" + getContext().getPackageName()));
IntentHandlerActivity.startActivityForResult(getContext(), intent,
new ResultReceiver(new Handler(Looper.getMainLooper())) {
@Override
protected void onReceiveResult(final int resultCode, final Bundle resultData) {
if (Settings.System.canWrite(getContext())) {
onPutDisplaySleepInternal(request, response, serviceId, time);
} else {
MessageUtils.setIllegalServerStateError(response,
"WRITE_SETTINGS permisson not granted");
}
sendResponse(response);
}
});
return false;
}
} else {
onPutDisplaySleepInternal(request, response, serviceId, time);
}
return true;
}
};
public HostSettingProfile() {
addApi(mGetSoundVolumeApi);
addApi(mGetDateApi);
addApi(mGetDisplayBrightnessApi);
addApi(mGetDisplaySleepApi);
addApi(mPutSoundVolumeApi);
addApi(mPutDisplayBrightnessApi);
addApi(mPutDisplaySleepApi);
}
private void onPutDisplayLightInternal(final Intent request, final Intent response, final String serviceId,
final Double level) {
if (level == null || level < 0 || level > 1.0) {
MessageUtils.setInvalidRequestParameterError(response, "level is invalid.");
return;
}
Settings.System.putInt(getContext().getContentResolver(), Settings.System.SCREEN_BRIGHTNESS,
(int) (MAX_LIGHT_LEVEL * level));
setResult(response, DConnectMessage.RESULT_OK);
}
private void onPutDisplaySleepInternal(final Intent request, final Intent response, final String serviceId,
final Integer time) {
if (time == null || time < 0.0) {
MessageUtils.setInvalidRequestParameterError(response, "time is invalid.");
return;
}
if (Settings.System.putInt(getContext().getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, time)) {
setResult(response, DConnectMessage.RESULT_OK);
} else {
MessageUtils.setUnknownError(response, "Failed to set display sleep timeout.");
}
}
}