diff options
Diffstat (limited to 'src/com/android/launcher3/RemoteFolder.java')
-rw-r--r-- | src/com/android/launcher3/RemoteFolder.java | 260 |
1 files changed, 260 insertions, 0 deletions
diff --git a/src/com/android/launcher3/RemoteFolder.java b/src/com/android/launcher3/RemoteFolder.java new file mode 100644 index 000000000..0d33a5536 --- /dev/null +++ b/src/com/android/launcher3/RemoteFolder.java @@ -0,0 +1,260 @@ +package com.android.launcher3; + +import android.content.Context; +import android.content.SharedPreferences; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.ScrollView; +import android.widget.TextView; + +/** + * Created by tmiller on 11/24/15. + */ +public class RemoteFolder extends Folder { + + public static final String TAG = "RemoteFolder"; + public static final String REMOTE_FOLDER_ENABLED = "remote_folder_enabled"; + private ScrollView mContentScrollView; + private ImageView mFolderInfo; + private TextView mFolderHelpText; + private Button mCloseInfoButton; + private Button mDisableFolderButton; + private View mFolderInfoContainer; + + private int mFolderInfoContainerHeight; + private int mHelpTextHeight; + private int mHelpTextWidth; + private int mButtonHeight; + private int mFolderInfoIconHeight; + /** + * Used to inflate the Workspace from XML. + * + * @param context The application's context. + * @param attrs The attribtues set containing the Workspace's customization values. + */ + public RemoteFolder(Context context, AttributeSet attrs) { + super(context, attrs); + } + + /** + * Creates a new UserFolder, inflated from R.layout.remote_folder. + * + * @param context The application's context. + * + * @return A new UserFolder. + */ + static RemoteFolder fromXml(Context context) { + return (RemoteFolder) LayoutInflater.from(context).inflate(R.layout.remote_folder, null); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + int measureSpec = MeasureSpec.UNSPECIFIED; + + mContentScrollView = (ScrollView) findViewById(R.id.scroll_view); + + mFolderInfoContainer = findViewById(R.id.folder_info_container); + mFolderInfoContainer.measure(measureSpec, measureSpec); + mFolderInfoContainerHeight = mFolderInfoContainer.getMeasuredHeight(); + + mFolderInfo = (ImageView) findViewById(R.id.folder_info); + mFolderInfo.measure(measureSpec, measureSpec); + mFolderInfoIconHeight = mFolderInfo.getMeasuredHeight(); + mFolderInfo.setOnClickListener(this); + + mFolderHelpText = (TextView) findViewById(R.id.help_text_view); + mFolderHelpText.setText(getResources().getString(R.string.recommendations_help_text)); + mFolderHelpText.measure(measureSpec, measureSpec); + mHelpTextHeight = (mFolderHelpText.getLineHeight() * mFolderHelpText.getLineCount()) + + mFolderHelpText.getPaddingTop() + mFolderHelpText.getPaddingBottom(); + mHelpTextWidth = mFolderHelpText.getMeasuredWidth(); + mFolderHelpText.setVisibility(GONE); + + mCloseInfoButton = (Button) findViewById(R.id.close_info_button); + mCloseInfoButton.setText(getResources().getString(R.string.close)); + mCloseInfoButton.measure(measureSpec, measureSpec); + mButtonHeight = mCloseInfoButton.getMeasuredHeight(); + mCloseInfoButton.setOnClickListener(this); + + mDisableFolderButton = (Button) findViewById(R.id.disable_remote_folder_button); + mDisableFolderButton.setText(getResources().getString(R.string.disable)); + mDisableFolderButton.measure(measureSpec, measureSpec); + mDisableFolderButton.setOnClickListener(this); + } + + protected int getFolderHeight() { + if (mFolderHelpText.getVisibility() == VISIBLE) { + mHelpTextHeight = (mFolderHelpText.getLineHeight() * mFolderHelpText.getLineCount()) + + mFolderHelpText.getPaddingTop() + mFolderHelpText.getPaddingBottom(); + + int height = getPaddingTop() + getPaddingBottom() + mFolderInfoIconHeight + + mHelpTextHeight + mButtonHeight; + return height; + } else { + int height = getPaddingTop() + getPaddingBottom() + mFolderInfoIconHeight + + getContentAreaHeight(); + return height; + + } + } + + private int getFolderWidth() { + if (mFolderHelpText.getVisibility() == VISIBLE) { + DisplayMetrics displayMetrics = this.getResources().getDisplayMetrics(); + int screenWidth = displayMetrics.widthPixels; + int width = Math.min(mHelpTextWidth, screenWidth - getPaddingLeft() - getPaddingRight()); + return width; + } else { + int width = getPaddingLeft() + getPaddingRight() + mContent.getDesiredWidth(); + return width; + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + // TODO (Tyson): clean this up before merging into main CM branch + int width = getFolderWidth(); + int height = getFolderHeight(); + int contentAreaWidthSpec = MeasureSpec.makeMeasureSpec(getContentAreaWidth(), + MeasureSpec.EXACTLY); + int contentAreaHeightSpec = MeasureSpec.makeMeasureSpec(getContentAreaHeight(), + MeasureSpec.EXACTLY); + + if (LauncherAppState.isDisableAllApps()) { + // Don't cap the height of the content to allow scrolling. + mContent.setFixedSize(getContentAreaWidth(), mContent.getDesiredHeight()); + } else { + mContent.setFixedSize(getContentAreaWidth(), getContentAreaHeight()); + } + mContentScrollView.measure(contentAreaWidthSpec, contentAreaHeightSpec); + + if (mFolderHelpText.getVisibility() == VISIBLE) { + mHelpTextHeight = (mFolderHelpText.getLineHeight() * mFolderHelpText.getLineCount()) + + mFolderHelpText.getPaddingTop() + mFolderHelpText.getPaddingBottom(); + + mFolderHelpText.measure(contentAreaWidthSpec, MeasureSpec.makeMeasureSpec( + mHelpTextHeight, MeasureSpec.EXACTLY)); + mFolderInfoContainer.measure(contentAreaWidthSpec, + MeasureSpec.makeMeasureSpec( + mFolderInfoIconHeight + mHelpTextHeight + mButtonHeight, MeasureSpec.EXACTLY)); + mCloseInfoButton.measure(contentAreaWidthSpec, + MeasureSpec.makeMeasureSpec(mButtonHeight, MeasureSpec.EXACTLY)); + mDisableFolderButton.measure(contentAreaWidthSpec, + MeasureSpec.makeMeasureSpec(mButtonHeight, MeasureSpec.EXACTLY)); + } else { + mHelpTextHeight = 0; + mFolderHelpText.measure(contentAreaWidthSpec, MeasureSpec.makeMeasureSpec( + mHelpTextHeight, MeasureSpec.EXACTLY)); + mFolderInfoContainer.measure(contentAreaWidthSpec, + MeasureSpec.makeMeasureSpec(mFolderInfoIconHeight, MeasureSpec.EXACTLY)); + mCloseInfoButton.measure(contentAreaWidthSpec, + MeasureSpec.makeMeasureSpec(0, MeasureSpec.EXACTLY)); + mDisableFolderButton.measure(contentAreaWidthSpec, + MeasureSpec.makeMeasureSpec(0, MeasureSpec.EXACTLY)); + } + + Log.e(TAG, "onMeasure(), width: " + width + ", height:" + height); + + setMeasuredDimension(width, height); + } + + public void onClick(View v) { + Object tag = v.getTag(); + if (tag instanceof ShortcutInfo) { + mLauncher.onClick(v); + } + + switch (v.getId()) { + case R.id.folder_info: + toggleInfoPane(); + break; + case R.id.close_info_button: + mLauncher.closeFolder(); + break; + case R.id.disable_remote_folder_button: + disableRemoteFolder(); + break; + default: + break; + } + } + + private void toggleInfoPane() { + if (mFolderHelpText.getVisibility() == VISIBLE) { + // info ImageView becomes a close "X" when the help text is showing, handle accordingly + mContentScrollView.setVisibility(VISIBLE); + mContent.setVisibility(VISIBLE); + + mFolderHelpText.setVisibility(GONE); + + mCloseInfoButton.setVisibility(GONE); + mDisableFolderButton.setVisibility(GONE); + + mFolderInfo.setImageDrawable(getResources().getDrawable(R.drawable.ic_launcher_info_normal_holo)); + + } else { + // show the info to the user about remote folders, including the option to disable it + mContentScrollView.setVisibility(GONE); + mContent.setVisibility(GONE); + + mFolderHelpText.setVisibility(VISIBLE); + + mCloseInfoButton.setVisibility(VISIBLE); + mDisableFolderButton.setVisibility(VISIBLE); + + mFolderInfo.setImageDrawable(getResources().getDrawable(R.drawable.ic_launcher_clear_normal_holo)); + } + this.invalidate(); + + } + + private void disableRemoteFolder() { + // close the folder UX & disable remote folders. + mLauncher.closeFolder(); + + if (mContext != null) { + String spKey = LauncherAppState.getSharedPreferencesKey(); + SharedPreferences sp = mContext.getSharedPreferences(spKey, Context.MODE_PRIVATE); + sp.edit().putBoolean(REMOTE_FOLDER_ENABLED, false).commit(); + Log.e(TAG, "Set preference to disable remote folder. Requesting sync to remove existing folder"); + + LauncherModel.deleteFolderContentsFromDatabase(mContext, mInfo); + LauncherModel.deleteItemFromDatabase(mContext, mInfo); + mLauncher.getWorkspace().removeView(this); + mLauncher.removeFolder(mInfo); + + mLauncher.getWorkspace().refreshDrawableState(); + } + } + + @Override + public void animateClosed(boolean animate) { + super.animateClosed(animate); + mFolderHelpText.setVisibility(GONE); + mCloseInfoButton.setVisibility(GONE); + mDisableFolderButton.setVisibility(GONE); + mContentScrollView.setVisibility(VISIBLE); + mFolderInfo.setImageDrawable(getResources().getDrawable(R.drawable.ic_launcher_info_normal_holo)); + } + + @Override + public void animateOpen(Workspace workspace, int[] folderTouch) { + super.animateOpen(workspace, folderTouch); + + mFolderHelpText.setText(getResources().getString(R.string.recommendations_help_text)); + mFolderHelpText.setVisibility(GONE); + mCloseInfoButton.setVisibility(GONE); + mDisableFolderButton.setVisibility(GONE); + mContentScrollView.setVisibility(VISIBLE); + mContent.setVisibility(VISIBLE); + mFolderInfo.setImageDrawable(getResources().getDrawable(R.drawable.ic_launcher_info_normal_holo)); + this.invalidate(); + } +} |