diff --git a/api/cm_current.txt b/api/cm_current.txt index a93f52f..5a57e67 100644 --- a/api/cm_current.txt +++ b/api/cm_current.txt @@ -742,14 +742,30 @@ package cyanogenmod.platform { ctor public R.bool(); } + public static final class R.color { + ctor public R.color(); + } + + public static final class R.dimen { + ctor public R.dimen(); + } + public static final class R.drawable { ctor public R.drawable(); } + public static final class R.id { + ctor public R.id(); + } + public static final class R.integer { ctor public R.integer(); } + public static final class R.layout { + ctor public R.layout(); + } + public static final class R.string { ctor public R.string(); } diff --git a/cm/res/res/drawable/dexopt_brand_logo.xml b/cm/res/res/drawable/dexopt_brand_logo.xml new file mode 100644 index 0000000..07afe03 --- /dev/null +++ b/cm/res/res/drawable/dexopt_brand_logo.xml @@ -0,0 +1,35 @@ + + + + + + diff --git a/cm/res/res/drawable/ic_device.xml b/cm/res/res/drawable/ic_device.xml new file mode 100644 index 0000000..be88d71 --- /dev/null +++ b/cm/res/res/drawable/ic_device.xml @@ -0,0 +1,28 @@ + + + + + + diff --git a/cm/res/res/drawable/ic_device_bg.xml b/cm/res/res/drawable/ic_device_bg.xml new file mode 100644 index 0000000..3336946 --- /dev/null +++ b/cm/res/res/drawable/ic_device_bg.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/cm/res/res/drawable/ic_dexopt_obscured.xml b/cm/res/res/drawable/ic_dexopt_obscured.xml new file mode 100644 index 0000000..14c5fef --- /dev/null +++ b/cm/res/res/drawable/ic_dexopt_obscured.xml @@ -0,0 +1,27 @@ + + + + + + diff --git a/cm/res/res/drawable/ic_dexopt_starting.xml b/cm/res/res/drawable/ic_dexopt_starting.xml new file mode 100644 index 0000000..09b4a3a --- /dev/null +++ b/cm/res/res/drawable/ic_dexopt_starting.xml @@ -0,0 +1,27 @@ + + + + + + diff --git a/cm/res/res/drawable/ic_droid.xml b/cm/res/res/drawable/ic_droid.xml new file mode 100644 index 0000000..9ce3a65 --- /dev/null +++ b/cm/res/res/drawable/ic_droid.xml @@ -0,0 +1,35 @@ + + + + + + diff --git a/cm/res/res/drawable/ic_droid_bg.xml b/cm/res/res/drawable/ic_droid_bg.xml new file mode 100644 index 0000000..4c537fa --- /dev/null +++ b/cm/res/res/drawable/ic_droid_bg.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/cm/res/res/layout/dexopt_dialog.xml b/cm/res/res/layout/dexopt_dialog.xml new file mode 100644 index 0000000..a8707ca --- /dev/null +++ b/cm/res/res/layout/dexopt_dialog.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/cm/res/res/values/colors.xml b/cm/res/res/values/colors.xml new file mode 100644 index 0000000..7bf309f --- /dev/null +++ b/cm/res/res/values/colors.xml @@ -0,0 +1,30 @@ + + + + #ffffff + #000000 + #2baae2 + + + @color/black + #212121 + #deffffff + #8affffff + #212121 + @color/cm_cyan + #757575 + diff --git a/cm/res/res/values/config.xml b/cm/res/res/values/config.xml index b9e05d5..1b0d6a8 100644 --- a/cm/res/res/values/config.xml +++ b/cm/res/res/values/config.xml @@ -129,4 +129,7 @@ org.cyanogenmod.platform.internal.CMSystemServer + + + false diff --git a/cm/res/res/values/dimens.xml b/cm/res/res/values/dimens.xml new file mode 100644 index 0000000..4a0c278 --- /dev/null +++ b/cm/res/res/values/dimens.xml @@ -0,0 +1,22 @@ + + + + + 96dp + 24dp + 48dp + diff --git a/cm/res/res/values/strings.xml b/cm/res/res/values/strings.xml index 19e5569..8e3c4e7 100644 --- a/cm/res/res/values/strings.xml +++ b/cm/res/res/values/strings.xml @@ -226,4 +226,13 @@ Themes Customize your theme + + Starting apps\u2026 + Optimizing storage\u2026 + Preparing to start\u2026 + Optimization completed. + Preparing %1$s\u2026 + Preparing apps\u2026 + %1$d of %2$d apps + diff --git a/cm/res/res/values/symbols.xml b/cm/res/res/values/symbols.xml index 7c19dc8..c183713 100644 --- a/cm/res/res/values/symbols.xml +++ b/cm/res/res/values/symbols.xml @@ -128,4 +128,27 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sdk/src/java/org/cyanogenmod/internal/BootDexoptDialog.java b/sdk/src/java/org/cyanogenmod/internal/BootDexoptDialog.java new file mode 100644 index 0000000..89dd676 --- /dev/null +++ b/sdk/src/java/org/cyanogenmod/internal/BootDexoptDialog.java @@ -0,0 +1,173 @@ +/* + * Copyright (C) 2016 The CyanogenMod 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 org.cyanogenmod.internal; + +import android.app.Dialog; +import android.app.IActivityManager; +import android.content.Context; +import android.content.pm.ActivityInfo; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.res.Resources; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.view.accessibility.AccessibilityEvent; +import android.widget.ImageView; +import android.widget.ProgressBar; +import android.widget.TextView; + +import org.cyanogenmod.platform.internal.R; + +/** + * @hide + */ +public class BootDexoptDialog extends Dialog { + private final boolean mHideAppDetails; + + private final ImageView mAppIcon; + private final TextView mMessage; + private final TextView mDetailMsg; + private final ProgressBar mProgress; + + public static BootDexoptDialog create(Context context) { + return create(context, WindowManager.LayoutParams.TYPE_BOOT_PROGRESS); + } + + public static BootDexoptDialog create(Context context, int windowType) { + final PackageManager pm = context.getPackageManager(); + final int theme; + if (pm.hasSystemFeature(PackageManager.FEATURE_TELEVISION) + || pm.hasSystemFeature(PackageManager.FEATURE_LEANBACK)) { + theme = com.android.internal.R.style.Theme_Micro_Dialog_Alert; + } else if (pm.hasSystemFeature(PackageManager.FEATURE_WATCH)) { + theme = com.android.internal.R.style.Theme_Leanback_Dialog_Alert; + } else { + theme = com.android.internal.R.style.Theme_Material_Light; + } + + return new BootDexoptDialog(context, theme, windowType); + } + + private BootDexoptDialog(Context context, int themeResId, int windowType) { + super(context, themeResId); + mHideAppDetails = context.getResources().getBoolean( + R.bool.config_bootDexoptHideAppDetails); + + requestWindowFeature(Window.FEATURE_NO_TITLE); + if (windowType != 0) { + getWindow().setType(windowType); + } + + setContentView(R.layout.dexopt_dialog); + mMessage = (TextView) findViewById(R.id.dexopt_message); + mDetailMsg = (TextView) findViewById(R.id.dexopt_message_detail); + mAppIcon = (ImageView) findViewById(R.id.dexopt_icon); + mProgress = (ProgressBar) findViewById(R.id.dexopt_progress); + + getWindow().setLayout( + WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN + | WindowManager.LayoutParams.FLAG_FULLSCREEN); + + final WindowManager.LayoutParams lp = getWindow().getAttributes(); + // turn off button lights when dexopting + lp.buttonBrightness = 0; + lp.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_NOSENSOR; + getWindow().setAttributes(lp); + setCancelable(false); + show(); + + // start the marquee + mMessage.setSelected(true); + mDetailMsg.setSelected(true); + } + + public void setProgress(final int stage, final ApplicationInfo optimizedApp, + final int currentAppPos, final int totalAppCount) { + if (totalAppCount > 0) { + mProgress.setMax(totalAppCount); + } + + final Resources res = getContext().getResources(); + final PackageManager pm = getContext().getPackageManager(); + + if (optimizedApp != null) { + if (mHideAppDetails) { + mMessage.setText(res.getString(R.string.android_preparing_apk_obscured)); + mAppIcon.setImageResource(R.drawable.ic_dexopt_obscured); + } else { + final CharSequence label = optimizedApp.loadLabel(pm); + mMessage.setText(res.getString(R.string.android_preparing_apk, label)); + mAppIcon.setImageDrawable(optimizedApp.loadIcon(pm)); + } + mDetailMsg.setText(res.getString( + R.string.android_upgrading_apk, currentAppPos, totalAppCount)); + mProgress.setProgress(currentAppPos); + mProgress.setVisibility(View.VISIBLE); + } else { + mMessage.setText(res.getString(R.string.android_upgrading_complete)); + mAppIcon.setImageResource(R.drawable.ic_dexopt_starting); + mProgress.setVisibility(View.INVISIBLE); + + if (stage == IActivityManager.BOOT_STAGE_STARTING_APPS) { + mDetailMsg.setText(res.getString(R.string.android_upgrading_starting_apps)); + } else if (stage == IActivityManager.BOOT_STAGE_FSTRIM) { + mDetailMsg.setText(res.getString(R.string.android_upgrading_fstrim)); + } else if (stage == IActivityManager.BOOT_STAGE_COMPLETE) { + mDetailMsg.setText(res.getString(R.string.android_upgrading_complete_details)); + } else { + mDetailMsg.setText(null); + } + } + } + + // This dialog will consume all events coming in to + // it, to avoid it trying to do things too early in boot. + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + return true; + } + + @Override + public boolean dispatchKeyShortcutEvent(KeyEvent event) { + return true; + } + + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + return true; + } + + @Override + public boolean dispatchTrackballEvent(MotionEvent ev) { + return true; + } + + @Override + public boolean dispatchGenericMotionEvent(MotionEvent ev) { + return true; + } + + @Override + public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { + return true; + } +} diff --git a/system-api/cm_system-current.txt b/system-api/cm_system-current.txt index a93f52f..5a57e67 100644 --- a/system-api/cm_system-current.txt +++ b/system-api/cm_system-current.txt @@ -742,14 +742,30 @@ package cyanogenmod.platform { ctor public R.bool(); } + public static final class R.color { + ctor public R.color(); + } + + public static final class R.dimen { + ctor public R.dimen(); + } + public static final class R.drawable { ctor public R.drawable(); } + public static final class R.id { + ctor public R.id(); + } + public static final class R.integer { ctor public R.integer(); } + public static final class R.layout { + ctor public R.layout(); + } + public static final class R.string { ctor public R.string(); }