diff --git a/application/res/layout/conversations.xml b/application/res/layout/conversations.xml index b235430..fea7b56 100644 --- a/application/res/layout/conversations.xml +++ b/application/res/layout/conversations.xml @@ -19,7 +19,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Yaaic. If not, see . --> -. android:drawableLeft="@android:drawable/ic_btn_speak_now" android:visibility="gone" /> - + diff --git a/application/src/org/yaaic/activity/ConversationActivity.java b/application/src/org/yaaic/activity/ConversationActivity.java index 24a2bc9..d2ff4d3 100644 --- a/application/src/org/yaaic/activity/ConversationActivity.java +++ b/application/src/org/yaaic/activity/ConversationActivity.java @@ -65,6 +65,7 @@ import android.content.ServiceConnection; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.res.Configuration; +import android.graphics.Rect; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; @@ -84,6 +85,7 @@ import android.widget.Button; import android.widget.EditText; import android.widget.Gallery; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import android.widget.ViewSwitcher; diff --git a/application/src/org/yaaic/view/ConversationLayout.java b/application/src/org/yaaic/view/ConversationLayout.java new file mode 100644 index 0000000..6f9eae3 --- /dev/null +++ b/application/src/org/yaaic/view/ConversationLayout.java @@ -0,0 +1,135 @@ +/* +Yaaic - Yet Another Android IRC Client + +Copyright 2009-2011 Sebastian Kaspari + +This file is part of Yaaic. + +Yaaic 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. + +Yaaic 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 Yaaic. If not, see . + */ +package org.yaaic.view; + +import org.yaaic.model.Settings; + +import android.app.Activity; +import android.content.Context; +import android.content.res.Configuration; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.LinearLayout; + +/** + * ConversationLayout: LinearLayout that resizes correctly when an IME + * comes up in fullscreen mode + * + * @author Steven Luo + */ +public class ConversationLayout extends LinearLayout +{ + Activity activity; + int curHeight = 0; + boolean fullscreen = false, isLandscape = false; + boolean redoLayout = false; + + /** + * Create a new conversation view switcher + * + * @param context + */ + public ConversationLayout(Context context) + { + super(context); + doInit(context); + } + + /** + * Create a new conversation view switcher + * + * @param context + * @param attrs + */ + public ConversationLayout(Context context, AttributeSet attrs) + { + super(context, attrs); + doInit(context); + } + + /** + * Initialize the ConversationLayout + */ + private void doInit(Context context) + { + activity = (Activity) context; + fullscreen = (new Settings(context)).fullscreenConversations(); + isLandscape = (activity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE); + } + + /** + * Get the height of the window's visible area + */ + private int getWindowHeight() + { + Rect visible = new Rect(); + getWindowVisibleDisplayFrame(visible); + return visible.height(); + } + + /** + * onMeasure (ask the view how much space it wants) + * This is called when the window size changes, so we can hook into it to + * resize ourselves when the IME comes up + */ + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) + { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + /* XXX: We should probably use some heuristic of how many pixels are + available for deciding whether to scroll instead of resize, instead + of refusing to resize in landscape */ + if (!fullscreen || isLandscape) { + return; + } + + int height = getWindowHeight(); + if (curHeight != height) { + curHeight = height; + FrameLayout.LayoutParams params = new FrameLayout.LayoutParams( + FrameLayout.LayoutParams.FILL_PARENT, + height + ); + params.gravity = Gravity.BOTTOM | Gravity.CLIP_VERTICAL; + setLayoutParams(params); + redoLayout = true; + } + } + + /** + * onDraw (draw the view) + */ + @Override + protected void onDraw(Canvas canvas) + { + if (redoLayout) { + // Layout params have changed -- force a layout update + requestLayout(); + redoLayout = false; + } + super.onDraw(canvas); + } +}