/* * 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; } } }