199704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan/* 299704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan * Copyright (C) 2011 The Android Open Source Project 399704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan * 499704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan * Licensed under the Apache License, Version 2.0 (the "License"); 599704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan * you may not use this file except in compliance with the License. 699704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan * You may obtain a copy of the License at 799704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan * 899704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan * http://www.apache.org/licenses/LICENSE-2.0 999704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan * 1099704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan * Unless required by applicable law or agreed to in writing, software 1199704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan * distributed under the License is distributed on an "AS IS" BASIS, 1299704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1399704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan * See the License for the specific language governing permissions and 1499704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan * limitations under the License. 1599704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan */ 1699704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan 1799704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chanpackage com.android.calendar; 1899704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan 1999704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chanimport android.content.Context; 2099704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chanimport android.graphics.drawable.Drawable; 2199704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chanimport android.util.AttributeSet; 2299704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chanimport android.view.View; 2399704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chanimport android.view.View.OnClickListener; 2499704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chanimport android.widget.ImageButton; 2599704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chanimport android.widget.LinearLayout; 2699704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chanimport android.widget.TextView; 2799704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan 2899704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chanpublic class ExpandableTextView extends LinearLayout implements OnClickListener { 2999704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan 3099704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan TextView mTv; 3199704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan ImageButton mButton; // Button to expand/collapse 3299704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan 3399704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan private boolean mRelayout = false; 3499704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan private boolean mCollapsed = true; // Show short version as default. 3599704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan private int mMaxCollapsedLines = 8; // The default number of lines; 3699704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan private Drawable mExpandDrawable; 3799704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan private Drawable mCollapseDrawable; 3899704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan 3999704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan public ExpandableTextView(Context context) { 4099704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan super(context); 4199704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan init(); 4299704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan } 4399704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan 4499704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan public ExpandableTextView(Context context, AttributeSet attrs) { 4599704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan super(context, attrs, 0); 4699704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan init(); 4799704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan } 4899704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan 4999704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan public ExpandableTextView(Context context, AttributeSet attrs, int defStyle) { 5099704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan super(context, attrs, defStyle); 5199704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan init(); 5299704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan } 5399704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan 5499704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan void init() { 5599704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan mMaxCollapsedLines = getResources().getInteger((R.integer.event_info_desc_line_num)); 5699704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan mExpandDrawable = getResources().getDrawable(R.drawable.ic_expand_small_holo_light); 5799704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan mCollapseDrawable = getResources().getDrawable(R.drawable.ic_collapse_small_holo_light); 5899704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan } 5999704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan 6099704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan @Override 6199704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan public void onClick(View v) { 6299704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan if (mButton.getVisibility() != View.VISIBLE) { 6399704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan return; 6499704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan } 6599704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan 6699704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan mCollapsed = !mCollapsed; 6799704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan mButton.setImageDrawable(mCollapsed ? mExpandDrawable : mCollapseDrawable); 6899704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan mTv.setMaxLines(mCollapsed ? mMaxCollapsedLines : Integer.MAX_VALUE); 6999704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan } 7099704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan 7199704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan @Override 7299704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 7399704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan // If no change, measure and return 7499704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan if (!mRelayout || getVisibility() == View.GONE) { 7599704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan super.onMeasure(widthMeasureSpec, heightMeasureSpec); 7699704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan return; 7799704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan } 7899704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan mRelayout = false; 7999704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan 8099704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan // Setup with optimistic case 8199704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan // i.e. Everything fits. No button needed 8299704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan mButton.setVisibility(View.GONE); 8399704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan mTv.setMaxLines(Integer.MAX_VALUE); 8499704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan 8599704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan // Measure 8699704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan super.onMeasure(widthMeasureSpec, heightMeasureSpec); 8799704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan 8899704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan // If the text fits in collapsed mode, we are done. 8999704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan if (mTv.getLineCount() <= mMaxCollapsedLines) { 9099704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan return; 9199704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan } 9299704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan 9399704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan // Doesn't fit in collapsed mode. Collapse text view as needed. Show 9499704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan // button. 9599704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan if (mCollapsed) { 9699704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan mTv.setMaxLines(mMaxCollapsedLines); 9799704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan } 9899704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan mButton.setVisibility(View.VISIBLE); 9999704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan 10099704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan // Re-measure with new setup 10199704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan super.onMeasure(widthMeasureSpec, heightMeasureSpec); 10299704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan } 10399704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan 10499704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan private void findViews() { 10599704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan mTv = (TextView) findViewById(R.id.expandable_text); 10699704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan mTv.setOnClickListener(this); 10799704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan mButton = (ImageButton) findViewById(R.id.expand_collapse); 10899704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan mButton.setOnClickListener(this); 10999704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan } 11099704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan 11199704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan public void setText(String text) { 11299704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan mRelayout = true; 11399704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan if (mTv == null) { 11499704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan findViews(); 11599704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan } 11699704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan String trimmedText = text.trim(); 11799704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan mTv.setText(trimmedText); 11899704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan this.setVisibility(trimmedText.length() == 0 ? View.GONE : View.VISIBLE); 11999704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan } 12099704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan 12199704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan public CharSequence getText() { 1223389397186b93936747d4009a35f5bae605c246eMichael Chan if (mTv == null) { 1233389397186b93936747d4009a35f5bae605c246eMichael Chan return ""; 1243389397186b93936747d4009a35f5bae605c246eMichael Chan } 12599704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan return mTv.getText(); 12699704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan } 12799704a2787158bf670fa4a7b4e4f89ace10afa00Michael Chan} 128