blob: 5e0e7eea51dd76471825908817cfef8e573d3bcb [file] [log] [blame]
/*
* Copyright (C) 2007-2008 Esmertec AG.
* Copyright (C) 2007-2008 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.im.app;
import com.android.im.IImConnection;
import com.android.im.R;
import com.android.im.engine.ImErrorInfo;
import com.android.im.engine.Presence;
import com.android.im.plugin.ImpsConfigNames;
import com.android.im.provider.Imps;
import com.google.android.collect.Lists;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.drawable.Drawable;
import android.os.RemoteException;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.List;
public class UserPresenceView extends LinearLayout {
private ImageButton mStatusDialogButton;
// views of the popup window
TextView mStatusBar;
private final SimpleAlertHandler mHandler;
private IImConnection mConn;
private long mProviderId;
Presence mPresence;
private String mLastStatusText;
final List<StatusItem> mStatusItems = Lists.newArrayList();
public UserPresenceView(Context context, AttributeSet attrs) {
super(context, attrs);
mHandler = new SimpleAlertHandler((Activity)context);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mStatusDialogButton = (ImageButton)findViewById(R.id.statusDropDownButton);
mStatusDialogButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
showStatusListDialog();
}
});
}
private void showStatusListDialog() {
if (mConn == null) {
return;
}
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setAdapter(getStatusAdapter(),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
StatusItem item = mStatusItems.get(which);
int oldStatus = mPresence.getStatus();
if (item.getStatus() != oldStatus) {
updatePresence(item.getStatus(), item.getText().toString());
}
}
});
builder.show();
}
private StatusIconAdapter getStatusAdapter() {
try {
mStatusItems.clear();
int[] supportedStatus = mConn.getSupportedPresenceStatus();
for (int i = 0; i < supportedStatus.length; i++) {
int s = PresenceUtils.convertStatus(supportedStatus[i]);
if (s == Imps.Presence.OFFLINE) {
s = Imps.Presence.INVISIBLE;
}
ImApp app = ImApp.getApplication((Activity)mContext);
BrandingResources brandingRes = app.getBrandingResource(mProviderId);
Drawable icon = brandingRes.getDrawable(PresenceUtils.getStatusIconId(s));
String text = brandingRes.getString(PresenceUtils.getStatusStringRes(s));
mStatusItems.add(new StatusItem(supportedStatus[i], icon, text));
}
} catch (RemoteException e) {
mHandler.showServiceErrorAlert();
}
return new StatusIconAdapter(mContext, mStatusItems);
}
void updateStatusText() {
String newStatusText = mStatusBar.getText().toString();
if (TextUtils.isEmpty(newStatusText)) {
newStatusText = "";
}
if (!newStatusText.equals(mLastStatusText)) {
updatePresence(-1, newStatusText);
}
}
public void setConnection(IImConnection conn) {
mConn = conn;
try {
mPresence = conn.getUserPresence();
mProviderId = conn.getProviderId();
} catch (RemoteException e) {
mHandler.showServiceErrorAlert();
}
if (mPresence == null) {
mPresence = new Presence();
}
updateView();
}
private void updateView() {
ImApp app = ImApp.getApplication((Activity)mContext);
BrandingResources brandingRes = app.getBrandingResource(mProviderId);
int status = PresenceUtils.convertStatus(mPresence.getStatus());
mStatusDialogButton.setImageDrawable(brandingRes.getDrawable(
PresenceUtils.getStatusIconId(status)));
String statusText = mPresence.getStatusText();
if (TextUtils.isEmpty(statusText)) {
statusText = brandingRes.getString(PresenceUtils.getStatusStringRes(status));
}
mLastStatusText = statusText;
if (mStatusBar == null) {
mStatusBar = initStatusBar(mProviderId);
}
mStatusBar.setText(statusText);
// Disable the user to edit the custom status text because
// the AIM and MSN server don't support it now.
ProviderDef provider = app.getProvider(mProviderId);
String providerName = provider == null ? null : provider.mName;
if (Imps.ProviderNames.AIM.equals(providerName)
|| Imps.ProviderNames.MSN.equals(providerName)) {
mStatusBar.setFocusable(false);
}
}
private TextView initStatusBar(long providerId) {
String value = Imps.ProviderSettings.getStringValue(
mContext.getContentResolver(), providerId,
ImpsConfigNames.SUPPORT_USER_DEFINED_PRESENCE);
if ("true".equalsIgnoreCase(value)) {
EditText statusEdit = (EditText) findViewById(R.id.statusEdit);
statusEdit.setVisibility(View.VISIBLE);
statusEdit.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (KeyEvent.ACTION_DOWN == event.getAction()) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_ENTER:
updateStatusText();
return true;
}
}
return false;
}
});
statusEdit.setOnFocusChangeListener(new View.OnFocusChangeListener(){
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
updateStatusText();
}
}
});
return statusEdit;
} else {
TextView statusView = (TextView) findViewById(R.id.statusView);
statusView.setVisibility(View.VISIBLE);
return statusView;
}
}
void updatePresence(int status, String statusText) {
if (mPresence == null) {
// We haven't get the connection yet. Don't allow to update presence now.
return;
}
Presence newPresence = new Presence(mPresence);
if (status != -1) {
newPresence.setStatus(status);
}
newPresence.setStatusText(statusText);
try {
int res = mConn.updateUserPresence(newPresence);
if (res != ImErrorInfo.NO_ERROR) {
mHandler.showAlert(R.string.error,
ErrorResUtils.getErrorRes(getResources(), res));
} else {
mPresence = newPresence;
updateView();
}
} catch (RemoteException e) {
mHandler.showServiceErrorAlert();
}
}
private static class StatusItem implements ImageListAdapter.ImageListItem {
private final int mStatus;
private final Drawable mIcon;
private final String mText;
public StatusItem(int status, Drawable icon, String text) {
mStatus = status;
mIcon = icon;
mText = text;
}
public Drawable getDrawable() {
return mIcon;
}
public CharSequence getText() {
return mText;
}
public int getStatus() {
return mStatus;
}
}
private static class StatusIconAdapter extends ImageListAdapter {
public StatusIconAdapter(Context context, List<StatusItem> data) {
super(context, data);
}
@Override
public long getItemId(int position) {
StatusItem item = (StatusItem)getItem(position);
return item.getStatus();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
return view;
}
}
}