summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3/RemoteFolder.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/launcher3/RemoteFolder.java')
-rw-r--r--src/com/android/launcher3/RemoteFolder.java260
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();
+ }
+}