summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorspkal01 <kalligeross@gmail.com>2021-06-13 15:18:12 +0300
committerSemavi Ulusoy <doc.divxm@gmail.com>2021-09-08 23:26:42 +0300
commitdd0b881b2dbf883defbdddc5a16e87c44c1c9f7a (patch)
tree87f0ed4636ad86c45662a0b07a64a08fdc372a7e
parentd04947d7a2ab612f98c3f23a3c23b113b2073309 (diff)
VolumePanelPlugin: ShapeShift: add per app volume
Change-Id: I295bec1029f3b2a77a649220164370e4607e5879
-rw-r--r--ShapeShiftPanel/res/layout/volume_dialog_ssos_row.xml12
-rw-r--r--ShapeShiftPanel/res/values/dimens.xml4
-rw-r--r--ShapeShiftPanel/src/co/potatoproject/plugin/volume/ssos/VolumeDialogImpl.java109
3 files changed, 120 insertions, 5 deletions
diff --git a/ShapeShiftPanel/res/layout/volume_dialog_ssos_row.xml b/ShapeShiftPanel/res/layout/volume_dialog_ssos_row.xml
index e02bc80..407fcad 100644
--- a/ShapeShiftPanel/res/layout/volume_dialog_ssos_row.xml
+++ b/ShapeShiftPanel/res/layout/volume_dialog_ssos_row.xml
@@ -69,6 +69,7 @@
<com.android.plugin.volume.common.AlphaOptimizedImageButton
android:id="@+id/volume_row_icon"
style="@style/VolumeButtons"
+ android:visibility="gone"
android:layout_width="@dimen/volume_dialog_miui_tap_target_size"
android:layout_height="@dimen/volume_dialog_miui_tap_target_size"
android:layout_marginTop="-51dp"
@@ -76,6 +77,17 @@
android:clickable="false"
android:soundEffectsEnabled="false"
android:tint="@android:color/white" />
+
+ <com.android.plugin.volume.common.AlphaOptimizedImageButton
+ android:id="@+id/volume_row_app_icon"
+ style="@style/VolumeButtons"
+ android:visibility="gone"
+ android:layout_width="@dimen/volume_dialog_miui_tap_target_size"
+ android:layout_height="@dimen/volume_dialog_miui_tap_target_size"
+ android:background="@drawable/ripple_drawable_20dp"
+ android:layout_marginTop="@dimen/volume_dialog_miui_row_icon_margintop"
+ android:soundEffectsEnabled="false"
+ android:scaleType="centerInside" />
</LinearLayout>
<include layout="@layout/volume_dnd_icon_miui" />
diff --git a/ShapeShiftPanel/res/values/dimens.xml b/ShapeShiftPanel/res/values/dimens.xml
index 68c2bca..5bf5e24 100644
--- a/ShapeShiftPanel/res/values/dimens.xml
+++ b/ShapeShiftPanel/res/values/dimens.xml
@@ -40,7 +40,5 @@
<dimen name="volume_row_slider_padding_start">12dp</dimen>
<dimen name="volume_tool_tip_bottom_margin">32dp</dimen>
<dimen name="volume_tool_tip_right_margin">76dp</dimen>
- <dimen name="volume_row_app_icon_padding">1dp</dimen>
- <dimen name="volume_dialog_tap_target_app_size">38dip</dimen>
- <dimen name="volume_dialog_app_row_icon_margintop">-50dp</dimen>
+ <dimen name="volume_row_app_icon_padding">8dp</dimen>
</resources>
diff --git a/ShapeShiftPanel/src/co/potatoproject/plugin/volume/ssos/VolumeDialogImpl.java b/ShapeShiftPanel/src/co/potatoproject/plugin/volume/ssos/VolumeDialogImpl.java
index 6a28aa6..0bedee7 100644
--- a/ShapeShiftPanel/src/co/potatoproject/plugin/volume/ssos/VolumeDialogImpl.java
+++ b/ShapeShiftPanel/src/co/potatoproject/plugin/volume/ssos/VolumeDialogImpl.java
@@ -50,6 +50,7 @@ import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.TypedArray;
+import android.database.ContentObserver;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.graphics.Rect;
@@ -57,6 +58,7 @@ import android.graphics.Region;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.PorterDuff;
+import android.media.AppTrackData;
import android.media.AudioManager;
import android.media.AudioSystem;
import android.media.MediaMetadata;
@@ -67,6 +69,7 @@ import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.SystemClock;
+import android.os.UserHandle;
import android.os.VibrationEffect;
import android.provider.Settings;
import android.provider.Settings.Global;
@@ -190,7 +193,10 @@ public class VolumeDialogImpl extends PanelSideAware implements VolumeDialog {
private ViewStub mODICaptionsTooltipViewStub;
private View mODICaptionsTooltipView = null;
+ private SettingsObserver settingsObserver;
private boolean mExpanded;
+ private final List<VolumeRow> mAppRows = new ArrayList<>();
+ private boolean mAppVolume;
public VolumeDialogImpl() {}
@@ -207,7 +213,9 @@ public class VolumeDialogImpl extends PanelSideAware implements VolumeDialog {
mShowActiveStreamOnly = showActiveStreamOnly();
mHasSeenODICaptionsTooltip = true;
initObserver(pluginContext, sysuiContext);
-}
+ settingsObserver = new SettingsObserver(mHandler);
+ settingsObserver.observe();
+ }
public void init(int windowType, Callback callback) {
initDialog();
@@ -222,6 +230,7 @@ public class VolumeDialogImpl extends PanelSideAware implements VolumeDialog {
public void destroy() {
mController.removeCallback(mControllerCallbackH);
mHandler.removeCallbacksAndMessages(null);
+ settingsObserver.unobserve();
}
@Override
@@ -364,6 +373,34 @@ public class VolumeDialogImpl extends PanelSideAware implements VolumeDialog {
initODICaptionsH();
}
+ private class SettingsObserver extends ContentObserver {
+ SettingsObserver(Handler handler) {
+ super(handler);
+ }
+
+ void unobserve() {
+ mContext.getContentResolver().unregisterContentObserver(this);
+ }
+
+ void observe() {
+ mContext.getContentResolver().registerContentObserver(Settings.Secure.getUriFor(Settings.Secure.SHOW_APP_VOLUME), false, this, UserHandle.USER_ALL);
+ update();
+ }
+
+
+ @Override
+ public void onChange(boolean selfChange) {
+ update();
+ initDialog();
+ }
+
+
+ public void update() {
+ mAppVolume = Settings.Secure.getIntForUser(mContext.getContentResolver(), Settings.Secure.SHOW_APP_VOLUME, 0, UserHandle.USER_CURRENT) == 1;
+
+ }
+ }
+
private final OnComputeInternalInsetsListener mInsetsListener = internalInsetsInfo -> {
internalInsetsInfo.touchableRegion.setEmpty();
internalInsetsInfo.setTouchableInsets(InternalInsetsInfo.TOUCHABLE_INSETS_REGION);
@@ -430,6 +467,41 @@ public class VolumeDialogImpl extends PanelSideAware implements VolumeDialog {
mRows.add(row);
}
+ private void addAppRow(AppTrackData data) {
+ VolumeRow row = new VolumeRow();
+ initAppRow(row, data);
+ mDialogRowsView.addView(row.view);
+ mAppRows.add(row);
+ }
+
+ @SuppressLint("InflateParams")
+ private void initAppRow(final VolumeRow row, final AppTrackData data) {
+ row.view = LayoutInflater.from(mContext).inflate(R.layout.volume_dialog_ssos_row, null);
+
+ row.packageName = data.getPackageName();
+ row.isAppVolumeRow = true;
+
+ row.view.setTag(row);
+ row.slider = row.view.findViewById(R.id.volume_row_slider);
+ row.slider.setOnSeekBarChangeListener(new VolumeSeekBarChangeListener(row));
+
+ row.appMuted = data.isMuted();
+ row.slider.setProgress((int) (data.getVolume() * 100));
+
+ row.dndIcon = row.view.findViewById(R.id.dnd_icon);
+ row.dndIcon.setVisibility(View.GONE);
+
+ row.icon = row.view.findViewById(R.id.volume_row_app_icon);
+ row.icon.setVisibility(View.VISIBLE);
+ PackageManager pm = mContext.getPackageManager();
+ try {
+ row.icon.setImageDrawable(pm.getApplicationIcon(row.packageName));
+ } catch (PackageManager.NameNotFoundException e) {
+ row.icon.setImageDrawable(pm.getDefaultActivityIcon());
+ Log.e(TAG, "Failed to get icon of " + row.packageName, e);
+ }
+ }
+
private void addExistingRows() {
int N = mRows.size();
for (int i = 0; i < N; i++) {
@@ -530,6 +602,7 @@ public class VolumeDialogImpl extends PanelSideAware implements VolumeDialog {
row.icon = row.view.findViewById(R.id.volume_row_icon);
Drawable iconResDrawable = mSysUIContext.getDrawable(iconRes);
+ row.icon.setVisibility(View.VISIBLE);
row.icon.setImageDrawable(iconResDrawable);
row.icon.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO);
row.icon.setClickable(false);
@@ -615,11 +688,32 @@ public class VolumeDialogImpl extends PanelSideAware implements VolumeDialog {
mExpanded = false;
updateOutputSwitcherVisibility();
}
+ if (mAppVolume) {
+ updateAppRows();
+ }
mExpandRows.setExpanded(mExpanded);
});
}
}
+ private void updateAppRows() {
+ for (int i = mAppRows.size() - 1; i >= 0; i--) {
+ final VolumeRow row = mAppRows.get(i);
+ removeAppRow(row);
+ }
+ List<AppTrackData> trackDatas = mController.getAudioManager().listAppTrackDatas();
+ for (AppTrackData data : trackDatas) {
+ if (data.isActive()) {
+ addAppRow(data);
+ }
+ }
+ }
+
+ private void removeAppRow(VolumeRow volumeRow) {
+ mAppRows.remove(volumeRow);
+ mDialogRowsView.removeView(volumeRow.view);
+ }
+
public void initRingerH() {
if (mRingerIcon != null) {
mRingerIcon.setAccessibilityLiveRegion(ACCESSIBILITY_LIVE_REGION_POLITE);
@@ -1548,9 +1642,13 @@ public class VolumeDialogImpl extends PanelSideAware implements VolumeDialog {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
rescheduleTimeoutH();
- if (mRow.ss == null) return;
if (D.BUG) Log.d(TAG, AudioSystem.streamToString(mRow.stream)
+ " onProgressChanged " + progress + " fromUser=" + fromUser);
+ if (mRow.isAppVolumeRow) {
+ mController.getAudioManager().setAppVolume(mRow.packageName, progress * 0.01f);
+ return;
+ }
+ if (mRow.ss == null) return;
if (!fromUser) return;
if (mRow.ss.levelMin > 0) {
final int minProgress = mRow.ss.levelMin * 100;
@@ -1581,6 +1679,8 @@ public class VolumeDialogImpl extends PanelSideAware implements VolumeDialog {
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
+ mRow.tracking = true;
+ if (mRow.isAppVolumeRow) return;
if (D.BUG) Log.d(TAG, "onStartTrackingTouch"+ " " + mRow.stream);
mController.setActiveStream(mRow.stream);
mRow.tracking = true;
@@ -1590,6 +1690,7 @@ public class VolumeDialogImpl extends PanelSideAware implements VolumeDialog {
public void onStopTrackingTouch(SeekBar seekBar) {
if (D.BUG) Log.d(TAG, "onStopTrackingTouch"+ " " + mRow.stream);
mRow.tracking = false;
+ if (mRow.isAppVolumeRow) return;
mRow.userAttempt = SystemClock.uptimeMillis();
final int userLevel = getImpliedLevel(seekBar, seekBar.getProgress());
Events.writeEvent(Events.EVENT_TOUCH_LEVEL_DONE, mRow.stream, userLevel);
@@ -1644,5 +1745,9 @@ public class VolumeDialogImpl extends PanelSideAware implements VolumeDialog {
private int animTargetProgress;
private int lastAudibleLevel = 2;
private FrameLayout dndIcon;
+ /* for change app's volume */
+ private String packageName;
+ private boolean isAppVolumeRow = false;
+ private boolean appMuted;
}
}